x86_64: could increment fp when getting wchan?

January 21st, 2011 - 09:00 am ET by Hillf Danton | Report spam
When getting wchan (wait channel?) the stack of given task is scanned
for IP that is not in the scheduling area. What looks odd is the IP
could be checked as many times as allowed in the loop without changing
the location on stack. Could the IP be checked up stair the stack?

Hillf


a/arch/x86/kernel/process_64.c 2011-01-05 08:50:20.000000000 +0800
+++ b/arch/x86/kernel/process_64.c 2011-01-21 21:46:04.000000000 +0800
@@ -543,7 +543,7 @@ unsigned long get_wchan(struct task_stru
ip = *(u64 *)(fp+8);
if (!in_sched_functions(ip))
return ip;
- fp = *(u64 *)fp;
+ fp += 8;
} while (count++ < 16);
return 0;
}
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
email Follow the discussionReplies 1 replyReplies Make a reply

Replies

#1 Thomas Gleixner
January 21st, 2011 - 09:10 am ET | Report spam
On Fri, 21 Jan 2011, Hillf Danton wrote:

When getting wchan (wait channel?) the stack of given task is scanned
for IP that is not in the scheduling area. What looks odd is the IP
could be checked as many times as allowed in the loop without changing
the location on stack. Could the IP be checked up stair the stack?



Errm.

Hillf


a/arch/x86/kernel/process_64.c 2011-01-05 08:50:20.000000000 +0800
+++ b/arch/x86/kernel/process_64.c 2011-01-21 21:46:04.000000000 +0800
@@ -543,7 +543,7 @@ unsigned long get_wchan(struct task_stru
ip = *(u64 *)(fp+8);



IP (Return address) is read from stack via fp (Frame pointer)

if (!in_sched_functions(ip))
return ip;
- fp = *(u64 *)fp;



Now fp is set to the next stack frame, so the next loop will read a
different IP.

+ fp += 8;
} while (count++ < 16);
return 0;
}



Thanks,

tglx

To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

Similar topics