KVM GICv3 emulation
Get series with b4
b4 am [email protected]Versions newest first · linked by author and title
- v6 Latest posting 2/20 of 20 patches 0 repliesNew
- v6 posting 1/20 of 20 patches 0 repliesSuperseded
Patches in v6 posting 2/2 No applies recorded yet
None of the 20 patches the cover letter announces are in this archive.
Reviews trailers per patch
No Reviewed-by, Acked-by or Tested-by trailers for v6 yet.
Cover letter [PATCH v6 00/20] KVM GICv3 emulation
Hi Andre,
I heve just tried and got:
$ git clone git://linux-arm.org/linux-ap.git Cloning into 'linux-ap'... fatal: Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists.
Regards,
Tomasz
Quoted 204 lines · Andre Przywara
On 01/13/2015 04:25 PM, Tomasz Nowicki wrote:
Hi Tomasz,
Quoted 3 lines
Is there a git repo reference that I can fetch all those patches?
http://www.linux-arm.org/git?p=linux-ap.git does not work for 'git-fetch'. Thanks in advance!Try:
git://linux-arm.org/linux-ap.git(as referenced a bit hidden below ;-)
Cheers,
Andre.Quoted 187 lines
Regards,
TomaszQuoted 181 lines · Andre Przywara
This is version 6 of the GICv3 guest emulation series. This series is now based on v3.19-rc3 plus Eric's explicit
VGIC_CTRL_INITpatches.The rebase on top of 3.19-rc and Eric's patches required some reworks in 05/19 (introduce
vm_ops), which rippled through to patches 08, 12, 13 and 15.The Aarch32 version of the
ICC_SGI_EL1sysreg is now correctly trapped, enabling 32-bit guests to use the GICv3 emulation (which needs not-yet-upstream patches to enable GICv3 support on ARM).If a host's device tree has faulty properties for the GICV property (unaligned base addresses or wrong region size), we just deny the GICv2 emulation and still allow guests to use the GICv3 emulation.
There is now a new patch 18/20, which introduces a
kvm_check_device_type()function to detect valid GIC emulation models for guests. This is much saner and safer than the private GIC specific way of achieving this functionality.Also I added the Acks from Marc (thanks for the review!), but dropped the 05/19 Acked-by: due to the above mentioned changes.
For a changelog summary see below, also each patch carries a changelog. Patches 01-04, 06, 07, 09-11, 14, 16, 20 are unchanged.
A git repo hosting all these patches lives in the kvm-gicv3/v6 branch of:
http://www.linux-arm.org/git?p=linux-ap.gitgit://linux-arm.org/linux-ap.git
-----GICv3 is the ARM generic interrupt controller designed to overcome some limits of the prevalent GICv2. Most notably it lifts the 8-CPU limit. Though with Linux-3.17 Marc introduced support for hosts to use a GICv3, the CPU limitation still applies to KVM guests, since the current code emulates a GICv2 only.
Also, GICv2 backward compatibility being optional in GICv3, a number of systems won't be able to run GICv2 guests.This patch series provides code to emulate a GICv3 distributor and redistributor for any KVM guest. It requires a GICv3 in the host to work. With those patches one can run guests efficiently on any GICv3 host. It has the following features:
- Affinity routing (support for up to 255 VCPUs, more possible)
- System registers (as opposed to MMIO access)
- No ITS
- No priority support (as the GICv2 emulation)
- No save / restore support so far (will be added soon)
- Only Group1 interrupts supportThe first patches actually refactor the current VGIC code to make room for a different VGIC model to be dropped in with Patch 15. The remaining patches connect the new model to the kernel backend and the userland facing code.
The series goes on top of v3.19-rc3 plus Eric's init rework patches. The necessary patches for kvmtool to enable the guest's GICv3 have been posted here before [2], an updated version will follow soon.
There was some testing on the fast model with some I/O and interrupt affinity shuffling in a Linux guest with a varying number of VCPUs as well as some testing on a Juno board (GICv2 only, to spot regressions).
Please review and test.
I would be grateful for people to test for GICv2 regressions also (so on a GICv2 host with current kvmtool/qemu), as there is quite some refactoring on that front.Much of the code was inspired by MarcZ, also kudos to him for doing the rather painful rebase on top of v3.17-rc1.
Cheers,
Andre.[1] http://www.linux-arm.org/git?p=linux-ap.git
[2] https://lists.cs.columbia.edu/pipermail/kvmarm/2014-June/010086.htmlChanges v5 ... v6:
* adapt to v3.19-rc changes
* allow GICv3 emulation in case of wrong GIC device tree properties
* allow 32-bit guests to use GICv3
* introduce newkvm_check_device_type()functionChanges v4 ... v5:
* fix size ofGICD_IROUTERregion
* fix compilation on ARM with VGIC not configured
* properly fix the remaining FIXME at the GICv3 memory allocation
* minor style changes, comments and commit messages fixesChanges v3 ... v4:
* bug-fix in handling GICv3 redistributor CFG register
* move set/get_lr fromgic_vm_opsback tovgic_ops(get rid of v3 06/19)
* getting rid ofinit_emul()at all
* rework guest GIC model initialization
* use non-atomic bit-set and bit-clear functions
* split up handle_mmio_misc* into multiple functions
* refine handling of some reserved registers
* use symbolic names forICC_SGI1R_EL1register fields (new patch 16/19)
* move private parameter from MMIO accessors to structkvm_mmio_exit
* added documentation of new GICv3 guest device
* added lots of comments
* some renaming of identifiers
* minor changes in style and code flow of various functionsChanges v2 ... v3:
* rebase to v3.18-rc2
* adapt to newkvm_register_device()function
* split upvm_opspatch and the GICv2 split-off patch to ease review
* various smaller changes due to Christoffer's review
* fix compilation for arm
* remove support for trapping SGI sysreg accesses on arm hostsChanges v1 ... v2:
* rebase to v3.17-rc1, caused quite some changes to the init code
* new 9/15 patch to make 10/15 smaller
* fix wrongly ordered cp15 register trap entry (MarcZ)
* fix SGI broadcast (thanks to wanghaibin for spotting)
* fix broken bailout path inkvm_vgic_create(wanghaibin)
* check return value ofinit_emulation_ops()(wanghaibin)
* fix return value check in vgic_[sg]et_attr()
* add header inclusion guards
* remove double definition ofVCPU_NOT_ALLOCATED
* some code move-around
* whitespace fixesAndre Przywara (20):
arm/arm64: KVM: rework MPIDR assignment and add accessors arm/arm64: KVM: pass down user space provided GIC type into vGIC code arm/arm64: KVM: refactorvgic_handle_mmio()function arm/arm64: KVM: wrap 64 bit MMIO accesses with two 32 bit ones arm/arm64: KVM: introduce per-VM ops
arm/arm64: KVM: movekvm_register_device_ops()into vGIC probing arm/arm64: KVM: dont rely on a valid GICH base address arm/arm64: KVM: make the maximum number of vCPUs a per-VM value arm/arm64: KVM: make the value ofICC_SRE_EL1a per-VM variable arm/arm64: KVM: refactor MMIO accessors
arm/arm64: KVM: refactor/wrap vgic_set/get_attr() arm/arm64: KVM: addvgic.hheader file
arm/arm64: KVM: split GICv2 specific emulation code fromvgic.carm/arm64: KVM: add opaque private pointer to MMIO data arm/arm64: KVM: add virtual GICv3 distributor emulation
arm64: GICv3: introduce symbolic names for GICv3ICC_SGI1R_EL1fields
arm64: KVM: add SGI generation register emulation
KVM: introducekvm_check_device_type()
arm/arm64: KVM: enable kernel side of GICv3 emulation arm/arm64: KVM: allow userland to request a virtual GICv3Documentation/virtual/kvm/devices/arm-vgic.txt | 22 +- arch/arm/include/asm/kvm_emulate.h | 5 +- arch/arm/include/asm/kvm_host.h | 3 + arch/arm/include/asm/kvm_mmio.h | 1 + arch/arm/kvm/Makefile | 1 + arch/arm/kvm/arm.c | 23 +- arch/arm/kvm/psci.c | 17 +- arch/arm64/include/asm/kvm_emulate.h | 5 +- arch/arm64/include/asm/kvm_host.h | 5 + arch/arm64/include/asm/kvm_mmio.h | 1 + arch/arm64/include/uapi/asm/kvm.h | 7 + arch/arm64/kernel/asm-offsets.c | 1 + arch/arm64/kvm/Makefile | 2 + arch/arm64/kvm/sys_regs.c | 40 +- arch/arm64/kvm/vgic-v3-switch.S | 14 +- drivers/irqchip/irq-gic-v3.c | 14 +- include/kvm/arm_vgic.h | 41 +- include/linux/irqchip/arm-gic-v3.h | 44 + include/linux/kvm_host.h | 3 + include/uapi/linux/kvm.h | 2 + virt/kvm/arm/vgic-v2-emul.c | 849 ++++++++++++++++++ virt/kvm/arm/vgic-v2.c | 3 + virt/kvm/arm/vgic-v3-emul.c | 1038 ++++++++++++++++++++++ virt/kvm/arm/vgic-v3.c | 80 +- virt/kvm/arm/vgic.c | 1095 ++++++------------------ virt/kvm/arm/vgic.h | 123 +++ virt/kvm/kvm_main.c | 33 +- 27 files changed, 2555 insertions(+), 917 deletions(-)create mode 100644
virt/kvm/arm/vgic-v2-emul.c
create mode 100644virt/kvm/arm/vgic-v3-emul.c
create mode 100644virt/kvm/arm/vgic.h