2006-01-09 15:59:20 -08:00
/*
* Mutexes : blocking mutual exclusion locks
*
* started by Ingo Molnar :
*
* Copyright ( C ) 2004 , 2005 , 2006 Red Hat , Inc . , Ingo Molnar < mingo @ redhat . com >
*
* This file contains mutex debugging related internal declarations ,
* prototypes and inline functions , for the CONFIG_DEBUG_MUTEXES case .
* More details are in kernel / mutex - debug . c .
*/
/*
* This must be called with lock - > wait_lock held .
*/
2006-07-03 00:24:33 -07:00
extern void debug_mutex_lock_common ( struct mutex * lock ,
struct mutex_waiter * waiter ) ;
2006-01-09 15:59:20 -08:00
extern void debug_mutex_wake_waiter ( struct mutex * lock ,
struct mutex_waiter * waiter ) ;
extern void debug_mutex_free_waiter ( struct mutex_waiter * waiter ) ;
extern void debug_mutex_add_waiter ( struct mutex * lock ,
struct mutex_waiter * waiter ,
2006-07-03 00:24:33 -07:00
struct thread_info * ti ) ;
2006-01-09 15:59:20 -08:00
extern void mutex_remove_waiter ( struct mutex * lock , struct mutex_waiter * waiter ,
struct thread_info * ti ) ;
extern void debug_mutex_unlock ( struct mutex * lock ) ;
2006-07-03 00:24:33 -07:00
extern void debug_mutex_init ( struct mutex * lock , const char * name ,
struct lock_class_key * key ) ;
2006-01-09 15:59:20 -08:00
2009-01-12 14:01:47 +01:00
static inline void mutex_set_owner ( struct mutex * lock )
{
lock - > owner = current_thread_info ( ) ;
}
static inline void mutex_clear_owner ( struct mutex * lock )
{
lock - > owner = NULL ;
}
2006-06-26 00:24:31 -07:00
# define spin_lock_mutex(lock, flags) \
2006-01-09 15:59:20 -08:00
do { \
struct mutex * l = container_of ( lock , struct mutex , wait_lock ) ; \
\
2006-07-03 00:24:30 -07:00
DEBUG_LOCKS_WARN_ON ( in_interrupt ( ) ) ; \
2006-07-03 00:24:33 -07:00
local_irq_save ( flags ) ; \
2009-12-02 20:02:59 +01:00
arch_spin_lock ( & ( lock ) - > rlock . raw_lock ) ; \
2006-07-03 00:24:30 -07:00
DEBUG_LOCKS_WARN_ON ( l - > magic ! = l ) ; \
2006-01-09 15:59:20 -08:00
} while ( 0 )
2009-12-02 20:02:59 +01:00
# define spin_unlock_mutex(lock, flags) \
do { \
arch_spin_unlock ( & ( lock ) - > rlock . raw_lock ) ; \
local_irq_restore ( flags ) ; \
preempt_check_resched ( ) ; \
2006-01-09 15:59:20 -08:00
} while ( 0 )