]> www.infradead.org Git - users/jedix/linux-maple.git/commit
genirq: Get rid of global lock in irq_do_set_affinity()
authorMarc Zyngier <maz@kernel.org>
Mon, 26 Aug 2024 08:06:18 +0000 (09:06 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Tue, 27 Aug 2024 11:54:15 +0000 (13:54 +0200)
commit64b6d1d7a84538de34c22a6fc92a7dcc2b196b64
tree954e57573070b44ed7169e34aca0916e6dff31d2
parent17e28a9aeae40d2de3c1ea3b94819ed94bfd6392
genirq: Get rid of global lock in irq_do_set_affinity()

Kunkun Jiang reports that for a workload involving the simultaneous startup
of a large number of VMs (for a total of about 200 vcpus), a lot of CPU
time gets spent on spinning on the tmp_mask_lock that exists as a static
raw spinlock in irq_do_set_affinity(). This lock protects a global cpumask
(tmp_mask) that is used as a temporary variable to compute the resulting
affinity.

While this is triggered by KVM issuing a irq_set_affinity() call each time
a vcpu is about to execute, it is obvious that having a single global
resource is not very scalable.

Since a cpumask can be a fairly large structure on systems with a high core
count, a stack allocation is not really appropriate.  Instead, turn the
global cpumask into a per-CPU variable, removing the need for locking
altogether as the code is executed with preemption and interrupts disabled.

[ tglx: Moved the per CPU variable declaration outside of the function ]

Reported-by: Kunkun Jiang <jiangkunkun@huawei.com>
Suggested-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Kunkun Jiang <jiangkunkun@huawei.com>
Link: https://lore.kernel.org/all/20240826080618.3886694-1-maz@kernel.org
Link: https://lore.kernel.org/all/a7fc58e4-64c2-77fc-c1dc-f5eb78dbbb01@huawei.com
kernel/irq/manage.c