OSDN Git Service

kernel: Don't allow IRQ affinity masks to have more than one CPU
authorSultan Alsawaf <sultan@kerneltoast.com>
Sun, 26 May 2019 05:48:20 +0000 (22:48 -0700)
committer0ranko0P <ranko0p@outlook.com>
Sat, 7 Dec 2019 10:01:16 +0000 (18:01 +0800)
Even with an affinity mask that has multiple CPUs set, IRQs always run
on the first CPU in their affinity mask. Drivers that register an IRQ
affinity notifier (such as pm_qos) will therefore have an incorrect
assumption of where an IRQ is affined.

Fix the IRQ affinity mask deception by forcing it to only contain one
set CPU.

Signed-off-by: Sultan Alsawaf <sultan@kerneltoast.com>
kernel/irq/manage.c

index 68ac2d5..65b0425 100644 (file)
@@ -214,6 +214,8 @@ int irq_do_set_affinity(struct irq_data *data, const struct cpumask *mask,
        struct irq_chip *chip = irq_data_get_irq_chip(data);
        int ret;
 
+       /* IRQs only run on the first CPU in the affinity mask; reflect that */
+       mask = cpumask_of(cpumask_first(mask));
        ret = chip->irq_set_affinity(data, mask, force);
        switch (ret) {
        case IRQ_SET_MASK_OK: