diff options
| author | Daniel De Graaf <dgdegra@tycho.nsa.gov> | 2011-12-14 15:12:11 -0500 | 
|---|---|---|
| committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2011-12-20 17:07:27 -0500 | 
| commit | 7d17e84bb8356b1d9f4402dd82a0e270a3d59a4f (patch) | |
| tree | 52e6dfc37a288e7181503d3f6596ce569d725b89 | |
| parent | 2946a52ac7d57c9d02db477e3684259d86446ea7 (diff) | |
| download | olio-linux-3.10-7d17e84bb8356b1d9f4402dd82a0e270a3d59a4f.tar.xz olio-linux-3.10-7d17e84bb8356b1d9f4402dd82a0e270a3d59a4f.zip  | |
xen/grant-table: Support mappings required by blkback
Add support for mappings without GNTMAP_contains_pte. This was not
supported because the unmap operation assumed that this flag was being
used; adding a parameter to the unmap operation to allow the PTE
clearing to be disabled is sufficient to make unmap capable of
supporting either mapping type.
Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
[v1: Fix cleanpatch warnings]
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
| -rw-r--r-- | drivers/xen/gntdev.c | 3 | ||||
| -rw-r--r-- | drivers/xen/grant-table.c | 24 | ||||
| -rw-r--r-- | include/xen/grant_table.h | 2 | 
3 files changed, 8 insertions, 21 deletions
diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c index f52f661f8f8..99d8151c824 100644 --- a/drivers/xen/gntdev.c +++ b/drivers/xen/gntdev.c @@ -314,7 +314,8 @@ static int __unmap_grant_pages(struct grant_map *map, int offset, int pages)  		}  	} -	err = gnttab_unmap_refs(map->unmap_ops + offset, map->pages + offset, pages); +	err = gnttab_unmap_refs(map->unmap_ops + offset, map->pages + offset, +				pages, true);  	if (err)  		return err; diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c index a3d0e1e278c..1cd94daa71d 100644 --- a/drivers/xen/grant-table.c +++ b/drivers/xen/grant-table.c @@ -761,24 +761,10 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,  				(map_ops[i].host_addr & ~PAGE_MASK));  			mfn = pte_mfn(*pte);  		} else { -			/* If you really wanted to do this: -			 * mfn = PFN_DOWN(map_ops[i].dev_bus_addr); -			 * -			 * The reason we do not implement it is b/c on the -			 * unmap path (gnttab_unmap_refs) we have no means of -			 * checking whether the page is !GNTMAP_contains_pte. -			 * -			 * That is without some extra data-structure to carry -			 * the struct page, bool clear_pte, and list_head next -			 * tuples and deal with allocation/delallocation, etc. -			 * -			 * The users of this API set the GNTMAP_contains_pte -			 * flag so lets just return not supported until it -			 * becomes neccessary to implement. -			 */ -			return -EOPNOTSUPP; +			mfn = PFN_DOWN(map_ops[i].dev_bus_addr);  		} -		ret = m2p_add_override(mfn, pages[i], &kmap_ops[i]); +		ret = m2p_add_override(mfn, pages[i], kmap_ops ? +				       &kmap_ops[i] : NULL);  		if (ret)  			return ret;  	} @@ -788,7 +774,7 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,  EXPORT_SYMBOL_GPL(gnttab_map_refs);  int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops, -		      struct page **pages, unsigned int count) +		      struct page **pages, unsigned int count, bool clear_pte)  {  	int i, ret; @@ -800,7 +786,7 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,  		return ret;  	for (i = 0; i < count; i++) { -		ret = m2p_remove_override(pages[i], true /* clear the PTE */); +		ret = m2p_remove_override(pages[i], clear_pte);  		if (ret)  			return ret;  	} diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h index f1e17b70588..15f8a00ff00 100644 --- a/include/xen/grant_table.h +++ b/include/xen/grant_table.h @@ -185,6 +185,6 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,  		    struct gnttab_map_grant_ref *kmap_ops,  		    struct page **pages, unsigned int count);  int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops, -		      struct page **pages, unsigned int count); +		      struct page **pages, unsigned int count, bool clear_pte);  #endif /* __ASM_GNTTAB_H__ */  |