[PATCH v2 00/12] KVM: arm/arm64: move VGIC MMIO to kvm_io_bus

2015-03-23 Thread Andre Przywara
This series converts the VGIC MMIO handling routines to the generic
kvm_io_bus framework. The framework is needed for the ioeventfd
functionality, some people on the list wanted to see the VGIC
converted over to use it, too.
Beside from now moving to a generic framework instead of relying on
an ARM specific one we also clean up quite some code and get rid of
some unnecessary copying.
On that way the MMIO abort handling for ARM has changed quite a bit,
so please have a closer look and test it on your setup if possible.

Based on the v1 review I addressed Christoffer's minor comments, but
also heavily changed [11/12]: KVM: ARM: on IO mem abort - route the
call to KVM MMIO bus to get rid of the now unnecessary copying and
the usage of kvm_exit_mmio in that early stage. See the respective
commit message for more details.

The series is loosely based on Nikolay's work[1], thanks especially
for the tedious first patch.
I totally reworked Nikolay's 3/5 to avoid adding another MMIO handling
layer on top of the already quite convoluted VGIC MMIO handling.
Also Nikolay's 2/5 get extended and changed significantly, that's why
I dropped his Signed-off-by.

Unfortunately kvm_io_bus lacks an opaque pointer to pass in some data,
so I worked around this by using container_of.
Now for every struct kvm_mmio_range array a KVM I/O device is
registered (one for VGICv2, 2*nr_vcpus + 1 for VGICv3), using the
struct kvm_io_device variable as an anchor into the new
struct vgic_io_device. This one holds the base address, the
vgic_io_range pointer and (in case of the GICv3 redistributor) the
associated vCPU, so that we can access all instance-specific data
easily.

Patch 2 moves the iodev.h header file around, that solves a problem
when embedding a struct in arm_vgic.h later. That looks like a nice
cleanup anyway, so I added two patches to remove the compiler switch
to add virt/kvm as a include directory. This has been tested for
arm/arm64 and x86. As soon as I get around to compile-test the other
architectures, I can send out the respective patches for those, too.

Patches 5-7 tweak the existing code a bit to make it fit for the
conversion.
Patch 8 contains the framework for the new handling, while
patch 9 and 10 enable the GICv2 and GICv3 emulation, respectively.
Patch 11 finally switches over to the new kvm_io_bus handling,
reworking the early ARM KVM MMIO handling quite a bit. Patch 12
removes the now unneeded code. I split this up to ease reviewing, I
could merge patches as well if needed.

The series goes on top of the kvmarm.git/next branch and was briefly
tested on an arm64 model with a GICv2 and a GICv3 guest and on Midway
(GICv2 guest).

Cheers,
Andre.

[1] https://lists.cs.columbia.edu/pipermail/kvmarm/2015-January/013379.html

Andre Przywara (11):
  KVM: move iodev.h from virt/kvm/ to include/kvm
  KVM: arm/arm64: remove now unneeded include directory from Makefile
  KVM: x86: remove now unneeded include directory from Makefile
  KVM: arm/arm64: rename struct kvm_mmio_range to vgic_io_range
  KVM: mark kvm-buses as empty once they were destroyed
  KVM: arm/arm64: simplify vgic_find_range() and callers
  KVM: arm/arm64: implement kvm_io_bus MMIO handling for the VGIC
  KVM: arm/arm64: prepare GICv2 emulation to be handled by kvm_io_bus
  KVM: arm/arm64: prepare GICv3 emulation to use kvm_io_bus MMIO
handling
  KVM: arm/arm64: rework MMIO abort handling to use KVM MMIO bus
  KVM: arm/arm64: remove now obsolete VGIC specific MMIO handling code

Nikolay Nikolaev (1):
  KVM: Redesign kvm_io_bus_ API to pass VCPU structure to the
callbacks.

 arch/arm/include/asm/kvm_mmio.h   |   22 
 arch/arm/kvm/Makefile |2 +-
 arch/arm/kvm/mmio.c   |   60 ---
 arch/arm64/include/asm/kvm_mmio.h |   22 
 arch/arm64/kvm/Makefile   |2 +-
 arch/powerpc/kvm/mpic.c   |   12 ++-
 arch/powerpc/kvm/powerpc.c|4 +-
 arch/s390/kvm/diag.c  |2 +-
 arch/x86/kvm/Makefile |2 +-
 arch/x86/kvm/i8254.c  |   14 ++-
 arch/x86/kvm/i8254.h  |2 +-
 arch/x86/kvm/i8259.c  |   12 +--
 arch/x86/kvm/ioapic.c |8 +-
 arch/x86/kvm/ioapic.h |2 +-
 arch/x86/kvm/irq.h|2 +-
 arch/x86/kvm/lapic.c  |4 +-
 arch/x86/kvm/lapic.h  |2 +-
 arch/x86/kvm/vmx.c|2 +-
 arch/x86/kvm/x86.c|   13 +--
 include/kvm/arm_vgic.h|   16 ++-
 include/kvm/iodev.h   |   76 +
 include/linux/kvm_host.h  |   10 +-
 virt/kvm/arm/vgic-v2-emul.c   |   40 +++
 virt/kvm/arm/vgic-v3-emul.c   |   79 +++---
 virt/kvm/arm/vgic.c   |  211 +
 virt/kvm/arm/vgic.h   |   29 +++--
 virt/kvm/coalesced_mmio.c |7 +-
 virt/kvm/eventfd.c|6 +-
 virt/kvm/iodev.h  |   70 
 

Re: [PATCH v2 00/12] KVM: arm/arm64: move VGIC MMIO to kvm_io_bus

2015-03-23 Thread Nikolay Nikolaev
On Mon, Mar 23, 2015 at 5:58 PM, Andre Przywara andre.przyw...@arm.com wrote:
 This series converts the VGIC MMIO handling routines to the generic
 kvm_io_bus framework. The framework is needed for the ioeventfd
 functionality, some people on the list wanted to see the VGIC
 converted over to use it, too.
 Beside from now moving to a generic framework instead of relying on
 an ARM specific one we also clean up quite some code and get rid of
 some unnecessary copying.
 On that way the MMIO abort handling for ARM has changed quite a bit,
 so please have a closer look and test it on your setup if possible.

 Based on the v1 review I addressed Christoffer's minor comments, but
 also heavily changed [11/12]: KVM: ARM: on IO mem abort - route the
 call to KVM MMIO bus to get rid of the now unnecessary copying and
 the usage of kvm_exit_mmio in that early stage. See the respective
 commit message for more details.

 The series is loosely based on Nikolay's work[1], thanks especially
 for the tedious first patch.
 I totally reworked Nikolay's 3/5 to avoid adding another MMIO handling
 layer on top of the already quite convoluted VGIC MMIO handling.
 Also Nikolay's 2/5 get extended and changed significantly, that's why
 I dropped his Signed-off-by.

 Unfortunately kvm_io_bus lacks an opaque pointer to pass in some data,
 so I worked around this by using container_of.
 Now for every struct kvm_mmio_range array a KVM I/O device is
 registered (one for VGICv2, 2*nr_vcpus + 1 for VGICv3), using the
 struct kvm_io_device variable as an anchor into the new
 struct vgic_io_device. This one holds the base address, the
 vgic_io_range pointer and (in case of the GICv3 redistributor) the
 associated vCPU, so that we can access all instance-specific data
 easily.

 Patch 2 moves the iodev.h header file around, that solves a problem
 when embedding a struct in arm_vgic.h later. That looks like a nice
 cleanup anyway, so I added two patches to remove the compiler switch
 to add virt/kvm as a include directory. This has been tested for
 arm/arm64 and x86. As soon as I get around to compile-test the other
 architectures, I can send out the respective patches for those, too.

 Patches 5-7 tweak the existing code a bit to make it fit for the
 conversion.
 Patch 8 contains the framework for the new handling, while
 patch 9 and 10 enable the GICv2 and GICv3 emulation, respectively.
 Patch 11 finally switches over to the new kvm_io_bus handling,
 reworking the early ARM KVM MMIO handling quite a bit. Patch 12
 removes the now unneeded code. I split this up to ease reviewing, I
 could merge patches as well if needed.

Shall we add here also the last 2 patches from my series that actually enable
the eventfd compilation and KVM_CAP_IOEVENTFD? Or should I send them separately?

regards,
Nikolay Nikolaev

 The series goes on top of the kvmarm.git/next branch and was briefly
 tested on an arm64 model with a GICv2 and a GICv3 guest and on Midway
 (GICv2 guest).

 Cheers,
 Andre.

 [1] https://lists.cs.columbia.edu/pipermail/kvmarm/2015-January/013379.html

 Andre Przywara (11):
   KVM: move iodev.h from virt/kvm/ to include/kvm
   KVM: arm/arm64: remove now unneeded include directory from Makefile
   KVM: x86: remove now unneeded include directory from Makefile
   KVM: arm/arm64: rename struct kvm_mmio_range to vgic_io_range
   KVM: mark kvm-buses as empty once they were destroyed
   KVM: arm/arm64: simplify vgic_find_range() and callers
   KVM: arm/arm64: implement kvm_io_bus MMIO handling for the VGIC
   KVM: arm/arm64: prepare GICv2 emulation to be handled by kvm_io_bus
   KVM: arm/arm64: prepare GICv3 emulation to use kvm_io_bus MMIO
 handling
   KVM: arm/arm64: rework MMIO abort handling to use KVM MMIO bus
   KVM: arm/arm64: remove now obsolete VGIC specific MMIO handling code

 Nikolay Nikolaev (1):
   KVM: Redesign kvm_io_bus_ API to pass VCPU structure to the
 callbacks.

  arch/arm/include/asm/kvm_mmio.h   |   22 
  arch/arm/kvm/Makefile |2 +-
  arch/arm/kvm/mmio.c   |   60 ---
  arch/arm64/include/asm/kvm_mmio.h |   22 
  arch/arm64/kvm/Makefile   |2 +-
  arch/powerpc/kvm/mpic.c   |   12 ++-
  arch/powerpc/kvm/powerpc.c|4 +-
  arch/s390/kvm/diag.c  |2 +-
  arch/x86/kvm/Makefile |2 +-
  arch/x86/kvm/i8254.c  |   14 ++-
  arch/x86/kvm/i8254.h  |2 +-
  arch/x86/kvm/i8259.c  |   12 +--
  arch/x86/kvm/ioapic.c |8 +-
  arch/x86/kvm/ioapic.h |2 +-
  arch/x86/kvm/irq.h|2 +-
  arch/x86/kvm/lapic.c  |4 +-
  arch/x86/kvm/lapic.h  |2 +-
  arch/x86/kvm/vmx.c|2 +-
  arch/x86/kvm/x86.c|   13 +--
  include/kvm/arm_vgic.h|   16 ++-
  include/kvm/iodev.h   |   76 +
  include/linux/kvm_host.h  |   10 +-
  virt/kvm/arm/vgic-v2-emul.c