Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:12.2
xen
23908-p2m_query-modify_p2mt_with_p2m_lock_held....
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 23908-p2m_query-modify_p2mt_with_p2m_lock_held.patch of Package xen
changeset: 23908:88b6e08b8aa8 user: Olaf Hering <olaf@aepfle.de> date: Thu Oct 06 14:15:43 2011 +0100 files: xen/arch/x86/mm/p2m.c description: 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@aepfle.de> Acked-by: Tim Deegan <tim@xen.org> Committed-by: Tim Deegan <tim@xen.org> --- xen/arch/x86/mm/p2m.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) Index: xen-4.1.2-testing/xen/arch/x86/mm/p2m.c =================================================================== --- xen-4.1.2-testing.orig/xen/arch/x86/mm/p2m.c +++ xen-4.1.2-testing/xen/arch/x86/mm/p2m.c @@ -2751,9 +2751,11 @@ set_mmio_p2m_entry(struct p2m_domain *p2 if ( !paging_mode_translate(p2m->domain) ) return 0; + p2m_lock(p2m); omfn = gfn_to_mfn_query(p2m, gfn, &ot); if ( p2m_is_grant(ot) ) { + p2m_unlock(p2m); domain_crash(p2m->domain); return 0; } @@ -2764,7 +2766,6 @@ set_mmio_p2m_entry(struct p2m_domain *p2 } 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); @@ -2785,18 +2786,20 @@ clear_mmio_p2m_entry(struct p2m_domain * if ( !paging_mode_translate(p2m->domain) ) return 0; - mfn = gfn_to_mfn(p2m, gfn, &t); + p2m_lock(p2m); + mfn = gfn_to_mfn_query(p2m, 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; @@ -2813,6 +2816,8 @@ set_shared_p2m_entry(struct p2m_domain * if ( !paging_mode_translate(p2m->domain) ) return 0; + if ( need_lock ) + p2m_lock(p2m); omfn = gfn_to_mfn_query(p2m, gfn, &ot); /* At the moment we only allow p2m change if gfn has already been made * sharable first */ @@ -2822,8 +2827,6 @@ 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, p2m->default_access); if ( need_lock ) p2m_unlock(p2m);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor