[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen staging] x86/smp: do not use scratch_cpumask when in interrupt or exception context

commit d079cc05873904c855bf2fb4d8db72fbb3727c9d
Author:     Roger Pau Monné <roger.pau@xxxxxxxxxx>
AuthorDate: Wed Feb 26 17:38:58 2020 +0100
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Wed Feb 26 17:38:58 2020 +0100

    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
    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
    Fixes: 5500d265a2a8 ('x86/smp: use APIC ALLBUT destination shorthand when 
    Reported-by: Sander Eikelenboom <linux@xxxxxxxxxxxxxx>
    Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
    Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
 xen/arch/x86/smp.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/xen/arch/x86/smp.c b/xen/arch/x86/smp.c
index fac295fa6f..a90c782d53 100644
--- a/xen/arch/x86/smp.c
+++ b/xen/arch/x86/smp.c
@@ -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
generated by git-patchbot for /home/xen/git/xen.git#staging

Xen-changelog mailing list



Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.