Commit fb20c03d authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'locking-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull locking fixes from Ingo Molnar:
 "A paravirt UP-patching fix, and an I2C MUX driver lockdep warning fix"

* 'locking-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  locking/pvqspinlock/x86: Use LOCK_PREFIX in __pv_queued_spin_unlock() assembly code
  i2c/mux, locking/core: Annotate the nested rt_mutex usage
  locking/rtmutex: Allow specifying a subclass for nested locking
parents d464b031 c0dc373a
...@@ -43,7 +43,7 @@ asm (".pushsection .text;" ...@@ -43,7 +43,7 @@ asm (".pushsection .text;"
"push %rdx;" "push %rdx;"
"mov $0x1,%eax;" "mov $0x1,%eax;"
"xor %edx,%edx;" "xor %edx,%edx;"
"lock cmpxchg %dl,(%rdi);" LOCK_PREFIX "cmpxchg %dl,(%rdi);"
"cmp $0x1,%al;" "cmp $0x1,%al;"
"jne .slowpath;" "jne .slowpath;"
"pop %rdx;" "pop %rdx;"
......
...@@ -624,7 +624,7 @@ static int i2c_check_addr_busy(struct i2c_adapter *adapter, int addr) ...@@ -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, static void i2c_adapter_lock_bus(struct i2c_adapter *adapter,
unsigned int flags) unsigned int flags)
{ {
rt_mutex_lock(&adapter->bus_lock); rt_mutex_lock_nested(&adapter->bus_lock, i2c_adapter_depth(adapter));
} }
/** /**
......
...@@ -144,7 +144,7 @@ static void i2c_mux_lock_bus(struct i2c_adapter *adapter, unsigned int flags) ...@@ -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_mux_priv *priv = adapter->algo_data;
struct i2c_adapter *parent = priv->muxc->parent; 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)) if (!(flags & I2C_LOCK_ROOT_ADAPTER))
return; return;
i2c_lock_bus(parent, flags); i2c_lock_bus(parent, flags);
...@@ -181,7 +181,7 @@ static void i2c_parent_lock_bus(struct i2c_adapter *adapter, ...@@ -181,7 +181,7 @@ static void i2c_parent_lock_bus(struct i2c_adapter *adapter,
struct i2c_mux_priv *priv = adapter->algo_data; struct i2c_mux_priv *priv = adapter->algo_data;
struct i2c_adapter *parent = priv->muxc->parent; 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); i2c_lock_bus(parent, flags);
} }
......
...@@ -106,7 +106,14 @@ static inline int rt_mutex_is_locked(struct rt_mutex *lock) ...@@ -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_init(struct rt_mutex *lock, const char *name, struct lock_class_key *key);
extern void rt_mutex_destroy(struct rt_mutex *lock); 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); 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_lock_interruptible(struct rt_mutex *lock);
extern int rt_mutex_timed_lock(struct rt_mutex *lock, extern int rt_mutex_timed_lock(struct rt_mutex *lock,
struct hrtimer_sleeper *timeout); struct hrtimer_sleeper *timeout);
......
...@@ -1465,6 +1465,29 @@ rt_mutex_fastunlock(struct rt_mutex *lock, ...@@ -1465,6 +1465,29 @@ rt_mutex_fastunlock(struct rt_mutex *lock,
rt_mutex_postunlock(&wake_q); 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 * rt_mutex_lock - lock a rt_mutex
* *
...@@ -1472,12 +1495,10 @@ rt_mutex_fastunlock(struct rt_mutex *lock, ...@@ -1472,12 +1495,10 @@ rt_mutex_fastunlock(struct rt_mutex *lock,
*/ */
void __sched rt_mutex_lock(struct rt_mutex *lock) void __sched rt_mutex_lock(struct rt_mutex *lock)
{ {
might_sleep(); __rt_mutex_lock(lock, 0);
mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_);
rt_mutex_fastlock(lock, TASK_UNINTERRUPTIBLE, rt_mutex_slowlock);
} }
EXPORT_SYMBOL_GPL(rt_mutex_lock); EXPORT_SYMBOL_GPL(rt_mutex_lock);
#endif
/** /**
* rt_mutex_lock_interruptible - lock a rt_mutex interruptible * rt_mutex_lock_interruptible - lock a rt_mutex interruptible
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment