diff options
| -rw-r--r-- | drivers/block/xen-blkback/blkback.c | 31 | ||||
| -rw-r--r-- | drivers/xen/gntdev.c | 28 | ||||
| -rw-r--r-- | drivers/xen/grant-table.c | 28 | ||||
| -rw-r--r-- | include/xen/grant_table.h | 1 | 
4 files changed, 35 insertions, 53 deletions
| diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index 48e98f2712b5..713fc9ff1149 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c @@ -265,17 +265,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)  { @@ -285,12 +274,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; @@ -310,8 +294,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_sync(&unmap_data));  			put_free_pages(blkif, pages, segs_to_unmap);  			segs_to_unmap = 0; @@ -332,12 +315,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; @@ -357,9 +335,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_sync(&unmap_data));  			put_free_pages(blkif, pages, segs_to_unmap);  			segs_to_unmap = 0;  		} @@ -367,8 +343,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_sync(&unmap_data));  		put_free_pages(blkif, pages, segs_to_unmap);  	}  } diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c index d5bb1a33d0a3..89274850741b 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_sync(&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 17972fbacddc..b1c7170e5c9e 100644 --- a/drivers/xen/grant-table.c +++ b/drivers/xen/grant-table.c @@ -123,6 +123,11 @@ struct gnttab_ops {  	int (*query_foreign_access)(grant_ref_t ref);  }; +struct unmap_refs_callback_data { +	struct completion completion; +	int result; +}; +  static struct gnttab_ops *gnttab_interface;  static int grant_table_version; @@ -863,6 +868,29 @@ void gnttab_unmap_refs_async(struct gntab_unmap_queue_data* item)  }  EXPORT_SYMBOL_GPL(gnttab_unmap_refs_async); +static void unmap_refs_callback(int result, +		struct gntab_unmap_queue_data *data) +{ +	struct unmap_refs_callback_data *d = data->data; + +	d->result = result; +	complete(&d->completion); +} + +int gnttab_unmap_refs_sync(struct gntab_unmap_queue_data *item) +{ +	struct unmap_refs_callback_data data; + +	init_completion(&data.completion); +	item->data = &data; +	item->done = &unmap_refs_callback; +	gnttab_unmap_refs_async(item); +	wait_for_completion(&data.completion); + +	return data.result; +} +EXPORT_SYMBOL_GPL(gnttab_unmap_refs_sync); +  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 143ca5ffab7a..4478f4b4aae2 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_sync(struct gntab_unmap_queue_data *item);  /* Perform a batch of grant map/copy operations. Retry every batch slot | 
