[PATCH 00/10] arm/arm64: KVM: Active interrupt state switching for shared devices
Eric Auger
eric.auger at linaro.org
Wed Jun 17 23:51:06 PDT 2015
Hi Marc,
I tested your series on Calxeda Midway (shared device path)
Tested-by: Eric Auger <eric.auger at linaro.org>. No exotic migration use
case though.
I also exercised the non-shared device path. As already discussed some
adaptations where needed in vgic state machine.
If anyone is interested, the rebase with EOIMode == 1 + vgic/irqchip
adaptations + kvm-vfio series can be found at
https://git.linaro.org/people/eric.auger/linux.git/shortlog/refs/heads/v4.1-rc6-state-switch-forward.
Tested with Calxeda midway xgmac passthrough.
Eric
On 06/08/2015 07:03 PM, Marc Zyngier wrote:
> From day 1, our timer code has been using a terrible hack: whenever
> the guest is scheduled with a timer interrupt pending (i.e. the HW
> timer has expired), we restore the timer state with the MASK bit set,
> in order to avoid the physical interrupt to fire again. And again. And
> again...
>
> This is absolutely silly, for at least two reasons:
>
> - This relies on the device (the timer) having a mask bit that we can
> play with. Not all devices are built like this.
>
> - This expects some behaviour of the guest that only works because the
> both the kernel timer code and the KVM counterpart have been written
> by the same idiot (the idiot being me).
>
> The One True Way is to set the GIC active bit when injecting the
> interrupt, and to context-switch across the world switch. This is what
> this series implements.
>
> We introduce a relatively simple infrastructure enabling the mapping
> of a virtual interrupt with its physical counterpart:
>
> - Whenever an virtual interrupt is injected, we look it up in an
> rbtree. If we have a match, the interrupt is injected with the HW
> bit set in the LR, together with the physical interrupt.
>
> - Across the world switch, we save/restore the active state for these
> interrupts using the irqchip_state API.
>
> - On guest EOI, the HW interrupt is automagically deactivated by the
> GIC, allowing the interrupt to be resampled.
>
> The timer code is slightly modified to set the active state at the
> same time as the injection.
>
> The last patch also allows non-shared devices to have their interrupt
> deactivated the same way (in this case we do not context-switch the
> active state). This is the first step in the long overdue direction of
> the mythical IRQ forwarding thing...
>
> This series is based on v4.1-rc7, and has been tested on Juno (GICv2)
> and the FVP Base model (GICv3 host, both GICv2 and GICv3 guests). I'd
> appreciate any form of testing, specially in the context of guest
> migration (there is obviously some interesting stuff there...).
>
> The code is otherwise available at
> git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms.git kvm-arm64/active-timer
>
> Marc Zyngier (10):
> arm/arm64: KVM: Fix ordering of timer/GIC on guest entry
> arm/arm64: KVM: Move vgic handling to a non-preemptible section
> KVM: arm/arm64: vgic: Convert struct vgic_lr to use bitfields
> KVM: arm/arm64: vgic: Allow HW irq to be encoded in LR
> KVM: arm/arm64: vgic: Relax vgic_can_sample_irq for edge IRQs
> KVM: arm/arm64: vgic: Allow dynamic mapping of physical/virtual
> interrupts
> KVM: arm/arm64: vgic: Allow HW interrupts to be queued to a guest
> KVM: arm/arm64: vgic: Add vgic_{get,set}_phys_irq_active
> KVM: arm/arm64: timer: Allow the timer to control the active state
> KVM: arm/arm64: vgic: Allow non-shared device HW interrupts
>
> arch/arm/kvm/arm.c | 21 +++-
> include/kvm/arm_arch_timer.h | 3 +
> include/kvm/arm_vgic.h | 31 +++++-
> include/linux/irqchip/arm-gic-v3.h | 3 +
> include/linux/irqchip/arm-gic.h | 3 +-
> virt/kvm/arm/arch_timer.c | 13 ++-
> virt/kvm/arm/vgic-v2.c | 16 ++-
> virt/kvm/arm/vgic-v3.c | 21 +++-
> virt/kvm/arm/vgic.c | 206 ++++++++++++++++++++++++++++++++++++-
> 9 files changed, 300 insertions(+), 17 deletions(-)
>
More information about the linux-arm-kernel
mailing list