]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - kernel/irq/cpuhotplug.c
Merge tag 'modules-for-v5.6' of git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux
[linux.git] / kernel / irq / cpuhotplug.c
index 6c7ca2e983a595ff561396e3d3b9400072426c56..02236b13b359974e95a2e3ca4ec3f0cadfd0962a 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/interrupt.h>
 #include <linux/ratelimit.h>
 #include <linux/irq.h>
+#include <linux/sched/isolation.h>
 
 #include "internals.h"
 
@@ -171,6 +172,20 @@ void irq_migrate_all_off_this_cpu(void)
        }
 }
 
+static bool hk_should_isolate(struct irq_data *data, unsigned int cpu)
+{
+       const struct cpumask *hk_mask;
+
+       if (!housekeeping_enabled(HK_FLAG_MANAGED_IRQ))
+               return false;
+
+       hk_mask = housekeeping_cpumask(HK_FLAG_MANAGED_IRQ);
+       if (cpumask_subset(irq_data_get_effective_affinity_mask(data), hk_mask))
+               return false;
+
+       return cpumask_test_cpu(cpu, hk_mask);
+}
+
 static void irq_restore_affinity_of_irq(struct irq_desc *desc, unsigned int cpu)
 {
        struct irq_data *data = irq_desc_get_irq_data(desc);
@@ -188,9 +203,11 @@ static void irq_restore_affinity_of_irq(struct irq_desc *desc, unsigned int cpu)
        /*
         * If the interrupt can only be directed to a single target
         * CPU then it is already assigned to a CPU in the affinity
-        * mask. No point in trying to move it around.
+        * mask. No point in trying to move it around unless the
+        * isolation mechanism requests to move it to an upcoming
+        * housekeeping CPU.
         */
-       if (!irqd_is_single_target(data))
+       if (!irqd_is_single_target(data) || hk_should_isolate(data, cpu))
                irq_set_affinity_locked(data, affinity, false);
 }