# HG changeset patch
# User Tim Deegan <tim@xxxxxxx>
# Date 1320923555 0
# Node ID 9bb159ec3337e7999c0d49b81105518810cb7b17
# Parent 073d59fbbbbdcb94e10f4ec7b41fa59e7593b37f
x86/mm: Refactor mm-lock ordering constructs
The mm layer has a construct to enforce locks are taken in a pre-
defined order, and thus avert deadlock. Refactor pieces of this
code for later use, no functional changes.
Signed-off-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx>
Acked-by: Tim Deegan <tim@xxxxxxx>
Committed-by: Tim Deegan <tim@xxxxxxx>
---
diff -r 073d59fbbbbd -r 9bb159ec3337 xen/arch/x86/mm/mm-locks.h
--- a/xen/arch/x86/mm/mm-locks.h Thu Nov 10 10:24:19 2011 +0100
+++ b/xen/arch/x86/mm/mm-locks.h Thu Nov 10 11:12:35 2011 +0000
@@ -28,6 +28,7 @@
/* Per-CPU variable for enforcing the lock ordering */
DECLARE_PER_CPU(int, mm_lock_level);
+#define __get_lock_level() (this_cpu(mm_lock_level))
static inline void mm_lock_init(mm_lock_t *l)
{
@@ -42,22 +43,32 @@
return (l->lock.recurse_cpu == current->processor);
}
+/* If you see this crash, the numbers printed are lines in this file
+ * where the offending locks are declared. */
+#define __check_lock_level(l) \
+do { \
+ if ( unlikely(__get_lock_level()) > (l) ) \
+ panic("mm locking order violation: %i > %i\n", \
+ __get_lock_level(), (l)); \
+} while(0)
+
+#define __set_lock_level(l) \
+do { \
+ __get_lock_level() = (l); \
+} while(0)
+
static inline void _mm_lock(mm_lock_t *l, const char *func, int level, int rec)
{
- /* If you see this crash, the numbers printed are lines in this file
- * where the offending locks are declared. */
- if ( unlikely(this_cpu(mm_lock_level) > level) )
- panic("mm locking order violation: %i > %i\n",
- this_cpu(mm_lock_level), level);
+ __check_lock_level(level);
spin_lock_recursive(&l->lock);
if ( l->lock.recurse_cnt == 1 )
{
l->locker_function = func;
- l->unlock_level = this_cpu(mm_lock_level);
+ l->unlock_level = __get_lock_level();
}
else if ( (unlikely(!rec)) )
panic("mm lock already held by %s\n", l->locker_function);
- this_cpu(mm_lock_level) = level;
+ __set_lock_level(level);
}
/* This wrapper uses the line number to express the locking order below */
#define declare_mm_lock(name) \
@@ -72,7 +83,7 @@
if ( l->lock.recurse_cnt == 1 )
{
l->locker_function = "nobody";
- this_cpu(mm_lock_level) = l->unlock_level;
+ __set_lock_level(l->unlock_level);
}
spin_unlock_recursive(&l->lock);
}
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|