On Thu, 17 Aug 2006 15:57:28 +0200, Franck Bui-Huu <vagabon.xyz@gmail.com>
wrote:
> This array was used to 'cache' some frame info about scheduler
> functions to speed up get_wchan(). This array was 1Ko size and
> was only used when CONFIG_KALLSYMS was set but declared for all
> configs.
>
> Rather than make the array statement conditional, this patches
> removes this array and its uses. Indeed the common case doesn't
> seem to use this array and get_wchan() is not a critical path
> anyways.
It looks good basically, but a few fixes are required.
> static int __init frame_info_init(void)
> {
> - int i;
> + unsigned long size = 0;
You must pass some non-zero size even if CONFIG_KALLSYMS was not set.
Otherwise schedule_mfi will not be initialized as expected. Actually,
this is not a problem of this patch, but we missed this point on
previous cleanups for the get_frame_info()...
> +unsigned long get_wchan(struct task_struct *task)
> +{
> + unsigned long stack_page = (unsigned long)task_stack_page(task);
This should be done after "if (!task ..." check.
> + unsigned long pc = 0;
> +#ifdef CONFIG_KALLSYMS
> + unsigned long sp = task->thread.reg29;
Same. And you missed one stack level.
sp = task->thread.reg29 + schedule_mfi.frame_size;
> +#endif
> +
> + if (!task || task == current || task->state == TASK_RUNNING)
> + goto out;
> + if (!stack_page)
> + goto out;
> +
> + pc = thread_saved_pc(task);
> +
> +#ifdef CONFIG_KALLSYMS
> + while (in_sched_functions(pc))
> + pc = unwind_stack(task, &sp, pc, 0);
> +#endif
> +
> +out:
> + return pc;
> +}
Thanks for your work.
---
Atsushi Nemoto
|