|
@@ -131,14 +131,14 @@ EXPORT_SYMBOL(mutex_unlock);
|
|
*/
|
|
*/
|
|
static inline int __sched
|
|
static inline int __sched
|
|
__mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,
|
|
__mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,
|
|
- unsigned long ip)
|
|
|
|
|
|
+ struct lockdep_map *nest_lock, unsigned long ip)
|
|
{
|
|
{
|
|
struct task_struct *task = current;
|
|
struct task_struct *task = current;
|
|
struct mutex_waiter waiter;
|
|
struct mutex_waiter waiter;
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
|
|
|
|
preempt_disable();
|
|
preempt_disable();
|
|
- mutex_acquire(&lock->dep_map, subclass, 0, ip);
|
|
|
|
|
|
+ mutex_acquire_nest(&lock->dep_map, subclass, 0, nest_lock, ip);
|
|
|
|
|
|
#ifdef CONFIG_MUTEX_SPIN_ON_OWNER
|
|
#ifdef CONFIG_MUTEX_SPIN_ON_OWNER
|
|
/*
|
|
/*
|
|
@@ -269,16 +269,25 @@ void __sched
|
|
mutex_lock_nested(struct mutex *lock, unsigned int subclass)
|
|
mutex_lock_nested(struct mutex *lock, unsigned int subclass)
|
|
{
|
|
{
|
|
might_sleep();
|
|
might_sleep();
|
|
- __mutex_lock_common(lock, TASK_UNINTERRUPTIBLE, subclass, _RET_IP_);
|
|
|
|
|
|
+ __mutex_lock_common(lock, TASK_UNINTERRUPTIBLE, subclass, NULL, _RET_IP_);
|
|
}
|
|
}
|
|
|
|
|
|
EXPORT_SYMBOL_GPL(mutex_lock_nested);
|
|
EXPORT_SYMBOL_GPL(mutex_lock_nested);
|
|
|
|
|
|
|
|
+void __sched
|
|
|
|
+_mutex_lock_nest_lock(struct mutex *lock, struct lockdep_map *nest)
|
|
|
|
+{
|
|
|
|
+ might_sleep();
|
|
|
|
+ __mutex_lock_common(lock, TASK_UNINTERRUPTIBLE, 0, nest, _RET_IP_);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+EXPORT_SYMBOL_GPL(_mutex_lock_nest_lock);
|
|
|
|
+
|
|
int __sched
|
|
int __sched
|
|
mutex_lock_killable_nested(struct mutex *lock, unsigned int subclass)
|
|
mutex_lock_killable_nested(struct mutex *lock, unsigned int subclass)
|
|
{
|
|
{
|
|
might_sleep();
|
|
might_sleep();
|
|
- return __mutex_lock_common(lock, TASK_KILLABLE, subclass, _RET_IP_);
|
|
|
|
|
|
+ return __mutex_lock_common(lock, TASK_KILLABLE, subclass, NULL, _RET_IP_);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(mutex_lock_killable_nested);
|
|
EXPORT_SYMBOL_GPL(mutex_lock_killable_nested);
|
|
|
|
|
|
@@ -287,7 +296,7 @@ mutex_lock_interruptible_nested(struct mutex *lock, unsigned int subclass)
|
|
{
|
|
{
|
|
might_sleep();
|
|
might_sleep();
|
|
return __mutex_lock_common(lock, TASK_INTERRUPTIBLE,
|
|
return __mutex_lock_common(lock, TASK_INTERRUPTIBLE,
|
|
- subclass, _RET_IP_);
|
|
|
|
|
|
+ subclass, NULL, _RET_IP_);
|
|
}
|
|
}
|
|
|
|
|
|
EXPORT_SYMBOL_GPL(mutex_lock_interruptible_nested);
|
|
EXPORT_SYMBOL_GPL(mutex_lock_interruptible_nested);
|
|
@@ -393,7 +402,7 @@ __mutex_lock_slowpath(atomic_t *lock_count)
|
|
{
|
|
{
|
|
struct mutex *lock = container_of(lock_count, struct mutex, count);
|
|
struct mutex *lock = container_of(lock_count, struct mutex, count);
|
|
|
|
|
|
- __mutex_lock_common(lock, TASK_UNINTERRUPTIBLE, 0, _RET_IP_);
|
|
|
|
|
|
+ __mutex_lock_common(lock, TASK_UNINTERRUPTIBLE, 0, NULL, _RET_IP_);
|
|
}
|
|
}
|
|
|
|
|
|
static noinline int __sched
|
|
static noinline int __sched
|
|
@@ -401,7 +410,7 @@ __mutex_lock_killable_slowpath(atomic_t *lock_count)
|
|
{
|
|
{
|
|
struct mutex *lock = container_of(lock_count, struct mutex, count);
|
|
struct mutex *lock = container_of(lock_count, struct mutex, count);
|
|
|
|
|
|
- return __mutex_lock_common(lock, TASK_KILLABLE, 0, _RET_IP_);
|
|
|
|
|
|
+ return __mutex_lock_common(lock, TASK_KILLABLE, 0, NULL, _RET_IP_);
|
|
}
|
|
}
|
|
|
|
|
|
static noinline int __sched
|
|
static noinline int __sched
|
|
@@ -409,7 +418,7 @@ __mutex_lock_interruptible_slowpath(atomic_t *lock_count)
|
|
{
|
|
{
|
|
struct mutex *lock = container_of(lock_count, struct mutex, count);
|
|
struct mutex *lock = container_of(lock_count, struct mutex, count);
|
|
|
|
|
|
- return __mutex_lock_common(lock, TASK_INTERRUPTIBLE, 0, _RET_IP_);
|
|
|
|
|
|
+ return __mutex_lock_common(lock, TASK_INTERRUPTIBLE, 0, NULL, _RET_IP_);
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|