From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752857AbbCZTCA (ORCPT ); Thu, 26 Mar 2015 15:02:00 -0400 Received: from userp1040.oracle.com ([156.151.31.81]:26482 "EHLO userp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752774AbbCZTB6 (ORCPT ); Thu, 26 Mar 2015 15:01:58 -0400 Date: Thu, 26 Mar 2015 15:01:49 -0400 From: Konrad Rzeszutek Wilk To: Bob Liu , 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() Message-ID: <20150326190149.GC31979@l.oracle.com> References: <1427372161-4964-1-git-send-email-bob.liu@oracle.com> <1427372161-4964-2-git-send-email-bob.liu@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1427372161-4964-2-git-send-email-bob.liu@oracle.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Source-IP: aserv0022.oracle.com [141.146.126.234] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 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 >