minios: fix add_id_to_freelist(0)
PATCH 1/1 minios: fix add_id_to_freelist(0)
minios: fix add_id_to_freelist(0)
add_id_to_freelist(0) would make get_id_from_freelist() always return 0.
Signed-off-by Samuel Thibault <[email protected]>
extras/mini-os/fs-front.c +5 -5
@@ -136,8 +136,8 @@ again: old_id = freelist[0 ];/* Note: temporal inconsistency, since freelist[0] can be changed by someone -* else, but we are a sole owner of freelist[id], it's OK. */ - freelist[id] = old_id; +* else, but we are a sole owner of freelist[id + 1], it's OK. */ + freelist[id +1 ] = old_id; new_id = id;if (cmpxchg (&freelist[0 ], old_id, new_id) != old_id) {
@@ -154,7 +154,7 @@ again: old_id = freelist[0 ]; - new_id = freelist[old_id]; + new_id = freelist[old_id +1 ];if (cmpxchg (&freelist[0 ], old_id, new_id) != old_id) {printk ("Cmpxchg on freelist remove failed.\n" );
@@ -785,8 +785,8 @@printk ("Allocating request array for import %d, nr_entries = %d.\n" , import->import_id, import->nr_entries); requests = xmalloc_array(struct fs_request, import->nr_entries); - import->freelist = xmalloc_array(unsigned short, import->nr_entries); -memset (import->freelist,0 ,sizeof (unsigned short ) * import->nr_entries); + import->freelist = xmalloc_array(unsigned short, import->nr_entries + 1); +memset (import->freelist,0 ,sizeof (unsigned short ) * (import->nr_entries +1 ));for (i=0 ; i<import->nr_entries; i++) {/* TODO: that's a lot of memory */
extras/mini-os/netfront.c +3 -3
@@ -38,7 +38,7 @@struct netfront_dev {domid_t dom; -unsigned short tx_freelist[NET_TX_RING_SIZE ]; +unsigned short tx_freelist[NET_TX_RING_SIZE +1 ];struct semaphore tx_sem;struct net_buffer rx_buffers[NET_RX_RING_SIZE ];
@@ -70,14 +70,14 @@static inline void add_id_to_freelist (unsigned int id,unsigned short * freelist) { - freelist[id] = freelist[0 ]; + freelist[id +1 ] = freelist[0 ]; freelist[0 ] = id; }static inline unsigned short get_id_from_freelist (unsigned short * freelist) {unsigned int id = freelist[0 ]; - freelist[0 ] = freelist[id]; + freelist[0 ] = freelist[id +1 ];return id; }
Hello,
Is there anything against that patch?
Samuel
Quoted 69 lines · Samuel Thibault, le Wed 18 Jun 2008 12:29:10 +0100, a écrit :
minios: fix
add_id_to_freelist(0)
add_id_to_freelist(0)would makeget_id_from_freelist()always return 0.Signed-off-by Samuel Thibault <[email protected]>diff -r
78f90b0f707fextras/mini-os/fs-front.cextras/mini-os/fs-front.c +5
-5@@ -136,8 +136,8 @@ again: old_id = freelist[0 ];/* Note: temporal inconsistency, since freelist[0] can be changed by someone -* else, but we are a sole owner of freelist[id], it's OK. */ - freelist[id] = old_id; +* else, but we are a sole owner of freelist[id + 1], it's OK. */ + freelist[id +1 ] = old_id; new_id = id;if (cmpxchg (&freelist[0 ], old_id, new_id) != old_id) {@@ -154,7 +154,7 @@ again: old_id = freelist[0 ]; - new_id = freelist[old_id]; + new_id = freelist[old_id +1 ];if (cmpxchg (&freelist[0 ], old_id, new_id) != old_id) {printk ("Cmpxchg on freelist remove failed.\n" );@@ -785,8 +785,8 @@printk ("Allocating request array for import %d, nr_entries = %d.\n" , import->import_id, import->nr_entries); requests = xmalloc_array(struct fs_request, import->nr_entries); - import->freelist = xmalloc_array(unsigned short, import->nr_entries); -memset (import->freelist,0 ,sizeof (unsigned short ) * import->nr_entries); + import->freelist = xmalloc_array(unsigned short, import->nr_entries + 1); +memset (import->freelist,0 ,sizeof (unsigned short ) * (import->nr_entries +1 ));for (i=0 ; i<import->nr_entries; i++) {/* TODO: that's a lot of memory */ diff -r
78f90b0f707fextras/mini-os/netfront.cextras/mini-os/netfront.c +3
-3@@ -38,7 +38,7 @@struct netfront_dev {domid_t dom; -unsigned short tx_freelist[NET_TX_RING_SIZE ]; +unsigned short tx_freelist[NET_TX_RING_SIZE +1 ];struct semaphore tx_sem;struct net_buffer rx_buffers[NET_RX_RING_SIZE ];@@ -70,14 +70,14 @@static inline void add_id_to_freelist (unsigned int id,unsigned short * freelist) { - freelist[id] = freelist[0 ]; + freelist[id +1 ] = freelist[0 ]; freelist[0 ] = id; }static inline unsigned short get_id_from_freelist (unsigned short * freelist) {unsigned int id = freelist[0 ]; - freelist[0 ] = freelist[id]; + freelist[0 ] = freelist[id +1 ];return id; }
Signature · 3 lines
Samuel <P> je sens venir la fonte 14 pour le rapport -+- #ens-mim -+-