mirror of https://gitee.com/openkylin/linux.git
4ace6139bf
The majority of SMP platforms handle their IPIs through do_IRQ() which calls irq_{enter/exit}(). When a call function IPI is received, smp_call_function_interrupt() is called which also calls irq_{enter,exit}(), meaning irq_count is raised twice. When tick broadcasting is used (which is implemented via a call function IPI), this incorrectly causes all CPU idle time on the core receiving broadcast ticks to be accounted as time spent servicing IRQs, as account_process_tick() will account as such if irq_count is greater than 1. This results in 100% CPU usage being reported on a core which receives its ticks via broadcast. This patch removes the SMP smp_call_function_interrupt() wrapper which calls irq_{enter,exit}(). Platforms which handle their IPIs through do_IRQ() now call generic_smp_call_function_interrupt() directly to avoid incrementing irq_count a second time. Platforms which don't (loongson, sgi-ip27, sibyte) call generic_smp_call_function_interrupt() wrapped in irq_{enter,exit}(). Signed-off-by: Alex Smith <alex.smith@imgtec.com> Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/10770/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org> |
||
---|---|---|
.. | ||
Kconfig | ||
Makefile | ||
Platform | ||
msp_elb.c | ||
msp_eth.c | ||
msp_hwbutton.c | ||
msp_irq.c | ||
msp_irq_cic.c | ||
msp_irq_per.c | ||
msp_irq_slp.c | ||
msp_pci.c | ||
msp_prom.c | ||
msp_serial.c | ||
msp_setup.c | ||
msp_smp.c | ||
msp_time.c | ||
msp_usb.c |