Messages in this thread | | | Date | Thu, 5 Nov 2009 12:08:57 +0100 | From | Andi Kleen <> | Subject | Re: [PATCH] RFC x86_64 more accurate KSTK_ESP implementation |
| |
> +void update_usersp(struct pt_regs *regs) > +{ > + unsigned long stk = (unsigned long)task_stack_page(current); > + unsigned long stkp = (regs)->sp; > + > + if (((stkp < stk) || (stkp >= stk + THREAD_SIZE)) > + && regs->ip < PAGE_OFFSET) > + percpu_write(old_rsp, stkp);
This does not handle interrupt and exception stacks correctly.
Also regs->ip is never a safe check for running in user space, because a program can set the IP to a arbitrary value for a one instruction window.
The larger problem is also if the kernel moves to no-tick-for-non-idle (which I guess will happen sooner or later) your method won't work anyways, or again be arbitarily inaccurate. Even today 10ms worst time inaccuracy for HZ=100 is rather bad, there can be a lot of stack allocations in that time. And adding new dependencies on a regular timer when everything else is moving away from that doesn't seem right.
Also I suspect this method won't work on preempt-rt without additional tweaks.
-Andi
| |