[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] p2m: query/modify p2mt with p2m_lock held
# HG changeset patch # User Olaf Hering <olaf@xxxxxxxxx> # Date 1317906943 -3600 # Node ID 88b6e08b8aa89f876d74ed197f4229eb6cd7abb7 # Parent 71844f889e3e490d49e55a9e4c7a5559c890e175 p2m: query/modify p2mt with p2m_lock held Query and update the p2mt in set_mmio_p2m_entry, clear_mmio_p2m_entry and set_shared_p2m_entry with the p2m_lock held. Signed-off-by: Olaf Hering <olaf@xxxxxxxxx> Acked-by: Tim Deegan <tim@xxxxxxx> Committed-by: Tim Deegan <tim@xxxxxxx> --- diff -r 71844f889e3e -r 88b6e08b8aa8 xen/arch/x86/mm/p2m.c --- a/xen/arch/x86/mm/p2m.c Thu Oct 06 12:52:18 2011 +0100 +++ b/xen/arch/x86/mm/p2m.c Thu Oct 06 14:15:43 2011 +0100 @@ -583,9 +583,11 @@ if ( !paging_mode_translate(d) ) return 0; + p2m_lock(p2m); omfn = gfn_to_mfn_query(d, gfn, &ot); if ( p2m_is_grant(ot) ) { + p2m_unlock(p2m); domain_crash(d); return 0; } @@ -596,7 +598,6 @@ } P2M_DEBUG("set mmio %lx %lx\n", gfn, mfn_x(mfn)); - p2m_lock(p2m); rc = set_p2m_entry(p2m, gfn, mfn, 0, p2m_mmio_direct, p2m->default_access); audit_p2m(p2m, 1); p2m_unlock(p2m); @@ -618,18 +619,20 @@ if ( !paging_mode_translate(d) ) return 0; - mfn = gfn_to_mfn(d, gfn, &t); + p2m_lock(p2m); + mfn = gfn_to_mfn_query(d, gfn, &t); /* Do not use mfn_valid() here as it will usually fail for MMIO pages. */ if ( (INVALID_MFN == mfn_x(mfn)) || (t != p2m_mmio_direct) ) { gdprintk(XENLOG_ERR, "clear_mmio_p2m_entry: gfn_to_mfn failed! gfn=%08lx\n", gfn); - return 0; + goto out; } - p2m_lock(p2m); rc = set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), 0, p2m_invalid, p2m->default_access); audit_p2m(p2m, 1); + +out: p2m_unlock(p2m); return rc; @@ -646,6 +649,7 @@ if ( !paging_mode_translate(p2m->domain) ) return 0; + p2m_lock(p2m); omfn = gfn_to_mfn_query(p2m->domain, gfn, &ot); /* At the moment we only allow p2m change if gfn has already been made * sharable first */ @@ -655,7 +659,6 @@ set_gpfn_from_mfn(mfn_x(omfn), INVALID_M2P_ENTRY); P2M_DEBUG("set shared %lx %lx\n", gfn, mfn_x(mfn)); - p2m_lock(p2m); rc = set_p2m_entry(p2m, gfn, mfn, 0, p2m_ram_shared, p2m->default_access); p2m_unlock(p2m); if ( 0 == rc ) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |