workqueue fix init
This commit is contained in:
@@ -102,7 +102,7 @@ static int copy_stack_frame_remote(struct task_struct *tsk,
|
||||
}
|
||||
|
||||
ret = orig_access_remote_vm(mm, (unsigned long)fp, frame, sizeof(*frame), 0);
|
||||
printk("copy_stack_frame_remote %d ret:%d\n", tsk->pid, ret);
|
||||
// printk("copy_stack_frame_remote %d ret:%d\n", tsk->pid, ret);
|
||||
mmput(mm);
|
||||
|
||||
return ret;
|
||||
@@ -134,30 +134,30 @@ static inline void save_stack_trace_user_remote(struct task_struct *tsk,
|
||||
frame.ret_addr = 0;
|
||||
|
||||
if (!copy_stack_frame_remote(tsk, fp, &frame)) {
|
||||
printk("save_stack_trace_user_remote %d copy_stack_frame_remote fail\n",
|
||||
tsk->pid);
|
||||
// printk("save_stack_trace_user_remote %d copy_stack_frame_remote fail\n",
|
||||
// tsk->pid);
|
||||
break;
|
||||
}
|
||||
|
||||
if ((unsigned long)fp < regs->sp) {
|
||||
printk("save_stack_trace_user_remote %d fp < sp count:%d\n", tsk->pid,
|
||||
count);
|
||||
// printk("save_stack_trace_user_remote %d fp < sp count:%d\n", tsk->pid,
|
||||
// count);
|
||||
break; // 如果fp小于sp,说明已经到了栈底,退出
|
||||
}
|
||||
// 如果返回地址不为0,说明是一个有效的栈帧,保存返回地址
|
||||
if (frame.ret_addr) {
|
||||
trace->entries[trace->nr_entries++] = frame.ret_addr;
|
||||
printk("save_stack_trace_user_remote %d ret_addr:%lx\n", tsk->pid,
|
||||
frame.ret_addr);
|
||||
// printk("save_stack_trace_user_remote %d ret_addr:%lx\n", tsk->pid,
|
||||
// frame.ret_addr);
|
||||
} else {
|
||||
printk("save_stack_trace_user_remote %d no ret_addr", tsk->pid);
|
||||
// printk("save_stack_trace_user_remote %d no ret_addr", tsk->pid);
|
||||
break;
|
||||
// continue;
|
||||
}
|
||||
|
||||
// 如果fp指向自己,说明已经到了栈底,退出
|
||||
if (fp == frame.next_fp) {
|
||||
printk("save_stack_trace_user_remote %d fp == next_fp", tsk->pid);
|
||||
// printk("save_stack_trace_user_remote %d fp == next_fp", tsk->pid);
|
||||
break;
|
||||
}
|
||||
fp = frame.next_fp; // 否则,继续向下遍历
|
||||
@@ -237,18 +237,18 @@ static void diagnose_save_stack_trace_user_remote(struct task_struct *tsk,
|
||||
* Trace user stack if we are not a kernel thread
|
||||
*/
|
||||
if (tsk->mm) {
|
||||
printk("save_stack_trace_user_remote %d mm\n", tsk->pid);
|
||||
// printk("save_stack_trace_user_remote %d mm\n", tsk->pid);
|
||||
save_stack_trace_user_remote(tsk, &trace);
|
||||
}
|
||||
if (trace.nr_entries < trace.max_entries)
|
||||
trace.entries[trace.nr_entries++] = ULONG_MAX;
|
||||
|
||||
printk("save_stack_trace_user_remote %d, stack: [", tsk->pid);
|
||||
int i = 0;
|
||||
for (i = 0; i < BACKTRACE_DEPTH; i++) {
|
||||
printk("%lx, ", backtrace[i]);
|
||||
}
|
||||
printk("]\n");
|
||||
// printk("save_stack_trace_user_remote %d, stack: [", tsk->pid);
|
||||
// int i = 0;
|
||||
// for (i = 0; i < BACKTRACE_DEPTH; i++) {
|
||||
// printk("%lx, ", backtrace[i]);
|
||||
// }
|
||||
// printk("]\n");
|
||||
}
|
||||
|
||||
static int diagnose_task_raw_stack_remote(struct task_struct *tsk, void *to,
|
||||
@@ -384,10 +384,10 @@ void diag_task_user_stack(struct task_struct *tsk, user_stack_detail *detail) {
|
||||
detail->bp = bp;
|
||||
|
||||
if (tsk == current) {
|
||||
printk("diag_task_user_stack %d current\n", tsk->pid);
|
||||
// printk("diag_task_user_stack %d current\n", tsk->pid);
|
||||
diagnose_save_stack_trace_user(detail->stack);
|
||||
} else {
|
||||
printk("diag_task_user_stack %d no current\n", tsk->pid);
|
||||
// printk("diag_task_user_stack %d no current\n", tsk->pid);
|
||||
diagnose_save_stack_trace_user_remote(tsk, detail->stack);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user