Re: [PATCH 0/2] sparc64: Use low latency path to resume idle cpu

From: Vijay Kumar
Date: Thu Jul 20 2017 - 22:43:59 EST




On 7/20/2017 2:57 PM, David Miller wrote:
From: Vijay Kumar <vijay.ac.kumar@xxxxxxxxxx>
Date: Sat, 8 Jul 2017 14:23:42 -0600

cpu_poke is a low latency path to resume the target cpu if suspended
using cpu_yield. Use cpu poke to resume cpu if supported by hypervisor.

hackbench results (lower is better):
Number of
Process: w/o fix with fix
1 0.012 0.010
10 0.021 0.019
100 0.151 0.148
So this only works for a cpu which has yielded.

The kernel sends reschedule events to both idle and non-idle cpus.
That's why you have to have that fallback code to still send the
mondo IPI right?
That is correct.


For the case where POKE works, it seems like completely unnecessary
overhead to set the PIL interrupt. Just disable local cpu interrupts
and call schedule_ipi() directly.

I bet that improves your benchmark even more.

I had same thoughts initially but I had to go with this approach as scheduler_ipi is wrapped with irq_enter() and irq_exit(). Whereas POKE resumes the cpu in process context.

Comments in scheduler_ipi():

* Not all reschedule IPI handlers call irq_enter/irq_exit, since
* traditionally all their work was done from the interrupt return
* path. Now that we actually do some work, we need to make sure
* we do call them.
*
* Some archs already do call them, luckily irq_enter/exit nest
* properly.
*
* Arguably we should visit all archs and update all handlers,
* however a fair share of IPIs are still resched only so this would
* somewhat pessimize the simple resched case.
*/
irq_enter();


-Vijay