diff options
author | Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> | 2010-12-13 09:42:30 -0500 |
---|---|---|
committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2011-01-11 14:32:14 -0500 |
commit | 87f1d40a706bdebdc8f959b9ac291d0d8fdfcc7e (patch) | |
tree | 9c05cb059c6eec2d85effd95642ee1a42b000fbe /drivers/xen/grant-table.c | |
parent | a12b4eb34bb1ea16046c5b61e7a887e252cc1cce (diff) |
xen p2m: clear the old pte when adding a page to m2p_override
When adding a page to m2p_override we change the p2m of the page so we
need to also clear the old pte of the kernel linear mapping because it
doesn't correspond anymore.
When we remove the page from m2p_override we restore the original p2m of
the page and we also restore the old pte of the kernel linear mapping.
Before changing the p2m mappings in m2p_add_override and
m2p_remove_override, check that the page passed as argument is valid and
return an error if it is not.
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Diffstat (limited to 'drivers/xen/grant-table.c')
-rw-r--r-- | drivers/xen/grant-table.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c index 1afd5690858c..9ef54ebc1194 100644 --- a/drivers/xen/grant-table.c +++ b/drivers/xen/grant-table.c | |||
@@ -455,6 +455,8 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops, | |||
455 | unsigned long mfn; | 455 | unsigned long mfn; |
456 | 456 | ||
457 | ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, map_ops, count); | 457 | ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, map_ops, count); |
458 | if (ret) | ||
459 | return ret; | ||
458 | 460 | ||
459 | for (i = 0; i < count; i++) { | 461 | for (i = 0; i < count; i++) { |
460 | /* m2p override only supported for GNTMAP_contains_pte mappings */ | 462 | /* m2p override only supported for GNTMAP_contains_pte mappings */ |
@@ -463,7 +465,9 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops, | |||
463 | pte = (pte_t *) (mfn_to_virt(PFN_DOWN(map_ops[i].host_addr)) + | 465 | pte = (pte_t *) (mfn_to_virt(PFN_DOWN(map_ops[i].host_addr)) + |
464 | (map_ops[i].host_addr & ~PAGE_MASK)); | 466 | (map_ops[i].host_addr & ~PAGE_MASK)); |
465 | mfn = pte_mfn(*pte); | 467 | mfn = pte_mfn(*pte); |
466 | m2p_add_override(mfn, pages[i]); | 468 | ret = m2p_add_override(mfn, pages[i]); |
469 | if (ret) | ||
470 | return ret; | ||
467 | } | 471 | } |
468 | 472 | ||
469 | return ret; | 473 | return ret; |
@@ -476,8 +480,14 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops, | |||
476 | int i, ret; | 480 | int i, ret; |
477 | 481 | ||
478 | ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, unmap_ops, count); | 482 | ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, unmap_ops, count); |
479 | for (i = 0; i < count; i++) | 483 | if (ret) |
480 | m2p_remove_override(pages[i]); | 484 | return ret; |
485 | |||
486 | for (i = 0; i < count; i++) { | ||
487 | ret = m2p_remove_override(pages[i]); | ||
488 | if (ret) | ||
489 | return ret; | ||
490 | } | ||
481 | 491 | ||
482 | return ret; | 492 | return ret; |
483 | } | 493 | } |