[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Fix recursive lock p2m lock acquisition in POD code
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1254396573 -3600 # Node ID fd3d5d66c446b3216e5e6180efd1f01db9a1b47c # Parent bc9f7c6ac6954d517c9988575d9ae5d5e9c8448f Fix recursive lock p2m lock acquisition in POD code The POD code can take the p2m lock from inside a lookup. This causes a crash if anyone calls gfn_to_mfn* with the p2m lock held, which is quite a few places. Make the POD code understand that it may be called with the lock held, and DTRT about talking or releasing it. Signed-off-by: Tim Deegan <Tim.Deegan@xxxxxxxxxx> --- xen/arch/x86/mm/p2m.c | 24 ++++++++++++++++-------- 1 files changed, 16 insertions(+), 8 deletions(-) diff -r bc9f7c6ac695 -r fd3d5d66c446 xen/arch/x86/mm/p2m.c --- a/xen/arch/x86/mm/p2m.c Thu Oct 01 12:28:54 2009 +0100 +++ b/xen/arch/x86/mm/p2m.c Thu Oct 01 12:29:33 2009 +0100 @@ -1067,21 +1067,29 @@ static int p2m_pod_check_and_populate(st l1_pgentry_t *p2m_entry, int order, p2m_query_t q) { + /* Only take the lock if we don't already have it. Otherwise it + * wouldn't be safe to do p2m lookups with the p2m lock held */ + int do_locking = !p2m_locked_by_me(d->arch.p2m); int r; - p2m_lock(d->arch.p2m); + + if ( do_locking ) + p2m_lock(d->arch.p2m); + audit_p2m(d); /* Check to make sure this is still PoD */ if ( p2m_flags_to_type(l1e_get_flags(*p2m_entry)) != p2m_populate_on_demand ) { + if ( do_locking ) + p2m_unlock(d->arch.p2m); + return 0; + } + + r = p2m_pod_demand_populate(d, gfn, order, q); + + audit_p2m(d); + if ( do_locking ) p2m_unlock(d->arch.p2m); - return 0; - } - - r = p2m_pod_demand_populate(d, gfn, order, q); - - audit_p2m(d); - p2m_unlock(d->arch.p2m); return r; } _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |