Commit 48d13e48 authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Linus Torvalds

Don't operate with pid_t in rtmutex tester

The proper behavior to store task's pid and get this task later is to get the
struct pid pointer and get the task with the pid_task() call.

Make it for rt_mutex_waiter->deadlock_task_pid field.
Signed-off-by: default avatarPavel Emelyanov <xemul@openvz.org>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 8dc86af0
...@@ -130,7 +130,7 @@ void debug_rt_mutex_deadlock(int detect, struct rt_mutex_waiter *act_waiter, ...@@ -130,7 +130,7 @@ void debug_rt_mutex_deadlock(int detect, struct rt_mutex_waiter *act_waiter,
task = rt_mutex_owner(act_waiter->lock); task = rt_mutex_owner(act_waiter->lock);
if (task && task != current) { if (task && task != current) {
act_waiter->deadlock_task_pid = task->pid; act_waiter->deadlock_task_pid = get_pid(task_pid(task));
act_waiter->deadlock_lock = lock; act_waiter->deadlock_lock = lock;
} }
} }
...@@ -142,9 +142,12 @@ void debug_rt_mutex_print_deadlock(struct rt_mutex_waiter *waiter) ...@@ -142,9 +142,12 @@ void debug_rt_mutex_print_deadlock(struct rt_mutex_waiter *waiter)
if (!waiter->deadlock_lock || !rt_trace_on) if (!waiter->deadlock_lock || !rt_trace_on)
return; return;
task = find_task_by_pid(waiter->deadlock_task_pid); rcu_read_lock();
if (!task) task = pid_task(waiter->deadlock_task_pid, PIDTYPE_PID);
if (!task) {
rcu_read_unlock();
return; return;
}
TRACE_OFF_NOLOCK(); TRACE_OFF_NOLOCK();
...@@ -173,6 +176,7 @@ void debug_rt_mutex_print_deadlock(struct rt_mutex_waiter *waiter) ...@@ -173,6 +176,7 @@ void debug_rt_mutex_print_deadlock(struct rt_mutex_waiter *waiter)
current->comm, task_pid_nr(current)); current->comm, task_pid_nr(current));
dump_stack(); dump_stack();
debug_show_all_locks(); debug_show_all_locks();
rcu_read_unlock();
printk("[ turning off deadlock detection." printk("[ turning off deadlock detection."
"Please report this trace. ]\n\n"); "Please report this trace. ]\n\n");
...@@ -203,10 +207,12 @@ void debug_rt_mutex_init_waiter(struct rt_mutex_waiter *waiter) ...@@ -203,10 +207,12 @@ void debug_rt_mutex_init_waiter(struct rt_mutex_waiter *waiter)
memset(waiter, 0x11, sizeof(*waiter)); memset(waiter, 0x11, sizeof(*waiter));
plist_node_init(&waiter->list_entry, MAX_PRIO); plist_node_init(&waiter->list_entry, MAX_PRIO);
plist_node_init(&waiter->pi_list_entry, MAX_PRIO); plist_node_init(&waiter->pi_list_entry, MAX_PRIO);
waiter->deadlock_task_pid = NULL;
} }
void debug_rt_mutex_free_waiter(struct rt_mutex_waiter *waiter) void debug_rt_mutex_free_waiter(struct rt_mutex_waiter *waiter)
{ {
put_pid(waiter->deadlock_task_pid);
TRACE_WARN_ON(!plist_node_empty(&waiter->list_entry)); TRACE_WARN_ON(!plist_node_empty(&waiter->list_entry));
TRACE_WARN_ON(!plist_node_empty(&waiter->pi_list_entry)); TRACE_WARN_ON(!plist_node_empty(&waiter->pi_list_entry));
TRACE_WARN_ON(waiter->task); TRACE_WARN_ON(waiter->task);
......
...@@ -51,7 +51,7 @@ struct rt_mutex_waiter { ...@@ -51,7 +51,7 @@ struct rt_mutex_waiter {
struct rt_mutex *lock; struct rt_mutex *lock;
#ifdef CONFIG_DEBUG_RT_MUTEXES #ifdef CONFIG_DEBUG_RT_MUTEXES
unsigned long ip; unsigned long ip;
pid_t deadlock_task_pid; struct pid *deadlock_task_pid;
struct rt_mutex *deadlock_lock; struct rt_mutex *deadlock_lock;
#endif #endif
}; };
......
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