[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] x86/mm: Refactor mm-lock ordering constructs
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |