android_kernel_motorola_sm6375/kernel/irq
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Thomas Gleixner 2463a30f66 genirq/proc: Reject invalid affinity masks (again)
commit cba6437a1854fde5934098ec3bd0ee83af3129f5 upstream.

Qian Cai reported that the WARN_ON() in the x86/msi affinity setting code,
which catches cases where the affinity setting is not done on the CPU which
is the current target of the interrupt, triggers during CPU hotplug stress
testing.

It turns out that the warning which was added with the commit addressing
the MSI affinity race unearthed yet another long standing bug.

If user space writes a bogus affinity mask, i.e. it contains no online CPUs,
then it calls irq_select_affinity_usr(). This was introduced for ALPHA in

  eee45269b0 ("[PATCH] Alpha: convert to generic irq framework (generic part)")

and subsequently made available for all architectures in

  1840475676 ("genirq: Expose default irq affinity mask (take 3)")

which introduced the circumvention of the affinity setting restrictions for
interrupt which cannot be moved in process context.

The whole exercise is bogus in various aspects:

  1) If the interrupt is already started up then there is absolutely
     no point to honour a bogus interrupt affinity setting from user
     space. The interrupt is already assigned to an online CPU and it
     does not make any sense to reassign it to some other randomly
     chosen online CPU.

  2) If the interupt is not yet started up then there is no point
     either. A subsequent startup of the interrupt will invoke
     irq_setup_affinity() anyway which will chose a valid target CPU.

So the only correct solution is to just return -EINVAL in case user space
wrote an affinity mask which does not contain any online CPUs, except for
ALPHA which has it's own magic sauce for this.

Fixes: 1840475676 ("genirq: Expose default irq affinity mask (take 3)")
Reported-by: Qian Cai <cai@lca.pw>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Qian Cai <cai@lca.pw>
Link: https://lkml.kernel.org/r/878sl8xdbm.fsf@nanos.tec.linutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2020-02-28 17:22:26 +01:00
..
affinity.c genirq/affinity: Remove const qualifier from node_to_cpumask argument 2019-08-28 12:20:43 +02:00
autoprobe.c genirq: Delay deactivation in free_irq() 2019-07-03 10:12:28 +02:00
chip.c Merge branch 'x86-apic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2019-07-08 11:22:57 -07:00
cpuhotplug.c genirq: Delay deactivation in free_irq() 2019-07-03 10:12:28 +02:00
debug.h
debugfs.c x86/apic/msi: Plug non-maskable MSI affinity race 2020-02-11 04:35:54 -08:00
devres.c
dummychip.c
generic-chip.c
handle.c
internals.h genirq/proc: Reject invalid affinity masks (again) 2020-02-28 17:22:26 +01:00
ipi.c
irq_sim.c
irqdesc.c genirq: Properly pair kobject_del() with kobject_add() 2019-08-19 21:41:19 +02:00
irqdomain.c irqdomain: Fix a memory leak in irq_domain_push_irq() 2020-02-11 04:35:14 -08:00
Kconfig
Makefile genirq/timings: Add selftest for circular array 2019-06-12 10:47:04 +02:00
manage.c genirq/proc: Reject invalid affinity masks (again) 2020-02-28 17:22:26 +01:00
matrix.c
migration.c
msi.c x86/apic/msi: Plug non-maskable MSI affinity race 2020-02-11 04:35:54 -08:00
pm.c PCI: irq: Introduce rearm_wake_irq() 2019-07-23 09:37:51 +02:00
proc.c genirq/proc: Reject invalid affinity masks (again) 2020-02-28 17:22:26 +01:00
resend.c genirq: Prevent NULL pointer dereference in resend_irqs() 2019-09-05 21:31:14 +02:00
settings.h
spurious.c
timings.c genirq/timings: Add selftest for next event computation 2019-06-12 10:47:05 +02:00