locking fixes
Subsystems (4)
Linus,
Please pull the latest locking-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git locking-urgent-for-linus
# HEAD: c0dc373a780f4ec63e45a573b9551763abd8cd1a locking/pvqspinlock/x86: Use LOCK_PREFIX in __pv_queued_spin_unlock() assembly code
A paravirt UP-patching fix, and an I2C MUX driver lockdep warning fix.
Thanks,
Ingo
------------------>
Peter Rosin (2):
locking/rtmutex: Allow specifying a subclass for nested locking i2c/mux, locking/core: Annotate the nested rt_mutex usage
Waiman Long (1):
locking/pvqspinlock/x86: Use LOCK_PREFIX in __pv_queued_spin_unlock() assembly code
arch/x86/include/asm/qspinlock_paravirt.h | 2 +- drivers/i2c/i2c-core-base.c | 2 +- drivers/i2c/i2c-mux.c | 4 ++-- include/linux/rtmutex.h | 7 +++++++ kernel/locking/rtmutex.c | 29 +++++++++++++++++++++++++---- 5 files changed, 36 insertions(+), 8 deletions(-)
arch/x86/include/asm/qspinlock_paravirt.h +1 -1
@@ -43,7 +43,7 @@ asm (".pushsection .text;""push %rdx;" "mov $0x1,%eax;" "xor %edx,%edx;" -"lock cmpxchg %dl,(%rdi);" +LOCK_PREFIX "cmpxchg %dl,(%rdi);" "cmp $0x1,%al;" "jne .slowpath;" "pop %rdx;"
drivers/i2c/i2c-core-base.c +1 -1
@@ -624,7 +624,7 @@ static int i2c_check_addr_busy(struct i2c_adapter *adapter, int addr)static void i2c_adapter_lock_bus (struct i2c_adapter *adapter,unsigned int flags) { -rt_mutex_lock (&adapter->bus_lock); +rt_mutex_lock_nested (&adapter->bus_lock,i2c_adapter_depth (adapter)); }/**
drivers/i2c/i2c-mux.c +2 -2
@@ -144,7 +144,7 @@ static void i2c_mux_lock_bus(struct i2c_adapter *adapter, unsigned int flags)struct i2c_mux_priv *priv = adapter->algo_data;struct i2c_adapter *parent = priv->muxc->parent; -rt_mutex_lock (&parent->mux_lock); +rt_mutex_lock_nested (&parent->mux_lock,i2c_adapter_depth (adapter));if (!(flags &I2C_LOCK_ROOT_ADAPTER ))return ;i2c_lock_bus (parent, flags);
@@ -181,7 +181,7 @@ static void i2c_parent_lock_bus(struct i2c_adapter *adapter,struct i2c_mux_priv *priv = adapter->algo_data;struct i2c_adapter *parent = priv->muxc->parent; -rt_mutex_lock (&parent->mux_lock); +rt_mutex_lock_nested (&parent->mux_lock,i2c_adapter_depth (adapter));i2c_lock_bus (parent, flags); }
include/linux/rtmutex.h +7 -0
@@ -106,7 +106,14 @@ static inline int rt_mutex_is_locked(struct rt_mutex *lock)extern void __rt_mutex_init (struct rt_mutex *lock,const char *name,struct lock_class_key *key);extern void rt_mutex_destroy (struct rt_mutex *lock); +#ifdef CONFIG_DEBUG_LOCK_ALLOC +extern void rt_mutex_lock_nested (struct rt_mutex *lock,unsigned int subclass); +#define rt_mutex_lock (lock) rt_mutex_lock_nested(lock, 0) +#else extern void rt_mutex_lock (struct rt_mutex *lock); +#define rt_mutex_lock_nested (lock, subclass) rt_mutex_lock(lock) +#endif +extern int rt_mutex_lock_interruptible (struct rt_mutex *lock);extern int rt_mutex_timed_lock (struct rt_mutex *lock,struct hrtimer_sleeper *timeout);
kernel/locking/rtmutex.c +25 -4
@@ -1465,6 +1465,29 @@ rt_mutex_fastunlock(struct rt_mutex *lock,rt_mutex_postunlock (&wake_q); } +static inline void __rt_mutex_lock (struct rt_mutex *lock,unsigned int subclass) +{ +might_sleep (); + +mutex_acquire (&lock->dep_map, subclass,0 , _RET_IP_); +rt_mutex_fastlock (lock,TASK_UNINTERRUPTIBLE , rt_mutex_slowlock); +} + +#ifdef CONFIG_DEBUG_LOCK_ALLOC +/** +* rt_mutex_lock_nested - lock a rt_mutex +* +* @lock: the rt_mutex to be locked +* @subclass: the lockdep subclass +*/ +void __sched rt_mutex_lock_nested(struct rt_mutex *lock, unsigned int subclass) +{ +__rt_mutex_lock (lock, subclass); +} +EXPORT_SYMBOL_GPL (rt_mutex_lock_nested); +#endif + +#ifndef CONFIG_DEBUG_LOCK_ALLOC /** * rt_mutex_lock - lock a rt_mutex *
@@ -1472,12 +1495,10 @@ rt_mutex_fastunlock(struct rt_mutex *lock,*/ void __sched rt_mutex_lock(struct rt_mutex *lock) { -might_sleep (); - -mutex_acquire (&lock->dep_map,0 ,0 , _RET_IP_); -rt_mutex_fastlock (lock,TASK_UNINTERRUPTIBLE , rt_mutex_slowlock); +__rt_mutex_lock (lock,0 ); }EXPORT_SYMBOL_GPL (rt_mutex_lock); +#endif /** * rt_mutex_lock_interruptible - lock a rt_mutex interruptible