[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <38799.1542740608@turing-police.cc.vt.edu>
Date: Tue, 20 Nov 2018 14:03:28 -0500
From: valdis.kletnieks@...edu
To: Pintu Agarwal <pintu.ping@...il.com>
Cc: open list <linux-kernel@...r.kernel.org>,
linux-arm-kernel@...ts.infradead.org,
Russell King - ARM Linux <linux@...linux.org.uk>,
kernelnewbies@...nelnewbies.org,
Jungseok Lee <jungseoklee85@...il.com>,
catalin.marinas@....com, will.deacon@....com,
Takahiro Akashi <takahiro.akashi@...aro.org>,
mark.rutland@....com, Sungjinn Chung <barami97@...il.com>
Subject: Re: [ARM64] Printing IRQ stack usage information
On Tue, 20 Nov 2018 18:21:33 +0530, Pintu Agarwal said:
> + sp = current_stack_pointer;
> + if (on_irq_stack(sp, cpu)) {
> + stack_start = (unsigned long)per_cpu(irq_stack, cpu);
> + last_usage = per_cpu(irq_stack_usage, cpu);
> + curr_usage = sp - stack_start;
> + pr_info("cpu:%d : sp: %lu, stack_start: %lu, usage: %lu\n", cpu, sp, stack_start, (sp - stack_start));
> + if (curr_usage > last_usage)
> + per_cpu(irq_stack_usage, cpu) = curr_usage;
> + }
This code only works if called from the function that uses the deepest
amount of stack, because curr_usage depends on the current stack
pointer. If some other routine went 2,934 bytes further into the stack
and then returned, you'll never know.
What you want instead is a way to see what the deepest point reached during
the current call, and compare that to the previous low.
How to detect the used stack? Go look at how the code currently
detects how deep the kernel stacks reached. (Hint 1: look at check_stack_usage()
in kernel/exit.c and stack_not_used(). Hint 2: what other support code
is implied by the implementation of stack_not used()?
> Which is the best place to invoke this ?
> I have the following option:
> 1. kernel/softirq.c => __do_softirq()
> 2. arch/arm64/kernel/smp.c => handle_IPI()
> 3. kernel/softirq.c => irq_exit()
> 4. ???
Pondering the above, what other implementations might work? Hint: if
you have a similar irq_stack_not_used() function, do you need any
additional code in *any* of those 4 places?
(And yes, I could just splat out the needed code - but you'd learn nowhere
near as much that way.. :)
Content of type "application/pgp-signature" skipped
Powered by blists - more mailing lists