diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/rtmutex-debug.c | 12 | ||||
-rw-r--r-- | kernel/rtmutex_common.h | 2 |
2 files changed, 10 insertions, 4 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); |
diff --git a/kernel/rtmutex_common.h b/kernel/rtmutex_common.h index 2d3b83593ca3..e124bf5800ea 100644 --- a/kernel/rtmutex_common.h +++ b/kernel/rtmutex_common.h | |||
@@ -51,7 +51,7 @@ struct rt_mutex_waiter { | |||
51 | struct rt_mutex *lock; | 51 | struct rt_mutex *lock; |
52 | #ifdef CONFIG_DEBUG_RT_MUTEXES | 52 | #ifdef CONFIG_DEBUG_RT_MUTEXES |
53 | unsigned long ip; | 53 | unsigned long ip; |
54 | pid_t deadlock_task_pid; | 54 | struct pid *deadlock_task_pid; |
55 | struct rt_mutex *deadlock_lock; | 55 | struct rt_mutex *deadlock_lock; |
56 | #endif | 56 | #endif |
57 | }; | 57 | }; |