x86/smp: do not use scratch_cpumask when in interrupt or exception context

Using scratch_cpumask in send_IPI_mask is not safe in IRQ or exception
context because it can nest, and hence send_IPI_mask could be
overwriting another user scratch cpumask data when used in such
contexts.

Fallback to not using the scratch cpumask (and hence not attemping to
optimize IPI sending by using a shorthand) when in IRQ or exception
context. Note that the scratch cpumask cannot be used when
non-maskable interrupts are being serviced (NMI or #MC) and hence
fallback to not using the shorthand in that case, like it was done
previously.

Fixes: 5500d265a2 ('x86/smp: use APIC ALLBUT destination shorthand when possible')
Reported-by: Sander Eikelenboom <linux@eikelenboom.it>
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Roger Pau Monné authored and Jan Beulich committed 2020-02-26 17:38:58 +01:00
1 parent 125c582bfd
commit d079cc0587
1 file changed
+12
+12
View File
@@ -68,6 +68,18 @@ void send_IPI_mask(const cpumask_t *mask, int vector)
bool cpus_locked = false;
cpumask_t *scratch = this_cpu(scratch_cpumask);
if ( in_irq() || in_mce_handler() || in_nmi_handler() )
{
/*
* When in IRQ, NMI or #MC context fallback to the old (and simpler)
* IPI sending routine, and avoid doing any performance optimizations
* (like using a shorthand) in order to avoid using the scratch
* cpumask which cannot be used in interrupt context.
*/
alternative_vcall(genapic.send_IPI_mask, mask, vector);
return;
}
/*
* This can only be safely used when no CPU hotplug or unplug operations
* are taking place, there are no offline CPUs (unless those have been
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.