diff options
author | Pavel Emelyanov <xemul@openvz.org> | 2008-02-08 07:21:53 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-08 12:22:41 -0500 |
commit | 48d13e483c5b450be451f78cc9cb43c0bdd6b7bb (patch) | |
tree | c12c76e72ee5d1c202937c7327b2a05474fbcabc /kernel/rtmutex-debug.c | |
parent | 8dc86af00612e5ccff3384c17575362a3f2a2ca0 (diff) |
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>
Diffstat (limited to 'kernel/rtmutex-debug.c')
-rw-r--r-- | kernel/rtmutex-debug.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/kernel/rtmutex-debug.c b/kernel/rtmutex-debug.c index 56d73cb8826d..5fcb4fe645e2 100644 --- a/kernel/rtmutex-debug.c +++ b/kernel/rtmutex-debug.c | |||
@@ -130,7 +130,7 @@ void debug_rt_mutex_deadlock(int detect, struct rt_mutex_waiter *act_waiter, | |||
130 | 130 | ||
131 | task = rt_mutex_owner(act_waiter->lock); | 131 | task = rt_mutex_owner(act_waiter->lock); |
132 | if (task && task != current) { | 132 | if (task && task != current) { |
133 | act_waiter->deadlock_task_pid = task->pid; | 133 | act_waiter->deadlock_task_pid = get_pid(task_pid(task)); |
134 | act_waiter->deadlock_lock = lock; | 134 | act_waiter->deadlock_lock = lock; |
135 | } | 135 | } |
136 | } | 136 | } |
@@ -142,9 +142,12 @@ void debug_rt_mutex_print_deadlock(struct rt_mutex_waiter *waiter) | |||
142 | if (!waiter->deadlock_lock || !rt_trace_on) | 142 | if (!waiter->deadlock_lock || !rt_trace_on) |
143 | return; | 143 | return; |
144 | 144 | ||
145 | task = find_task_by_pid(waiter->deadlock_task_pid); | 145 | rcu_read_lock(); |
146 | if (!task) | 146 | task = pid_task(waiter->deadlock_task_pid, PIDTYPE_PID); |
147 | if (!task) { | ||
148 | rcu_read_unlock(); | ||
147 | return; | 149 | return; |
150 | } | ||
148 | 151 | ||
149 | TRACE_OFF_NOLOCK(); | 152 | TRACE_OFF_NOLOCK(); |
150 | 153 | ||
@@ -173,6 +176,7 @@ void debug_rt_mutex_print_deadlock(struct rt_mutex_waiter *waiter) | |||
173 | current->comm, task_pid_nr(current)); | 176 | current->comm, task_pid_nr(current)); |
174 | dump_stack(); | 177 | dump_stack(); |
175 | debug_show_all_locks(); | 178 | debug_show_all_locks(); |
179 | rcu_read_unlock(); | ||
176 | 180 | ||
177 | printk("[ turning off deadlock detection." | 181 | printk("[ turning off deadlock detection." |
178 | "Please report this trace. ]\n\n"); | 182 | "Please report this trace. ]\n\n"); |
@@ -203,10 +207,12 @@ void debug_rt_mutex_init_waiter(struct rt_mutex_waiter *waiter) | |||
203 | memset(waiter, 0x11, sizeof(*waiter)); | 207 | memset(waiter, 0x11, sizeof(*waiter)); |
204 | plist_node_init(&waiter->list_entry, MAX_PRIO); | 208 | plist_node_init(&waiter->list_entry, MAX_PRIO); |
205 | plist_node_init(&waiter->pi_list_entry, MAX_PRIO); | 209 | plist_node_init(&waiter->pi_list_entry, MAX_PRIO); |
210 | waiter->deadlock_task_pid = NULL; | ||
206 | } | 211 | } |
207 | 212 | ||
208 | void debug_rt_mutex_free_waiter(struct rt_mutex_waiter *waiter) | 213 | void debug_rt_mutex_free_waiter(struct rt_mutex_waiter *waiter) |
209 | { | 214 | { |
215 | put_pid(waiter->deadlock_task_pid); | ||
210 | TRACE_WARN_ON(!plist_node_empty(&waiter->list_entry)); | 216 | TRACE_WARN_ON(!plist_node_empty(&waiter->list_entry)); |
211 | TRACE_WARN_ON(!plist_node_empty(&waiter->pi_list_entry)); | 217 | TRACE_WARN_ON(!plist_node_empty(&waiter->pi_list_entry)); |
212 | TRACE_WARN_ON(waiter->task); | 218 | TRACE_WARN_ON(waiter->task); |