linux/arch/powerpc/platforms
Paul Mackerras 5d375199ea KVM: PPC: Book3S HV: Set server for passed-through interrupts
When a guest has a PCI pass-through device with an interrupt, it
will direct the interrupt to a particular guest VCPU.  In fact the
physical interrupt might arrive on any CPU, and then get
delivered to the target VCPU in the emulated XICS (guest interrupt
controller), and eventually delivered to the target VCPU.

Now that we have code to handle device interrupts in real mode
without exiting to the host kernel, there is an advantage to having
the device interrupt arrive on the same sub(core) as the target
VCPU is running on.  In this situation, the interrupt can be
delivered to the target VCPU without any exit to the host kernel
(using a hypervisor doorbell interrupt between threads if
necessary).

This patch aims to get passed-through device interrupts arriving
on the correct core by setting the interrupt server in the real
hardware XICS for the interrupt to the first thread in the (sub)core
where its target VCPU is running.  We do this in the real-mode H_EOI
code because the H_EOI handler already needs to look at the
emulated ICS state for the interrupt (whereas the H_XIRR handler
doesn't), and we know we are running in the target VCPU context
at that point.

We set the server CPU in hardware using an OPAL call, regardless of
what the IRQ affinity mask for the interrupt says, and without
updating the affinity mask.  This amounts to saying that when an
interrupt is passed through to a guest, as a matter of policy we
allow the guest's affinity for the interrupt to override the host's.

This is inspired by an earlier patch from Suresh Warrier, although
none of this code came from that earlier patch.

Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
2016-09-12 10:12:28 +10:00
..
8xx powerpc updates for 4.8 # 1 2016-07-30 21:01:36 -07:00
40x powerpc updates for 4.8 # 1 2016-07-30 21:01:36 -07:00
44x powerpc updates for 4.8 # 1 2016-07-30 21:01:36 -07:00
52xx powerpc: Move 32-bit probe() machine to later in the boot process 2016-07-21 19:06:42 +10:00
82xx powerpc: Move 32-bit probe() machine to later in the boot process 2016-07-21 19:06:42 +10:00
83xx powerpc updates for 4.8 # 1 2016-07-30 21:01:36 -07:00
85xx powerpc updates for 4.8 # 1 2016-07-30 21:01:36 -07:00
86xx powerpc updates for 4.8 # 1 2016-07-30 21:01:36 -07:00
512x powerpc updates for 4.8 # 1 2016-07-30 21:01:36 -07:00
amigaone powerpc: Move 32-bit probe() machine to later in the boot process 2016-07-21 19:06:42 +10:00
cell powerpc/cell: Add missing error code in spufs_mkgang() 2016-08-09 14:50:18 +10:00
chrp powerpc: Get rid of ppc_md.init_early() 2016-07-21 19:07:26 +10:00
embedded6xx powerpc: Get rid of ppc_md.init_early() 2016-07-21 19:07:26 +10:00
maple powerpc: Get rid of ppc_md.init_early() 2016-07-21 19:07:26 +10:00
pasemi powerpc/pasemi: Fix coherent_dma_mask for dma engine 2016-08-08 16:19:09 +10:00
powermac treewide: replace obsolete _refok by __ref 2016-08-02 17:31:41 -04:00
powernv KVM: PPC: Book3S HV: Set server for passed-through interrupts 2016-09-12 10:12:28 +10:00
ps3 RTC for 4.8 2016-08-05 09:48:22 -04:00
pseries powerpc: Fix unused function warning 'lmb_to_memblock' 2016-08-09 16:52:00 +10:00
fsl_uli1575.c of/irq: Refactor interrupt-map parsing 2013-10-24 11:43:04 +01:00
Kconfig RTC for 4.8 2016-08-05 09:48:22 -04:00
Kconfig.cputype powerpc32: provide VIRT_CPU_ACCOUNTING 2016-07-09 01:43:50 -05:00
Makefile powerpc: Remove platforms/wsp and associated pieces 2014-06-11 16:35:38 +10:00