# HG changeset patch
# User Tim Deegan <Tim.Deegan@xxxxxxxxxx>
# Date 1294140740 0
# Node ID a8d69de8eb315b3b18c8a86c4d1505f53b84a443
# Parent 4e108cf56d074ccee9d493a111d8dc6bd37c33fd
x86/mm: Add p2m_lock in set_shared_p2m_entry
This avoids the immediate problem (calling set_p2m_entry() without the
lock held) but leaves the underlying problem (no consistent locking
order between page-sharing and p2m code) for later.
Signed-off-by: Jui-Hao Chiang <juihaochiang@xxxxxxxxx>
Signed-off-by: Tim Deegan <Tim.Deegan@xxxxxxxxxx>
---
xen/arch/x86/mm/p2m.c | 5 +++++
1 files changed, 5 insertions(+)
diff -r 4e108cf56d07 -r a8d69de8eb31 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c Mon Dec 27 08:00:09 2010 +0000
+++ b/xen/arch/x86/mm/p2m.c Tue Jan 04 11:32:20 2011 +0000
@@ -2650,6 +2650,7 @@ set_shared_p2m_entry(struct p2m_domain *
set_shared_p2m_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn)
{
int rc = 0;
+ int need_lock = !p2m_locked_by_me(p2m);
p2m_type_t ot;
mfn_t omfn;
@@ -2665,7 +2666,11 @@ set_shared_p2m_entry(struct p2m_domain *
set_gpfn_from_mfn(mfn_x(omfn), INVALID_M2P_ENTRY);
P2M_DEBUG("set shared %lx %lx\n", gfn, mfn_x(mfn));
+ if ( need_lock )
+ p2m_lock(p2m);
rc = set_p2m_entry(p2m, gfn, mfn, 0, p2m_ram_shared);
+ if ( need_lock )
+ p2m_unlock(p2m);
if ( 0 == rc )
gdprintk(XENLOG_ERR,
"set_mmio_p2m_entry: set_p2m_entry failed! mfn=%08lx\n",
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|