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 /drivers | |
parent | 2946a52ac7d57c9d02db477e3684259d86446ea7 (diff) |
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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/xen/gntdev.c | 3 | ||||
-rw-r--r-- | drivers/xen/grant-table.c | 24 |
2 files changed, 7 insertions, 20 deletions
diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c index f52f661f8f82..99d8151c824a 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) | |||
314 | } | 314 | } |
315 | } | 315 | } |
316 | 316 | ||
317 | err = gnttab_unmap_refs(map->unmap_ops + offset, map->pages + offset, pages); | 317 | err = gnttab_unmap_refs(map->unmap_ops + offset, map->pages + offset, |
318 | pages, true); | ||
318 | if (err) | 319 | if (err) |
319 | return err; | 320 | return err; |
320 | 321 | ||
diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c index a3d0e1e278c1..1cd94daa71db 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, | |||
761 | (map_ops[i].host_addr & ~PAGE_MASK)); | 761 | (map_ops[i].host_addr & ~PAGE_MASK)); |
762 | mfn = pte_mfn(*pte); | 762 | mfn = pte_mfn(*pte); |
763 | } else { | 763 | } else { |
764 | /* If you really wanted to do this: | 764 | mfn = PFN_DOWN(map_ops[i].dev_bus_addr); |
765 | * mfn = PFN_DOWN(map_ops[i].dev_bus_addr); | ||
766 | * | ||
767 | * The reason we do not implement it is b/c on the | ||
768 | * unmap path (gnttab_unmap_refs) we have no means of | ||
769 | * checking whether the page is !GNTMAP_contains_pte. | ||
770 | * | ||
771 | * That is without some extra data-structure to carry | ||
772 | * the struct page, bool clear_pte, and list_head next | ||
773 | * tuples and deal with allocation/delallocation, etc. | ||
774 | * | ||
775 | * The users of this API set the GNTMAP_contains_pte | ||
776 | * flag so lets just return not supported until it | ||
777 | * becomes neccessary to implement. | ||
778 | */ | ||
779 | return -EOPNOTSUPP; | ||
780 | } | 765 | } |
781 | ret = m2p_add_override(mfn, pages[i], &kmap_ops[i]); | 766 | ret = m2p_add_override(mfn, pages[i], kmap_ops ? |
767 | &kmap_ops[i] : NULL); | ||
782 | if (ret) | 768 | if (ret) |
783 | return ret; | 769 | return ret; |
784 | } | 770 | } |
@@ -788,7 +774,7 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops, | |||
788 | EXPORT_SYMBOL_GPL(gnttab_map_refs); | 774 | EXPORT_SYMBOL_GPL(gnttab_map_refs); |
789 | 775 | ||
790 | int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops, | 776 | int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops, |
791 | struct page **pages, unsigned int count) | 777 | struct page **pages, unsigned int count, bool clear_pte) |
792 | { | 778 | { |
793 | int i, ret; | 779 | int i, ret; |
794 | 780 | ||
@@ -800,7 +786,7 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops, | |||
800 | return ret; | 786 | return ret; |
801 | 787 | ||
802 | for (i = 0; i < count; i++) { | 788 | for (i = 0; i < count; i++) { |
803 | ret = m2p_remove_override(pages[i], true /* clear the PTE */); | 789 | ret = m2p_remove_override(pages[i], clear_pte); |
804 | if (ret) | 790 | if (ret) |
805 | return ret; | 791 | return ret; |
806 | } | 792 | } |