[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 04/11] mini-os/xenbus: Change type of xenbus_event_queue
Ian Jackson, le Fri 20 Jun 2014 20:04:43 +0100, a écrit : > We change xenbus_event_queue from a pointer typedef to a struct, for > two reasons: > > 1. In a moment we are going to want to extend this struct to include > a minios scheduler wait queue. > > 2. We can replace the open-coded list with a MINIOS_STAILQ. > > All the xenbus users need to call the new initialisation function > instead of simply initialising the struct to NULL, and have their > parameter type changed. > > There is a functional side-effect: now we are using a tail queue, > rather than a tailless queue, we insert events at the end rather than > the beginning. So watch events now come out in chronological order, > rather than their order possibly being scrambled in the queue. > > Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> Acked-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx> > --- > include/mini-os/console.h | 2 +- > include/mini-os/xenbus.h | 22 +++++++++++++--------- > xen/blkfront.c | 4 ++-- > xen/console/xenbus.c | 2 +- > xen/netfront.c | 4 ++-- > xen/pcifront.c | 7 ++++--- > xen/xenbus/xenbus.c | 31 +++++++++++++++++++------------ > 7 files changed, 42 insertions(+), 30 deletions(-) > > diff --git a/include/mini-os/console.h b/include/mini-os/console.h > index 1b04b13..49990b9 100644 > --- a/include/mini-os/console.h > +++ b/include/mini-os/console.h > @@ -56,7 +56,7 @@ struct consfront_dev { > char *nodename; > char *backend; > > - xenbus_event_queue events; > + struct xenbus_event_queue events; > > }; > > diff --git a/include/mini-os/xenbus.h b/include/mini-os/xenbus.h > index f3594cb..4dad4c8 100644 > --- a/include/mini-os/xenbus.h > +++ b/include/mini-os/xenbus.h > @@ -2,6 +2,7 @@ > #define MINIOS_XENBUS_H__ > > #include <xen/io/xenbus.h> > +#include <mini-os/queue.h> > > typedef unsigned long xenbus_transaction_t; > #define XBT_NIL ((xenbus_transaction_t)0) > @@ -25,22 +26,25 @@ struct xenbus_event { > /* Keep these two as this for xs.c */ > char *path; > char *token; > - struct xenbus_event *next; > + MINIOS_STAILQ_ENTRY(xenbus_event) entry; > }; > -typedef struct xenbus_event *xenbus_event_queue; > +struct xenbus_event_queue { > + MINIOS_STAILQ_HEAD(, xenbus_event) events; > +}; > + > +void xenbus_event_queue_init(struct xenbus_event_queue *queue); > > -char *xenbus_watch_path_token(xenbus_transaction_t xbt, const char *path, > const char *token, xenbus_event_queue *events); > +char *xenbus_watch_path_token(xenbus_transaction_t xbt, const char *path, > const char *token, struct xenbus_event_queue *events); > char *xenbus_unwatch_path_token(xenbus_transaction_t xbt, const char *path, > const char *token); > -extern struct wait_queue_head xenbus_watch_queue; > -void xenbus_wait_for_watch(xenbus_event_queue *queue); > -char **xenbus_wait_for_watch_return(xenbus_event_queue *queue); > -char* xenbus_wait_for_value(const char *path, const char *value, > xenbus_event_queue *queue); > -char *xenbus_wait_for_state_change(const char* path, XenbusState *state, > xenbus_event_queue *queue); > +void xenbus_wait_for_watch(struct xenbus_event_queue *queue); > +char **xenbus_wait_for_watch_return(struct xenbus_event_queue *queue); > +char* xenbus_wait_for_value(const char *path, const char *value, struct > xenbus_event_queue *queue); > +char *xenbus_wait_for_state_change(const char* path, XenbusState *state, > struct xenbus_event_queue *queue); > char *xenbus_switch_state(xenbus_transaction_t xbt, const char* path, > XenbusState state); > > /* When no token is provided, use a global queue. */ > #define XENBUS_WATCH_PATH_TOKEN "xenbus_watch_path" > -extern xenbus_event_queue xenbus_events; > +extern struct xenbus_event_queue xenbus_events; > #define xenbus_watch_path(xbt, path) xenbus_watch_path_token(xbt, path, > XENBUS_WATCH_PATH_TOKEN, NULL) > #define xenbus_unwatch_path(xbt, path) xenbus_unwatch_path_token(xbt, path, > XENBUS_WATCH_PATH_TOKEN) > > diff --git a/xen/blkfront.c b/xen/blkfront.c > index 347c68c..a5da53d 100644 > --- a/xen/blkfront.c > +++ b/xen/blkfront.c > @@ -47,7 +47,7 @@ struct blkfront_dev { > char *backend; > struct blkfront_info info; > > - xenbus_event_queue events; > + struct xenbus_event_queue events; > > }; > > @@ -103,7 +103,7 @@ struct blkfront_dev *init_blkfront(char *_nodename, > struct blkfront_info *info) > > dev->ring_ref = gnttab_grant_access(dev->dom,virt_to_mfn(s),0); > > - dev->events = NULL; > + xenbus_event_queue_init(&dev->events); > > again: > err = xenbus_transaction_start(&xbt); > diff --git a/xen/console/xenbus.c b/xen/console/xenbus.c > index d848af8..a164314 100644 > --- a/xen/console/xenbus.c > +++ b/xen/console/xenbus.c > @@ -96,7 +96,7 @@ struct consfront_dev *init_consfront(char *_nodename) > memset(dev->ring, 0, PAGE_SIZE); > dev->ring_ref = gnttab_grant_access(dev->dom, virt_to_mfn(dev->ring), 0); > > - dev->events = NULL; > + xenbus_event_queue_init(&dev->events); > > again: > err = xenbus_transaction_start(&xbt); > diff --git a/xen/netfront.c b/xen/netfront.c > index 9e17a86..a89a0dd 100644 > --- a/xen/netfront.c > +++ b/xen/netfront.c > @@ -51,7 +51,7 @@ struct netfront_dev { > char *backend; > char *mac; > > - xenbus_event_queue events; > + struct xenbus_event_queue events; > > > void (*netif_rx)(struct netfront_dev *, unsigned char* data, int len); > @@ -313,7 +313,7 @@ struct netfront_dev *init_netfront(char *_nodename, void > (*thenetif_rx)(struct n > > dev->netif_rx = thenetif_rx; > > - dev->events = NULL; > + xenbus_event_queue_init(&dev->events); > > again: > err = xenbus_transaction_start(&xbt); > diff --git a/xen/pcifront.c b/xen/pcifront.c > index 6f52b77..7bd3788 100644 > --- a/xen/pcifront.c > +++ b/xen/pcifront.c > @@ -31,7 +31,7 @@ struct pcifront_dev { > char *nodename; > char *backend; > > - xenbus_event_queue events; > + struct xenbus_event_queue events; > }; > > void pcifront_handler(evtchn_port_t port, struct pt_regs *regs, void *data) > @@ -64,7 +64,8 @@ void pcifront_watches(void *opaque) > char* nodename = opaque ? opaque : "device/pci/0"; > char path[strlen(nodename) + 9]; > char fe_state[strlen(nodename) + 7]; > - xenbus_event_queue events = NULL; > + struct xenbus_event_queue events; > + xenbus_event_queue_init(&events); > > snprintf(path, sizeof(path), "%s/backend", nodename); > snprintf(fe_state, sizeof(fe_state), "%s/state", nodename); > @@ -174,7 +175,7 @@ struct pcifront_dev *init_pcifront(char *_nodename) > > dev->info_ref = gnttab_grant_access(dev->dom,virt_to_mfn(dev->info),0); > > - dev->events = NULL; > + xenbus_event_queue_init(&dev->events); > > again: > err = xenbus_transaction_start(&xbt); > diff --git a/xen/xenbus/xenbus.c b/xen/xenbus/xenbus.c > index a06dc30..8a14c3b 100644 > --- a/xen/xenbus/xenbus.c > +++ b/xen/xenbus/xenbus.c > @@ -48,10 +48,10 @@ static DECLARE_WAIT_QUEUE_HEAD(xb_waitq); > static spinlock_t xb_lock = SPIN_LOCK_UNLOCKED; /* protects xenbus req ring > */ > DECLARE_WAIT_QUEUE_HEAD(xenbus_watch_queue); > > -xenbus_event_queue xenbus_events; > +struct xenbus_event_queue xenbus_events; > static struct watch { > char *token; > - xenbus_event_queue *events; > + struct xenbus_event_queue *events; > struct watch *next; > } *watches; > struct xenbus_req_info > @@ -61,6 +61,13 @@ struct xenbus_req_info > void *reply; > }; > > + > +void xenbus_event_queue_init(struct xenbus_event_queue *queue) > +{ > + MINIOS_STAILQ_INIT(&queue->events); > +} > + > + > #define NR_REQS 32 > static struct xenbus_req_info req_info[NR_REQS]; > > @@ -78,22 +85,22 @@ static void memcpy_from_ring(const void *Ring, > memcpy(dest + c1, ring, c2); > } > > -char **xenbus_wait_for_watch_return(xenbus_event_queue *queue) > +char **xenbus_wait_for_watch_return(struct xenbus_event_queue *queue) > { > struct xenbus_event *event; > DEFINE_WAIT(w); > if (!queue) > queue = &xenbus_events; > - while (!(event = *queue)) { > + while (!(event = MINIOS_STAILQ_FIRST(&queue->events))) { > add_waiter(w, xenbus_watch_queue); > schedule(); > } > remove_waiter(w, xenbus_watch_queue); > - *queue = event->next; > + MINIOS_STAILQ_REMOVE_HEAD(&queue->events, entry); > return &event->path; > } > > -void xenbus_wait_for_watch(xenbus_event_queue *queue) > +void xenbus_wait_for_watch(struct xenbus_event_queue *queue) > { > char **ret; > if (!queue) > @@ -105,7 +112,7 @@ void xenbus_wait_for_watch(xenbus_event_queue *queue) > printk("unexpected path returned by watch\n"); > } > > -char* xenbus_wait_for_value(const char* path, const char* value, > xenbus_event_queue *queue) > +char* xenbus_wait_for_value(const char* path, const char* value, struct > xenbus_event_queue *queue) > { > if (!queue) > queue = &xenbus_events; > @@ -168,7 +175,7 @@ exit: > return msg; > } > > -char *xenbus_wait_for_state_change(const char* path, XenbusState *state, > xenbus_event_queue *queue) > +char *xenbus_wait_for_state_change(const char* path, XenbusState *state, > struct xenbus_event_queue *queue) > { > if (!queue) > queue = &xenbus_events; > @@ -227,7 +234,7 @@ static void xenbus_thread_func(void *ign) > if(msg.type == XS_WATCH_EVENT) > { > struct xenbus_event *event = malloc(sizeof(*event) + msg.len); > - xenbus_event_queue *events = NULL; > + struct xenbus_event_queue *events = NULL; > char *data = (char*)event + sizeof(*event); > struct watch *watch; > > @@ -248,8 +255,7 @@ static void xenbus_thread_func(void *ign) > } > > if (events) { > - event->next = *events; > - *events = event; > + MINIOS_STAILQ_INSERT_TAIL(&events->events, event, entry); > wake_up(&xenbus_watch_queue); > } else { > printk("unexpected watch token %s\n", event->token); > @@ -332,6 +338,7 @@ void init_xenbus(void) > { > int err; > DEBUG("init_xenbus called.\n"); > + xenbus_event_queue_init(&xenbus_events); > xenstore_buf = mfn_to_virt(start_info.store_mfn); > create_thread("xenstore", xenbus_thread_func, NULL); > DEBUG("buf at %p.\n", xenstore_buf); > @@ -561,7 +568,7 @@ char *xenbus_write(xenbus_transaction_t xbt, const char > *path, const char *value > return NULL; > } > > -char* xenbus_watch_path_token( xenbus_transaction_t xbt, const char *path, > const char *token, xenbus_event_queue *events) > +char* xenbus_watch_path_token( xenbus_transaction_t xbt, const char *path, > const char *token, struct xenbus_event_queue *events) > { > struct xsd_sockmsg *rep; > > -- > 1.7.10.4 > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > http://lists.xen.org/xen-devel > -- Samuel <P> moo <N> moo ? <D> P: keski t'arrive? :)) <P> moooo <N> moooooo ? <P> rien le net marche je suis content :) -+- #ens-mim - accro du net -+- _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |