2006-01-10 02:59:20 +03: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 11:24:33 +04:00
extern void debug_mutex_lock_common ( struct mutex * lock ,
struct mutex_waiter * waiter ) ;
2006-01-10 02:59:20 +03: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 11:24:33 +04:00
struct thread_info * ti ) ;
2006-01-10 02:59:20 +03: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 11:24:33 +04:00
extern void debug_mutex_init ( struct mutex * lock , const char * name ,
struct lock_class_key * key ) ;
2006-01-10 02:59:20 +03:00
2009-01-12 16:01:47 +03: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 11:24:31 +04:00
# define spin_lock_mutex(lock, flags) \
2006-01-10 02:59:20 +03:00
do { \
struct mutex * l = container_of ( lock , struct mutex , wait_lock ) ; \
\
2006-07-03 11:24:30 +04:00
DEBUG_LOCKS_WARN_ON ( in_interrupt ( ) ) ; \
2006-07-03 11:24:33 +04:00
local_irq_save ( flags ) ; \
2009-12-02 22:02:59 +03:00
arch_spin_lock ( & ( lock ) - > rlock . raw_lock ) ; \
2006-07-03 11:24:30 +04:00
DEBUG_LOCKS_WARN_ON ( l - > magic ! = l ) ; \
2006-01-10 02:59:20 +03:00
} while ( 0 )
2009-12-02 22:02:59 +03:00
# define spin_unlock_mutex(lock, flags) \
do { \
arch_spin_unlock ( & ( lock ) - > rlock . raw_lock ) ; \
local_irq_restore ( flags ) ; \
preempt_check_resched ( ) ; \
2006-01-10 02:59:20 +03:00
} while ( 0 )