mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-21 01:54:51 +08:00
[IA64] Only unwind non-running tasks.
Unwinding a running task has proven problematic. In one instance, the running task was attempting to unwind itself and received an interrupt between when get_wchan allocated local variables on the stack and when unw_init_from_blocked_task was called which resulted in unw_init_frame_info to place this tasks task_struct pointer over the switch stack's ar_bspstore entry. Signed-off-by: Robin Holt <holt@sgi.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
This commit is contained in:
parent
e2e6fe7bb6
commit
6ae384884d
@ -763,6 +763,9 @@ get_wchan (struct task_struct *p)
|
||||
unsigned long ip;
|
||||
int count = 0;
|
||||
|
||||
if (!p || p == current || p->state == TASK_RUNNING)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Note: p may not be a blocked task (it could be current or
|
||||
* another process running on some other CPU. Rather than
|
||||
@ -773,6 +776,8 @@ get_wchan (struct task_struct *p)
|
||||
*/
|
||||
unw_init_from_blocked_task(&info, p);
|
||||
do {
|
||||
if (p->state == TASK_RUNNING)
|
||||
return 0;
|
||||
if (unw_unwind(&info) < 0)
|
||||
return 0;
|
||||
unw_get_ip(&info, &ip);
|
||||
|
Loading…
Reference in New Issue
Block a user