]> xenbits.xensource.com Git - people/liuw/mini-os.git/commitdiff
minios: fix add_id_to_freelist(0)
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 20 Jun 2008 16:45:23 +0000 (17:45 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 20 Jun 2008 16:45:23 +0000 (17:45 +0100)
add_id_to_freelist(0) would make get_id_from_freelist() always return 0.

Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com>
fs-front.c
netfront.c

index 0b27df361bf40ac7e4a9bc7fc947bcbacbc42133..3320b879f0bc866309c028c00fbd30e1fd617e48 100644 (file)
@@ -136,8 +136,8 @@ static inline void add_id_to_freelist(unsigned int id,unsigned short* freelist)
 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 @@ static inline unsigned short get_id_from_freelist(unsigned short* freelist)
 
 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 @@ static void alloc_request_table(struct fs_import *import)
     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 */
index d01ce6927b2373560000201f06b627786c6867a9..3fff0accddce09668c127ea9de1f53bbbdb8bd91 100644 (file)
@@ -38,7 +38,7 @@ struct net_buffer {
 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 @@ void init_rx_buffers(struct netfront_dev *dev);
 
 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;
 }