[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] p2m: query/modify p2mt with p2m_lock held
# HG changeset patch # User Olaf Hering <olaf@xxxxxxxxx> # Date 1317731245 -7200 # Node ID 9c0bf50bfbb645ec80b7a5e1da2dbd94e326f720 # Parent e77dd1bf489436d9f115be5d77327d1bbde1f1d2 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> diff -r e77dd1bf4894 -r 9c0bf50bfbb6 xen/arch/x86/mm/p2m.c --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -583,9 +583,11 @@ set_mmio_p2m_entry(struct domain *d, uns 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 @@ set_mmio_p2m_entry(struct domain *d, uns } 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 @@ clear_mmio_p2m_entry(struct domain *d, u 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 @@ set_shared_p2m_entry(struct domain *d, u 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_shared_p2m_entry(struct domain *d, u 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-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |