mirror of
https://github.com/adulau/aha.git
synced 2024-12-29 12:16:20 +00:00
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: Pavel 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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
8dc86af006
commit
48d13e483c
2 changed files with 10 additions and 4 deletions
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
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 {
|
||||||
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
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue