|
@@ -828,9 +828,6 @@ int m2p_add_override(unsigned long mfn, struct page *page,
|
|
|
|
|
|
xen_mc_issue(PARAVIRT_LAZY_MMU);
|
|
|
}
|
|
|
- /* let's use dev_bus_addr to record the old mfn instead */
|
|
|
- kmap_op->dev_bus_addr = page->index;
|
|
|
- page->index = (unsigned long) kmap_op;
|
|
|
}
|
|
|
spin_lock_irqsave(&m2p_override_lock, flags);
|
|
|
list_add(&page->lru, &m2p_overrides[mfn_hash(mfn)]);
|
|
@@ -857,7 +854,8 @@ int m2p_add_override(unsigned long mfn, struct page *page,
|
|
|
return 0;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(m2p_add_override);
|
|
|
-int m2p_remove_override(struct page *page, bool clear_pte)
|
|
|
+int m2p_remove_override(struct page *page,
|
|
|
+ struct gnttab_map_grant_ref *kmap_op)
|
|
|
{
|
|
|
unsigned long flags;
|
|
|
unsigned long mfn;
|
|
@@ -887,10 +885,8 @@ int m2p_remove_override(struct page *page, bool clear_pte)
|
|
|
WARN_ON(!PagePrivate(page));
|
|
|
ClearPagePrivate(page);
|
|
|
|
|
|
- if (clear_pte) {
|
|
|
- struct gnttab_map_grant_ref *map_op =
|
|
|
- (struct gnttab_map_grant_ref *) page->index;
|
|
|
- set_phys_to_machine(pfn, map_op->dev_bus_addr);
|
|
|
+ set_phys_to_machine(pfn, page->index);
|
|
|
+ if (kmap_op != NULL) {
|
|
|
if (!PageHighMem(page)) {
|
|
|
struct multicall_space mcs;
|
|
|
struct gnttab_unmap_grant_ref *unmap_op;
|
|
@@ -902,13 +898,13 @@ int m2p_remove_override(struct page *page, bool clear_pte)
|
|
|
* issued. In this case handle is going to -1 because
|
|
|
* it hasn't been modified yet.
|
|
|
*/
|
|
|
- if (map_op->handle == -1)
|
|
|
+ if (kmap_op->handle == -1)
|
|
|
xen_mc_flush();
|
|
|
/*
|
|
|
- * Now if map_op->handle is negative it means that the
|
|
|
+ * Now if kmap_op->handle is negative it means that the
|
|
|
* hypercall actually returned an error.
|
|
|
*/
|
|
|
- if (map_op->handle == GNTST_general_error) {
|
|
|
+ if (kmap_op->handle == GNTST_general_error) {
|
|
|
printk(KERN_WARNING "m2p_remove_override: "
|
|
|
"pfn %lx mfn %lx, failed to modify kernel mappings",
|
|
|
pfn, mfn);
|
|
@@ -918,8 +914,8 @@ int m2p_remove_override(struct page *page, bool clear_pte)
|
|
|
mcs = xen_mc_entry(
|
|
|
sizeof(struct gnttab_unmap_grant_ref));
|
|
|
unmap_op = mcs.args;
|
|
|
- unmap_op->host_addr = map_op->host_addr;
|
|
|
- unmap_op->handle = map_op->handle;
|
|
|
+ unmap_op->host_addr = kmap_op->host_addr;
|
|
|
+ unmap_op->handle = kmap_op->handle;
|
|
|
unmap_op->dev_bus_addr = 0;
|
|
|
|
|
|
MULTI_grant_table_op(mcs.mc,
|
|
@@ -930,10 +926,9 @@ int m2p_remove_override(struct page *page, bool clear_pte)
|
|
|
set_pte_at(&init_mm, address, ptep,
|
|
|
pfn_pte(pfn, PAGE_KERNEL));
|
|
|
__flush_tlb_single(address);
|
|
|
- map_op->host_addr = 0;
|
|
|
+ kmap_op->host_addr = 0;
|
|
|
}
|
|
|
- } else
|
|
|
- set_phys_to_machine(pfn, page->index);
|
|
|
+ }
|
|
|
|
|
|
/* p2m(m2p(mfn)) == FOREIGN_FRAME(mfn): the mfn is already present
|
|
|
* somewhere in this domain, even before being added to the
|