[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.