[Crash-utility] [PATCH] task.c: avoid unnecessary cpu cycles during init
lijiang
lijiang at redhat.com
Tue Nov 17 04:00:48 UTC 2020
在 2020年11月14日 04:46, Hari Bathini 写道:
> While stkptr_to_task does the job of trying to match a stack pointer
> to a task, it runs through each task's stack to find whether the given
> SP falls into its range. This can be a very expensive operation, if
> the vmcore is from a system running too many tasks. It can get even
> worse when the total number of CPUs on the system is in the order of
> thousands. Given the expensive nature of the operation, it must be
> optimized as much as possible. Possible options to optimize:
>
> 1) Get min & max of the stack range in first pass and use these
> values against the given SP to decide whether or not to proceed
> with stack lookup.
> 2) Use multithreading to parallely update irq_tasks.
> 3) Skip stkptr_to_task() when SP is 0
>
> Though option 3 is a low hanging fruit, it significantly improved the
> time taken between starting crash utility & reaching crash prompt.
> Implement option 3 to optimize while listing the other two options
> as TODO items for follow-up.
>
> Signed-off-by: Hari Bathini <hbathini at linux.ibm.com>
> ---
>
> On a system with about 1500 CPUs 165K running tasks, it was taking
> about a day to get to the crash prompt without this patch, while it
> takes only about 5-10 mins with this change..
>
>
> task.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
> diff --git a/task.c b/task.c
> index 8dd2b96..423cd45 100644
> --- a/task.c
> +++ b/task.c
> @@ -713,6 +713,7 @@ irqstacks_init(void)
> } else
> error(WARNING, "cannot determine hardirq_ctx addresses\n");
>
> + /* TODO: Use multithreading to parallely update irq_tasks. */
> for (i = 0; i < NR_CPUS; i++) {
> if (!(tt->hardirq_ctx[i]))
> continue;
> @@ -5005,6 +5006,10 @@ pid_exists(ulong pid)
> /*
> * Translate a stack pointer to a task, dealing with possible split.
> * If that doesn't work, check the hardirq_stack and softirq_stack.
> + *
> + * TODO: This function can be optimized by getting min & max of the
> + * stack range in first pass and use these values against the
> + * given SP to decide whether or not to proceed with stack lookup.
> */
> ulong
> stkptr_to_task(ulong sp)
> @@ -5013,6 +5018,9 @@ stkptr_to_task(ulong sp)
> struct task_context *tc;
> struct bt_info bt_info, *bt;
>
> + if (!sp)
> + return NO_TASK;
> +
> bt = &bt_info;
> tc = FIRST_CONTEXT();
> for (i = 0; i < RUNNING_TASKS(); i++, tc++) {
>
>
Thank you for the improvement, Hari.
Acked-by: Lianbo Jiang <lijiang at redhat.com>
More information about the Crash-utility
mailing list