linux/arch/powerpc/sysdev
Paul Mackerras 9fb1b36ca1 powerpc: Make sure IPI handlers see data written by IPI senders
We have been observing hangs, both of KVM guest vcpu tasks and more
generally, where a process that is woken doesn't properly wake up and
continue to run, but instead sticks in TASK_WAKING state.  This
happens because the update of rq->wake_list in ttwu_queue_remote()
is not ordered with the update of ipi_message in
smp_muxed_ipi_message_pass(), and the reading of rq->wake_list in
scheduler_ipi() is not ordered with the reading of ipi_message in
smp_ipi_demux().  Thus it is possible for the IPI receiver not to see
the updated rq->wake_list and therefore conclude that there is nothing
for it to do.

In order to make sure that anything done before smp_send_reschedule()
is ordered before anything done in the resulting call to scheduler_ipi(),
this adds barriers in smp_muxed_message_pass() and smp_ipi_demux().
The barrier in smp_muxed_message_pass() is a full barrier to ensure that
there is a full ordering between the smp_send_reschedule() caller and
scheduler_ipi().  In smp_ipi_demux(), we use xchg() rather than
xchg_local() because xchg() includes release and acquire barriers.
Using xchg() rather than xchg_local() makes sense given that
ipi_message is not just accessed locally.

This moves the barrier between setting the message and calling the
cause_ipi() function into the individual cause_ipi implementations.
Most of them -- those that used outb, out_8 or similar -- already had
a full barrier because out_8 etc. include a sync before the MMIO
store.  This adds an explicit barrier in the two remaining cases.

These changes made no measurable difference to the speed of IPIs as
measured using a simple ping-pong latency test across two CPUs on
different cores of a POWER7 machine.

The analysis of the reason why processes were not waking up properly
is due to Milton Miller.

Cc: stable@vger.kernel.org # v3.0+
Reported-by: Milton Miller <miltonm@bga.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
2012-09-05 16:05:22 +10:00
..
bestcomm powerpc: various straight conversions from module.h --> export.h 2011-10-31 19:30:44 -04:00
ge Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc 2012-03-21 18:55:10 -07:00
qe_lib powerpc/qe: set IReady in QE Microcode Upload 2012-07-10 07:08:58 -05:00
xics powerpc: Make sure IPI handlers see data written by IPI senders 2012-09-05 16:05:22 +10:00
6xx-suspend.S powerpc: Use CURRENT_THREAD_INFO instead of open coded assembly 2012-07-11 14:18:22 +10:00
axonram.c fs: move code out of buffer.c 2012-01-03 22:54:07 -05:00
cpm1.c irq_domain/powerpc: constify irq_domain_ops 2012-02-16 06:11:24 -07:00
cpm2_pic.c powerpc/irqdomain: Fix broken NR_IRQ references 2012-04-30 10:45:26 +10:00
cpm2_pic.h powerpc/cpm2: Checkpatch cleanup 2010-03-04 10:43:58 -06:00
cpm2.c powerpc/fsl-cpm: Configure clock correctly for SCC 2010-04-19 23:13:03 -05:00
cpm_common.c Disintegrate asm/system.h for PowerPC 2012-03-28 18:30:02 +01:00
dart_iommu.c treewide: Convert uses of struct resource to resource_size(ptr) 2011-06-10 14:55:36 +02:00
dart.h
dcr-low.S powerpc/4xx: Extended DCR support v2 2008-12-21 14:21:15 +11:00
dcr.c powerpc: add export.h to files making use of EXPORT_SYMBOL 2011-10-31 19:30:37 -04:00
ehv_pic.c irq_domain/powerpc: constify irq_domain_ops 2012-02-16 06:11:24 -07:00
fsl_85xx_cache_ctlr.h powerpc/85xx: Fix sram_offset parameter type 2012-07-26 13:24:32 -05:00
fsl_85xx_cache_sram.c powerpc/85xx: Fix compiler error with THIS_MODULE and related 2012-03-16 14:50:25 -05:00
fsl_85xx_l2ctlr.c powerpc/85xx: Fix sram_offset parameter type 2012-07-26 13:24:32 -05:00
fsl_gtm.c powerpc: add export.h to files making use of EXPORT_SYMBOL 2011-10-31 19:30:37 -04:00
fsl_ifc.c powerpc/fsl: Add support for Integrated Flash Controller 2012-01-04 15:41:22 -06:00
fsl_lbc.c powerpc/85xx: Add lbc suspend support for PM 2011-11-24 02:01:40 -06:00
fsl_msi.c Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc 2012-03-21 18:55:10 -07:00
fsl_msi.h irq_domain/powerpc: Use common irq_domain structure instead of irq_host 2012-02-14 14:06:50 -07:00
fsl_pci.c powerpc/fsl-pci: Only scan PCI bus if configured as a host 2012-08-03 08:25:52 -05:00
fsl_pci.h powerpc/fsl-pci: get PCI init out of board files 2012-07-11 07:49:33 -05:00
fsl_pmc.c powerpc: add export.h to files making use of EXPORT_SYMBOL 2011-10-31 19:30:37 -04:00
fsl_rio.c powerpc/srio: Fix the relocation errors when building with 64bit 2012-03-16 10:46:30 -05:00
fsl_rio.h fsl-rio: Add two ports and rapidio message units support 2011-11-24 02:01:34 -06:00
fsl_rmu.c powerpc/srio: Fix the compile errors when building with 64bit 2012-03-16 10:46:30 -05:00
fsl_soc.c Disintegrate asm/system.h for PowerPC 2012-03-28 18:30:02 +01:00
fsl_soc.h Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/fbdev-3.x into fbdev-next 2011-08-29 09:14:30 +00:00
grackle.c powerpc: rename ppc_pci_*_flags to pci_*_flags 2011-07-12 09:28:04 -05:00
i8259.c irq_domain: Add support for base irq and hwirq in legacy mappings 2012-02-16 06:11:23 -07:00
indirect_pci.c Fix common misspellings 2011-03-31 11:26:23 -03:00
ipic.c irq_domain/powerpc: Replace custom xlate functions with library functions 2012-02-16 06:11:24 -07:00
ipic.h irq_domain/powerpc: Use common irq_domain structure instead of irq_host 2012-02-14 14:06:50 -07:00
Kconfig powerpc: Move GE PIC drivers 2012-03-16 11:08:11 -05:00
Makefile powerpc: add support for MPIC message register API 2012-03-16 16:15:28 -05:00
micropatch.c powerpc/cpm1: Mark micropatch code/data static and __init 2010-07-11 11:04:06 -05:00
mmio_nvram.c treewide: Convert uses of struct resource to resource_size(ptr) 2011-06-10 14:55:36 +02:00
mpc5xxx_clocks.c powerpc: add export.h to files making use of EXPORT_SYMBOL 2011-10-31 19:30:37 -04:00
mpc8xx_pic.c powerpc/8xx: Fix NR_IRQ bugs and refactor 8xx interrupt controller 2012-04-30 10:45:25 +10:00
mpc8xx_pic.h
mpic_msgr.c powerpc/mpic_msgr: Add missing includes 2012-08-24 20:26:04 +10:00
mpic_msi.c Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc 2012-03-21 18:55:10 -07:00
mpic_pasemi_msi.c powerpc: Convert to new irq_* function names 2011-03-29 14:48:12 +02:00
mpic_u3msi.c powerpc: Convert to new irq_* function names 2011-03-29 14:48:12 +02:00
mpic.c powerpc/mpic: Create a revmap with enough entries for IPIs and timers 2012-07-23 14:20:42 +10:00
mpic.h powerpc: mpic irq_data conversion. 2011-03-10 11:03:56 +11:00
msi_bitmap.c Disintegrate asm/system.h for PowerPC 2012-03-28 18:30:02 +01:00
mv64x60_dev.c powerpc/mv64x60: Suspected typo in assignment 2011-03-02 16:50:05 +11:00
mv64x60_pci.c powerpc/PCI: move fixup hooks from __init to __devinit 2012-06-16 12:44:30 -06:00
mv64x60_pic.c irq_domain: Replace irq_alloc_host() with revmap-specific initializers 2012-02-16 06:11:22 -07:00
mv64x60_udbg.c treewide: Convert uses of struct resource to resource_size(ptr) 2011-06-10 14:55:36 +02:00
mv64x60.h
of_rtc.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
pmi.c powerpc: Fix up modules that should be including module.h 2011-10-31 19:30:38 -04:00
ppc4xx_cpm.c cpu: convert 'cpu' and 'machinecheck' sysdev_class to a regular subsystem 2011-12-21 14:29:42 -08:00
ppc4xx_gpio.c of/gpio: add default of_xlate function if device has a node pointer 2010-07-05 16:14:30 -06:00
ppc4xx_msi.c powerpc/40x: Use {upper,lower}_32_bits for msi_phys 2012-05-03 20:13:13 -04:00
ppc4xx_pci.c powerpc/44x: Add support PCI-E for APM821xx SoC and Bluestone board 2012-03-17 08:49:34 -04:00
ppc4xx_pci.h powerpc/476fpe: Add 476fpe SoC code 2011-12-09 07:51:02 -05:00
ppc4xx_soc.c powerpc/irq: Remove IRQF_DISABLED 2011-11-08 14:51:46 +11:00
rtc_cmos_setup.c powerpc: Fix up modules that should be including module.h 2011-10-31 19:30:38 -04:00
scom.c powerpc: fix system.h fallout in sysdev/scom.c [chroma_defconfig] 2012-04-18 18:11:47 -04:00
simple_gpio.c powerpc: remove non-required uses of include <linux/module.h> 2011-10-31 19:30:44 -04:00
simple_gpio.h powerpc: Implement GPIO driver for simple memory-mapped banks 2008-12-30 11:13:45 -06:00
tsi108_dev.c Disintegrate asm/system.h for PowerPC 2012-03-28 18:30:02 +01:00
tsi108_pci.c irq_domain: Add support for base irq and hwirq in legacy mappings 2012-02-16 06:11:23 -07:00
uic.c irq_domain/powerpc: Replace custom xlate functions with library functions 2012-02-16 06:11:24 -07:00
xilinx_intc.c irq_domain: Replace irq_alloc_host() with revmap-specific initializers 2012-02-16 06:11:22 -07:00
xilinx_pci.c powerpc/virtex: Add support for Xilinx PCI host bridge 2009-06-06 10:14:22 -06:00