[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 10/11] mini-os/xenbus: Provide queue->wakeup hook
Ian Jackson, le Fri 20 Jun 2014 20:04:49 +0100, a écrit : > This allows xenbus's caller to get called back when an item is put on > the queue, rather than simply having the waitq signaled. Mmm, so the callback will be made with lock held, is that not a problem in the use you plan? Although I don't usually like callbacks precisely for that kind of reason, I'm not against it, but it should at least be documented. > Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> > --- > include/mini-os/xenbus.h | 15 +++++++++++++++ > xen/xenbus/xenbus.c | 8 +++++++- > 2 files changed, 22 insertions(+), 1 deletion(-) > > diff --git a/include/mini-os/xenbus.h b/include/mini-os/xenbus.h > index a811c19..1900e55 100644 > --- a/include/mini-os/xenbus.h > +++ b/include/mini-os/xenbus.h > @@ -46,6 +46,7 @@ struct xenbus_event { > }; > struct xenbus_event_queue { > MINIOS_STAILQ_HEAD(, xenbus_event) events; > + void (*wakeup)(struct xenbus_event_queue*); /* can be safely ignored */ > struct wait_queue_head waitq; > }; > > @@ -129,6 +130,20 @@ domid_t xenbus_get_self_id(void); > * ----- asynchronous low-level interface ----- > */ > > +/* > + * Use of queue->wakeup: > + * > + * If queue->wakeup is set, it will be called instead of > + * wake_up(&queue->waitq); > + * > + * queue->wakeup is initialised (to a function which just calls > + * wake_up) by xenbus_event_queue_init. The user who wants something > + * different should set ->wakeup after the init, but before the queue > + * is used for xenbus_id_allocate or xenbus_watch_prepare. > + * > + * queue->wakeup() is called with the req_lock held. > + */ > + > /* Allocate an identifier for a xenbus request. Blocks if none are > * available. Cannot fail. On return, we may use the returned value > * as the id in a xenbus request. > diff --git a/xen/xenbus/xenbus.c b/xen/xenbus/xenbus.c > index 7b391c5..e5d7f36 100644 > --- a/xen/xenbus/xenbus.c > +++ b/xen/xenbus/xenbus.c > @@ -67,9 +67,15 @@ spinlock_t xenbus_req_lock = SPIN_LOCK_UNLOCKED; > * watches > */ > > +static void queue_wakeup(struct xenbus_event_queue *queue) > +{ > + wake_up(&queue->waitq); > +} > + > void xenbus_event_queue_init(struct xenbus_event_queue *queue) > { > MINIOS_STAILQ_INIT(&queue->events); > + queue->wakeup = queue_wakeup; > init_waitqueue_head(&queue->waitq); > } > > @@ -92,7 +98,7 @@ static void queue_event(struct xenbus_event_queue *queue, > { > /* Called with lock held */ > MINIOS_STAILQ_INSERT_TAIL(&queue->events, event, entry); > - wake_up(&queue->waitq); > + queue->wakeup(queue); > } > > static struct xenbus_event *await_event(struct xenbus_event_queue *queue) > -- > 1.7.10.4 > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > http://lists.xen.org/xen-devel > -- Samuel <m> argh, pi est plus grand que 2. Ca casse tout -+- #ens-mim -+- _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |