74 lines
2.5 KiB
Diff
74 lines
2.5 KiB
Diff
From 20fddbd4510f3a3888cccc64f89862168a2b7528 Mon Sep 17 00:00:00 2001
|
|
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
|
Date: Fri, 14 Jan 2011 17:55:44 -0500
|
|
Subject: [PATCH 1/4] m2p: No need to catch exceptions when we know that there is no RAM
|
|
|
|
.. beyound what we think is the end of memory. However there might
|
|
be more System RAM - but assigned to a guest. Hence jump to the
|
|
M2P override check and consult.
|
|
|
|
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
|
---
|
|
arch/x86/include/asm/xen/page.h | 6 +++++-
|
|
1 files changed, 5 insertions(+), 1 deletions(-)
|
|
|
|
diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h
|
|
index f25bdf2..74a8559 100644
|
|
--- a/arch/x86/include/asm/xen/page.h
|
|
+++ b/arch/x86/include/asm/xen/page.h
|
|
@@ -77,6 +77,10 @@ static inline unsigned long mfn_to_pfn(unsigned long mfn)
|
|
if (xen_feature(XENFEAT_auto_translated_physmap))
|
|
return mfn;
|
|
|
|
+ if (unlikely((mfn >> machine_to_phys_order) != 0)) {
|
|
+ pfn = ~0;
|
|
+ goto try_override;
|
|
+ }
|
|
pfn = 0;
|
|
/*
|
|
* The array access can fail (e.g., device space beyond end of RAM).
|
|
@@ -84,7 +88,7 @@ static inline unsigned long mfn_to_pfn(unsigned long mfn)
|
|
* but we must handle the fault without crashing!
|
|
*/
|
|
__get_user(pfn, &machine_to_phys_mapping[mfn]);
|
|
-
|
|
+try_override:
|
|
/*
|
|
* If this appears to be a foreign mfn (because the pfn
|
|
* doesn't map back to the mfn), then check the local override
|
|
--
|
|
1.7.3.5
|
|
|
|
|
|
From a89d6bd5cfa1ba3b27d7ba2dc664975a0560fb15 Mon Sep 17 00:00:00 2001
|
|
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
|
|
Date: Tue, 25 Jan 2011 12:05:11 +0000
|
|
Subject: [PATCH 3/4] When destroying mappings between _brk_end and _end, do not go over _end
|
|
|
|
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
|
|
---
|
|
arch/x86/mm/init.c | 3 ++-
|
|
1 files changed, 2 insertions(+), 1 deletions(-)
|
|
|
|
diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c
|
|
index 947f42a..c7263c9 100644
|
|
--- a/arch/x86/mm/init.c
|
|
+++ b/arch/x86/mm/init.c
|
|
@@ -291,10 +291,11 @@ unsigned long __init_refok init_memory_mapping(unsigned long start,
|
|
* located on different 2M pages. cleanup_highmap(), however,
|
|
* can only consider _end when it runs, so destroy any
|
|
* mappings beyond _brk_end here.
|
|
+ * Be careful not to go over _end.
|
|
*/
|
|
pud = pud_offset(pgd_offset_k(_brk_end), _brk_end);
|
|
pmd = pmd_offset(pud, _brk_end - 1);
|
|
- while (++pmd <= pmd_offset(pud, (unsigned long)_end - 1))
|
|
+ while (++pmd < pmd_offset(pud, (unsigned long)_end))
|
|
pmd_clear(pmd);
|
|
}
|
|
#endif
|
|
--
|
|
1.7.3.5
|
|
|
|
|