[PATCH v3 00/16] KVM: arm64: GICv3 ITS emulation
christoffer.dall at linaro.org
Sat Oct 10 08:37:44 PDT 2015
On Wed, Oct 07, 2015 at 03:55:10PM +0100, Andre Przywara wrote:
> another respin and rebase of the ITS emulation series.
> Major changes compared to v2 (beside some minor things like added
> comments and function renames) are the rebasing and adaption to 4.3-rc
> and Christoffer's timer rework series. Also the locking has been
> reworked to cope with the dependencies of the its and the dist lock
> in connection with the PROPBASER/PENDBASER and the command handling.
> For a more detailed changelog see below or look at the respective
> commit messages.
> This should address most of the comments I got on the list.
> Many thanks to the diligent reviewers!
> I didn't bother to fine-tune patch 01/16 too much, as I guess there
> will be more discussion around this based on Pavel's latest post.
> These patches go on top of Christoffer's timer rework series ,
> which itself is on top of 4.3-rc2.
> You can find all of this code in the its-emul/v3 branch of my
> repository .
Thanks for rebasing the series!
Just a heads up that I may not be able to review this series for the
next 1-2 weeks, so I'm afraid it's not going to make it in for v4.4,
Please let me know if this breaks expectations from everyone.
Othersie, I will try review it with due dilligence so it makes it in for
> Changelog v2..v3:
> - adapt to 4.3-rc and Christoffer's timer rework
> - adapt spin locks on handling PROPBASER/PENDBASER registers
> - rework locking in ITS command handling (dropping dist where needed)
> - only clear LPI pending bit if LPI could actually be queued
> - simplify GICR_CTLR handling
> - properly free ITTEs (including our pending bitmap)
> - fix corner cases with unmapped collections
> - keep retire_lr() around
> - rename vgic_handle_base_register to vgic_reg64_access()
> - use kcalloc instead of kmalloc
> - minor fixes, renames and added comments
> Changelog v1..v2
> - fix issues when using non-ITS GICv3 emulation
> - streamline frame address initialization (new patch 05/15)
> - preallocate buffer memory for reading from guest's memory
> - move locking into the actual command handlers
> - preallocate memory for new structures if needed
> - use non-atomic __set_bit() and __clear_bit() when under the lock
> - add INT command handler to allow LPI injection from the guest
> - rewrite CWRITER handler to align with new locking scheme
> - remove unneeded CONFIG_HAVE_KVM_MSI #ifdefs
> - check memory table size against our LPI limit (65536 interrupts)
> - observe initial gap of 1024 interrupts in pending table
> - use term "configuration table" to be in line with the spec
> - clarify and extend documentation on API extensions
> - introduce new KVM_CAP_MSI_DEVID capability to advertise device ID requirement
> - update, fix and add many comments
> - minor style changes as requested by reviewers
> The GICv3 ITS (Interrupt Translation Service) is a part of the
> ARM GICv3 interrupt controller  used for implementing MSIs.
> It specifies a new kind of interrupts (LPIs), which are mapped to
> establish a connection between a device, its MSI payload value and
> the target processor the IRQ is eventually delivered to.
> In order to allow using MSIs in an ARM64 KVM guest, we emulate this
> ITS widget in the kernel.
> The ITS works by reading commands written by software (from the guest
> in our case) into a (guest allocated) memory region and establishing
> the mapping between a device, the MSI payload and the target CPU.
> We parse these commands and update our internal data structures to
> reflect those changes. On an MSI injection we iterate those
> structures to learn the LPI number we have to inject.
> For the time being we use simple lists to hold the data, this is
> good enough for the small number of entries each of the components
> currently have. Should this become a performance bottleneck in the
> future, those can be extended to arrays or trees if needed.
> Most of the code lives in a separate source file (its-emul.c), though
> there are some changes necessary both in vgic.c and vgic-v3-emul.c.
> Patch 01/16 gets rid of the internal tracking of the used LR for
> an injected IRQ, see the commit message for more details.
> Patch 03/16 extends the KVM MSI ioctl to hold a device ID.
> Patch 04-06 make small changes to the existing VGIC code which make
> adaptions to the ITS later easier.
> The rest of the patches implement the ITS functionality step by step.
> For more details see the respective commit messages.
> For the time being this series gives us the ability to use emulated
> PCI devices that can use MSIs in the guest. Those have to be
> triggered by letting the userland device emulation simulate the MSI
> write with the KVM_SIGNAL_MSI ioctl. This will be translated into
> the proper LPI by the ITS emulation and injected into the guest in
> the usual way (just with a higher IRQ number).
> This series is based on 4.3-rc2 and can be found at the its-emul/v3
> branch of this repository .
> For this to be used you need a GICv3 host machine (a fast model would
> do), though it does not rely on any host ITS bits (neither in hardware
> or software).
> To test this you can use the kvmtool patches available in the "its"
> branch here .
> Start a guest with: "$ lkvm run --irqchip=gicv3-its --force-pci"
> and see the ITS being used for instance by the virtio devices.
> : https://git.linaro.org/people/christoffer.dall/linux-kvm-arm.git/shortlog/refs/heads/timer-rework-v3
> : git://linux-arm.org/linux-ap.git
> : git://linux-arm.org/kvmtool.git
> : http://arminfo.emea.arm.com/help/topic/com.arm.doc.ihi0069a/IHI0069A_gic_architecture_specification.pdf
> Andre Przywara (16):
> KVM: arm/arm64: VGIC: don't track used LRs in the distributor
> KVM: arm/arm64: remove now unused code after stay-in-LR rework
> KVM: extend struct kvm_msi to hold a 32-bit device ID
> KVM: arm/arm64: add emulation model specific destroy function
> KVM: arm/arm64: extend arch CAP checks to allow per-VM capabilities
> KVM: arm/arm64: make GIC frame address initialization model specific
> KVM: arm64: Introduce new MMIO region for the ITS base address
> KVM: arm64: handle ITS related GICv3 redistributor registers
> KVM: arm64: introduce ITS emulation file with stub functions
> KVM: arm64: implement basic ITS register handlers
> KVM: arm64: add data structures to model ITS interrupt translation
> KVM: arm64: handle pending bit for LPIs in ITS emulation
> KVM: arm64: sync LPI configuration and pending tables
> KVM: arm64: implement ITS command queue command handlers
> KVM: arm64: implement MSI injection in ITS emulation
> KVM: arm64: enable ITS emulation as a virtual MSI controller
> Documentation/virtual/kvm/api.txt | 14 +-
> Documentation/virtual/kvm/devices/arm-vgic.txt | 9 +
> arch/arm/include/asm/kvm_host.h | 2 +-
> arch/arm/kvm/arm.c | 2 +-
> arch/arm64/include/asm/kvm_host.h | 2 +-
> arch/arm64/include/uapi/asm/kvm.h | 2 +
> arch/arm64/kvm/Kconfig | 1 +
> arch/arm64/kvm/Makefile | 1 +
> arch/arm64/kvm/reset.c | 8 +-
> include/kvm/arm_vgic.h | 43 +-
> include/linux/irqchip/arm-gic-v3.h | 14 +-
> include/uapi/linux/kvm.h | 5 +-
> virt/kvm/arm/its-emul.c | 1187 ++++++++++++++++++++++++
> virt/kvm/arm/its-emul.h | 55 ++
> virt/kvm/arm/vgic-v2-emul.c | 3 +
> virt/kvm/arm/vgic-v2.c | 1 +
> virt/kvm/arm/vgic-v3-emul.c | 101 +-
> virt/kvm/arm/vgic-v3.c | 1 +
> virt/kvm/arm/vgic.c | 292 +++---
> virt/kvm/arm/vgic.h | 3 +
> 20 files changed, 1601 insertions(+), 145 deletions(-)
> create mode 100644 virt/kvm/arm/its-emul.c
> create mode 100644 virt/kvm/arm/its-emul.h
More information about the linux-arm-kernel