All of lore.kernel.org
 help / color / mirror / Atom feed
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Bob Liu <bob.liu@oracle.com>, axboe@fb.com
Cc: xen-devel@lists.xenproject.org, boris.ostrovsky@oracle.com,
	jennifer.herbert@citrix.com, david.vrabel@citrix.com,
	roger.pau@citrix.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/2] xen/grant: introduce func gnttab_unmap_refs_async_wait_completion()
Date: Thu, 26 Mar 2015 15:01:49 -0400	[thread overview]
Message-ID: <20150326190149.GC31979@l.oracle.com> (raw)
In-Reply-To: <1427372161-4964-2-git-send-email-bob.liu@oracle.com>

On Thu, Mar 26, 2015 at 08:16:01PM +0800, Bob Liu wrote:
> There are several place using gnttab async unmap and wait for
> completion, so move the common code to a function
> gnttab_unmap_refs_async_wait_completion().
> 
> Signed-off-by: Bob Liu <bob.liu@oracle.com>

Jens, and would you be OK if this patch went through the Xen tree?

Thanks.
> ---
>  drivers/block/xen-blkback/blkback.c | 31 +++----------------------------
>  drivers/xen/gntdev.c                | 28 +++-------------------------
>  drivers/xen/grant-table.c           | 29 +++++++++++++++++++++++++++++
>  include/xen/grant_table.h           |  1 +
>  4 files changed, 36 insertions(+), 53 deletions(-)
> 
> diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
> index f59d7c3..0c8da82 100644
> --- a/drivers/block/xen-blkback/blkback.c
> +++ b/drivers/block/xen-blkback/blkback.c
> @@ -263,17 +263,6 @@ static void put_persistent_gnt(struct xen_blkif *blkif,
>  	atomic_dec(&blkif->persistent_gnt_in_use);
>  }
>  
> -static void free_persistent_gnts_unmap_callback(int result,
> -						struct gntab_unmap_queue_data *data)
> -{
> -	struct completion *c = data->data;
> -
> -	/* BUG_ON used to reproduce existing behaviour,
> -	   but is this the best way to deal with this? */
> -	BUG_ON(result);
> -	complete(c);
> -}
> -
>  static void free_persistent_gnts(struct xen_blkif *blkif, struct rb_root *root,
>                                   unsigned int num)
>  {
> @@ -283,12 +272,7 @@ static void free_persistent_gnts(struct xen_blkif *blkif, struct rb_root *root,
>  	struct rb_node *n;
>  	int segs_to_unmap = 0;
>  	struct gntab_unmap_queue_data unmap_data;
> -	struct completion unmap_completion;
> -
> -	init_completion(&unmap_completion);
>  
> -	unmap_data.data = &unmap_completion;
> -	unmap_data.done = &free_persistent_gnts_unmap_callback;
>  	unmap_data.pages = pages;
>  	unmap_data.unmap_ops = unmap;
>  	unmap_data.kunmap_ops = NULL;
> @@ -308,8 +292,7 @@ static void free_persistent_gnts(struct xen_blkif *blkif, struct rb_root *root,
>  			!rb_next(&persistent_gnt->node)) {
>  
>  			unmap_data.count = segs_to_unmap;
> -			gnttab_unmap_refs_async(&unmap_data);
> -			wait_for_completion(&unmap_completion);
> +			BUG_ON(gnttab_unmap_refs_async_wait_completion(&unmap_data));
>  
>  			put_free_pages(blkif, pages, segs_to_unmap);
>  			segs_to_unmap = 0;
> @@ -330,12 +313,7 @@ void xen_blkbk_unmap_purged_grants(struct work_struct *work)
>  	int segs_to_unmap = 0;
>  	struct xen_blkif *blkif = container_of(work, typeof(*blkif), persistent_purge_work);
>  	struct gntab_unmap_queue_data unmap_data;
> -	struct completion unmap_completion;
>  
> -	init_completion(&unmap_completion);
> -
> -	unmap_data.data = &unmap_completion;
> -	unmap_data.done = &free_persistent_gnts_unmap_callback;
>  	unmap_data.pages = pages;
>  	unmap_data.unmap_ops = unmap;
>  	unmap_data.kunmap_ops = NULL;
> @@ -355,9 +333,7 @@ void xen_blkbk_unmap_purged_grants(struct work_struct *work)
>  
>  		if (++segs_to_unmap == BLKIF_MAX_SEGMENTS_PER_REQUEST) {
>  			unmap_data.count = segs_to_unmap;
> -			gnttab_unmap_refs_async(&unmap_data);
> -			wait_for_completion(&unmap_completion);
> -
> +			BUG_ON(gnttab_unmap_refs_async_wait_completion(&unmap_data));
>  			put_free_pages(blkif, pages, segs_to_unmap);
>  			segs_to_unmap = 0;
>  		}
> @@ -365,8 +341,7 @@ void xen_blkbk_unmap_purged_grants(struct work_struct *work)
>  	}
>  	if (segs_to_unmap > 0) {
>  		unmap_data.count = segs_to_unmap;
> -		gnttab_unmap_refs_async(&unmap_data);
> -		wait_for_completion(&unmap_completion);
> +		BUG_ON(gnttab_unmap_refs_async_wait_completion(&unmap_data));
>  		put_free_pages(blkif, pages, segs_to_unmap);
>  	}
>  }
> diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
> index d5bb1a3..7a88524 100644
> --- a/drivers/xen/gntdev.c
> +++ b/drivers/xen/gntdev.c
> @@ -327,30 +327,10 @@ static int map_grant_pages(struct grant_map *map)
>  	return err;
>  }
>  
> -struct unmap_grant_pages_callback_data
> -{
> -	struct completion completion;
> -	int result;
> -};
> -
> -static void unmap_grant_callback(int result,
> -				 struct gntab_unmap_queue_data *data)
> -{
> -	struct unmap_grant_pages_callback_data* d = data->data;
> -
> -	d->result = result;
> -	complete(&d->completion);
> -}
> -
>  static int __unmap_grant_pages(struct grant_map *map, int offset, int pages)
>  {
>  	int i, err = 0;
>  	struct gntab_unmap_queue_data unmap_data;
> -	struct unmap_grant_pages_callback_data data;
> -
> -	init_completion(&data.completion);
> -	unmap_data.data = &data;
> -	unmap_data.done= &unmap_grant_callback;
>  
>  	if (map->notify.flags & UNMAP_NOTIFY_CLEAR_BYTE) {
>  		int pgno = (map->notify.addr >> PAGE_SHIFT);
> @@ -367,11 +347,9 @@ static int __unmap_grant_pages(struct grant_map *map, int offset, int pages)
>  	unmap_data.pages = map->pages + offset;
>  	unmap_data.count = pages;
>  
> -	gnttab_unmap_refs_async(&unmap_data);
> -
> -	wait_for_completion(&data.completion);
> -	if (data.result)
> -		return data.result;
> +	err = gnttab_unmap_refs_async_wait_completion(&unmap_data);
> +	if (err)
> +		return err;
>  
>  	for (i = 0; i < pages; i++) {
>  		if (map->unmap_ops[offset+i].status)
> diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
> index 17972fb..1dce9bc 100644
> --- a/drivers/xen/grant-table.c
> +++ b/drivers/xen/grant-table.c
> @@ -123,6 +123,12 @@ struct gnttab_ops {
>  	int (*query_foreign_access)(grant_ref_t ref);
>  };
>  
> +struct unmap_refs_async_callback_data
> +{
> +	struct completion completion;
> +	int result;
> +};
> +
>  static struct gnttab_ops *gnttab_interface;
>  
>  static int grant_table_version;
> @@ -863,6 +869,29 @@ void gnttab_unmap_refs_async(struct gntab_unmap_queue_data* item)
>  }
>  EXPORT_SYMBOL_GPL(gnttab_unmap_refs_async);
>  
> +static void unmap_refs_async_callback(int result,
> +		struct gntab_unmap_queue_data *data)
> +{
> +	struct unmap_refs_async_callback_data* d = data->data;
> +
> +	d->result = result;
> +	complete(&d->completion);
> +}
> +
> +int gnttab_unmap_refs_async_wait_completion(struct gntab_unmap_queue_data* item)
> +{
> +	struct unmap_refs_async_callback_data data;
> +
> +	init_completion(&data.completion);
> +	item->data = &data;
> +	item->done= &unmap_refs_async_callback;
> +	gnttab_unmap_refs_async(item);
> +	wait_for_completion(&data.completion);
> +
> +	return data.result;
> +}
> +EXPORT_SYMBOL_GPL(gnttab_unmap_refs_async_wait_completion);
> +
>  static int gnttab_map_frames_v1(xen_pfn_t *frames, unsigned int nr_gframes)
>  {
>  	int rc;
> diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h
> index 143ca5f..46bad05 100644
> --- a/include/xen/grant_table.h
> +++ b/include/xen/grant_table.h
> @@ -191,6 +191,7 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
>  		      struct gnttab_unmap_grant_ref *kunmap_ops,
>  		      struct page **pages, unsigned int count);
>  void gnttab_unmap_refs_async(struct gntab_unmap_queue_data* item);
> +int gnttab_unmap_refs_async_wait_completion(struct gntab_unmap_queue_data* item);
>  
>  
>  /* Perform a batch of grant map/copy operations. Retry every batch slot
> -- 
> 1.8.3.1
> 

  parent reply	other threads:[~2015-03-26 19:02 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-26 12:16 [PATCH RESEND 1/2] xen/blkback: safely unmap purge persistent grants Bob Liu
2015-03-26 12:16 ` [PATCH 2/2] xen/grant: introduce func gnttab_unmap_refs_async_wait_completion() Bob Liu
2015-03-26 12:16 ` Bob Liu
2015-03-26 15:32   ` Roger Pau Monné
2015-03-26 15:32   ` Roger Pau Monné
2015-03-28  0:44     ` Konrad Rzeszutek Wilk
2015-03-30  0:03       ` Bob Liu
2015-04-01 10:05         ` David Vrabel
2015-04-01 10:05         ` [Xen-devel] " David Vrabel
2015-03-30  0:03       ` Bob Liu
2015-03-28  0:44     ` Konrad Rzeszutek Wilk
2015-03-26 19:01   ` Konrad Rzeszutek Wilk
2015-03-26 19:01   ` Konrad Rzeszutek Wilk [this message]
2015-04-01 10:18   ` David Vrabel
2015-04-01 10:18   ` [Xen-devel] " David Vrabel
2015-04-01 11:55     ` Bob Liu
2015-04-01 11:55     ` Bob Liu
2015-03-26 15:23 ` [PATCH RESEND 1/2] xen/blkback: safely unmap purge persistent grants Roger Pau Monné
2015-03-26 15:23 ` Roger Pau Monné
2015-03-26 19:01   ` Konrad Rzeszutek Wilk
2015-03-26 19:01   ` Konrad Rzeszutek Wilk
2015-03-26 20:11     ` Jens Axboe
2015-03-26 20:11     ` Jens Axboe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150326190149.GC31979@l.oracle.com \
    --to=konrad.wilk@oracle.com \
    --cc=axboe@fb.com \
    --cc=bob.liu@oracle.com \
    --cc=boris.ostrovsky@oracle.com \
    --cc=david.vrabel@citrix.com \
    --cc=jennifer.herbert@citrix.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=roger.pau@citrix.com \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.