OSDN Git Service

genirq: honour default IRQ affinity setting during migration
authorPavankumar Kondeti <pkondeti@codeaurora.org>
Fri, 16 Jun 2017 04:06:25 +0000 (09:36 +0530)
committerPavankumar Kondeti <pkondeti@codeaurora.org>
Fri, 30 Jun 2017 05:11:00 +0000 (10:41 +0530)
Userspace can set the default IRQ affinity setting by writing into
/proc/irq/default_smp_affinity file. When an IRQ affinity is
broken during isolation/hotplug,override the affinity to online and
un-isolated CPUs from the default affinity CPUs. If no such CPU
is available, then only override with cpu_online_mask.

Change-Id: I7578728ed0d7c17c5890d9916cfd6451d1968568
Signed-off-by: Pavankumar Kondeti <pkondeti@codeaurora.org>
kernel/irq/cpuhotplug.c

index 3dc1dbd..4684b75 100644 (file)
@@ -36,10 +36,21 @@ static bool migrate_one_irq(struct irq_desc *desc)
        affinity = &available_cpus;
 
        if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) {
+               /*
+                * The order of preference for selecting a fallback CPU is
+                *
+                * (1) online and un-isolated CPU from default affinity
+                * (2) online and un-isolated CPU
+                * (3) online CPU
+                */
                cpumask_andnot(&available_cpus, cpu_online_mask,
                                                        cpu_isolated_mask);
-               if (cpumask_empty(affinity))
+               if (cpumask_intersects(&available_cpus, irq_default_affinity))
+                       cpumask_and(&available_cpus, &available_cpus,
+                                                       irq_default_affinity);
+               else if (cpumask_empty(&available_cpus))
                        affinity = cpu_online_mask;
+
                /*
                 * We are overriding the affinity with all online and
                 * un-isolated cpus. irq_set_affinity_locked() call