|
|
|
|
|
|
|
|
|
|
xen-changelog
[Xen-changelog] [xen-unstable] Fix recursive lock p2m lock acquisition i
# 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
|
<Prev in Thread] |
Current Thread |
[Next in Thread> |
- [Xen-changelog] [xen-unstable] Fix recursive lock p2m lock acquisition in POD code,
Xen patchbot-unstable <=
|
|
|
|
|