From: Keir Fraser Date: Fri, 20 Jun 2008 16:45:23 +0000 (+0100) Subject: minios: fix add_id_to_freelist(0) X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14192^2~39 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=639f3f1a2274add4a4d66e2819e424b19751e1b4;p=xen.git 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 --- diff --git a/extras/mini-os/fs-front.c b/extras/mini-os/fs-front.c index 0b27df361b..3320b879f0 100644 --- a/extras/mini-os/fs-front.c +++ b/extras/mini-os/fs-front.c @@ -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; inr_entries; i++) { /* TODO: that's a lot of memory */ diff --git a/extras/mini-os/netfront.c b/extras/mini-os/netfront.c index d01ce6927b..3fff0accdd 100644 --- a/extras/mini-os/netfront.c +++ b/extras/mini-os/netfront.c @@ -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; }