[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-3.4-testing] Fix recursive lock p2m lock acquisition in POD code
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1260181975 0 # Node ID 763ce108c23631e708db89dd6a1a399963eeb145 # Parent 9011437f2142390477d4e2845c6458e36f314e00 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-unstable changeset: 20269:fd3d5d66c446 xen-unstable date: Thu Oct 01 12:29:33 2009 +0100 --- xen/arch/x86/mm/p2m.c | 24 ++++++++++++++++-------- 1 files changed, 16 insertions(+), 8 deletions(-) diff -r 9011437f2142 -r 763ce108c236 xen/arch/x86/mm/p2m.c --- a/xen/arch/x86/mm/p2m.c Mon Dec 07 10:32:21 2009 +0000 +++ b/xen/arch/x86/mm/p2m.c Mon Dec 07 10:32:55 2009 +0000 @@ -1070,21 +1070,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 |