android_kernel_oneplus_msm8998/arch/x86/kernel/apic
Mika Westerberg eba90a4c76 x86/irq: Prevent force migration of irqs which are not in the vector domain
commit db91aa793ff984ac048e199ea1c54202543952fe upstream.

When a CPU is about to be offlined we call fixup_irqs() that resets IRQ
affinities related to the CPU in question. The same thing is also done when
the system is suspended to S-states like S3 (mem).

For each IRQ we try to complete any on-going move regardless whether the
IRQ is actually part of x86_vector_domain. For each IRQ descriptor we fetch
its chip_data, assume it is of type struct apic_chip_data and manipulate it
by clearing old_domain mask etc. For irq_chips that are not part of the
x86_vector_domain, like those created by various GPIO drivers, will find
their chip_data being changed unexpectly.

Below is an example where GPIO chip owned by pinctrl-sunrisepoint.c gets
corrupted after resume:

  # cat /sys/kernel/debug/gpio
  gpiochip0: GPIOs 360-511, parent: platform/INT344B:00, INT344B:00:
   gpio-511 (                    |sysfs               ) in  hi

  # rtcwake -s10 -mmem
  <10 seconds passes>

  # cat /sys/kernel/debug/gpio
  gpiochip0: GPIOs 360-511, parent: platform/INT344B:00, INT344B:00:
   gpio-511 (                    |sysfs               ) in  ?

Note '?' in the output. It means the struct gpio_chip ->get function is
NULL whereas before suspend it was there.

Fix this by first checking that the IRQ belongs to x86_vector_domain before
we try to use the chip_data as struct apic_chip_data.

Reported-and-tested-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Link: http://lkml.kernel.org/r/20161003101708.34795-1-mika.westerberg@linux.intel.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2016-10-16 17:36:15 +02:00
..
apic.c x86/apic: Do not init irq remapping if ioapic is disabled 2016-09-15 08:27:53 +02:00
apic_flat_64.c x86/smpboot: Remove APIC.wait_for_init_deassert and atomic init_deasserted 2015-08-17 10:42:28 +02:00
apic_noop.c x86/smpboot: Remove APIC.wait_for_init_deassert and atomic init_deasserted 2015-08-17 10:42:28 +02:00
apic_numachip.c x86/numachip: Fix NumaConnect2 MMCFG PCI access 2015-12-30 19:19:03 +01:00
bigsmp_32.c x86/smpboot: Remove APIC.wait_for_init_deassert and atomic init_deasserted 2015-08-17 10:42:28 +02:00
htirq.c x86: Constify irqdomain ops 2015-05-05 11:14:48 +02:00
hw_nmi.c nmi: x86: convert to generic nmi handler 2015-07-17 12:23:30 +01:00
io_apic.c x86/irq: Call chip->irq_set_affinity in proper context 2016-03-03 15:07:30 -08:00
ipi.c x86: Delete non-required instances of include <linux/init.h> 2014-01-06 21:25:18 -08:00
Makefile x86, irq: Move HT IRQ related code from io_apic.c into htirq.c 2014-12-16 14:08:17 +01:00
msi.c x86/irq: Use accessor irq_data_get_irq_handler_data() 2015-07-13 21:22:46 +02:00
probe_32.c x86/smpboot: Remove APIC.wait_for_init_deassert and atomic init_deasserted 2015-08-17 10:42:28 +02:00
probe_64.c
vector.c x86/irq: Prevent force migration of irqs which are not in the vector domain 2016-10-16 17:36:15 +02:00
x2apic_cluster.c Merge branch 'x86-cleanups-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2015-09-01 09:33:26 -07:00
x2apic_phys.c x86/smpboot: Remove APIC.wait_for_init_deassert and atomic init_deasserted 2015-08-17 10:42:28 +02:00
x2apic_uv_x.c x86/smpboot: Remove APIC.wait_for_init_deassert and atomic init_deasserted 2015-08-17 10:42:28 +02:00