25 May, 2018

4 commits

  • As we are going to register several redist regions,
    vgic_register_all_redist_iodevs() may be called several times. We need
    to register a redist_iodev for a given vcpu only once. So let's
    check if the base address has already been set. Initialize this latter
    in kvm_vgic_vcpu_init().

    Signed-off-by: Eric Auger
    Acked-by: Christoffer Dall
    Signed-off-by: Marc Zyngier

    Eric Auger
     
  • kvm_vgic_vcpu_early_init gets called after kvm_vgic_cpu_init which
    is confusing. The call path is as follows:
    kvm_vm_ioctl_create_vcpu
    |_ kvm_arch_cpu_create
    |_ kvm_vcpu_init
    |_ kvm_arch_vcpu_init
    |_ kvm_vgic_vcpu_init
    |_ kvm_arch_vcpu_postcreate
    |_ kvm_vgic_vcpu_early_init

    Static initialization currently done in kvm_vgic_vcpu_early_init()
    can be moved to kvm_vgic_vcpu_init(). So let's move the code and
    remove kvm_vgic_vcpu_early_init(). kvm_arch_vcpu_postcreate() does
    nothing.

    Signed-off-by: Eric Auger
    Signed-off-by: Marc Zyngier

    Eric Auger
     
  • At the moment KVM supports a single rdist region. We want to
    support several separate rdist regions so let's introduce a list
    of them. This patch currently only cares about a single
    entry in this list as the functionality to register several redist
    regions is not yet there. So this only translates the existing code
    into something functionally similar using that new data struct.

    The redistributor region handle is stored in the vgic_cpu structure
    to allow later computation of the TYPER last bit.

    Signed-off-by: Eric Auger
    Reviewed-by: Christoffer Dall
    Signed-off-by: Marc Zyngier

    Eric Auger
     
  • in case kvm_vgic_map_resources() fails, typically if the vgic
    distributor is not defined, __kvm_vgic_destroy will be called
    several times. Indeed kvm_vgic_map_resources() is called on
    first vcpu run. As a result dist->spis is freeed more than once
    and on the second time it causes a "kernel BUG at mm/slub.c:3912!"

    Set dist->spis to NULL to avoid the crash.

    Fixes: ad275b8bb1e6 ("KVM: arm/arm64: vgic-new: vgic_init: implement
    vgic_init")

    Signed-off-by: Eric Auger
    Reviewed-by: Marc Zyngier
    Reviewed-by: Christoffer Dall
    Signed-off-by: Marc Zyngier

    Eric Auger
     

04 May, 2018

1 commit


19 Mar, 2018

2 commits

  • As we're about to change the way we map devices at HYP, we need
    to move away from kern_hyp_va on an IO address.

    One way of achieving this is to store the VAs in kvm_vgic_global_state,
    and use that directly from the HYP code. This requires a small change
    to create_hyp_io_mappings so that it can also return a HYP VA.

    We take this opportunity to nuke the vctrl_base field in the emulated
    distributor, as it is not used anymore.

    Acked-by: Catalin Marinas
    Reviewed-by: Christoffer Dall
    Signed-off-by: Marc Zyngier

    Marc Zyngier
     
  • Moving the call to vcpu_load() in kvm_arch_vcpu_ioctl_run() to after
    we've called kvm_vcpu_first_run_init() simplifies some of the vgic and
    there is also no need to do vcpu_load() for things such as handling the
    immediate_exit flag.

    Reviewed-by: Julien Grall
    Reviewed-by: Marc Zyngier
    Signed-off-by: Christoffer Dall
    Signed-off-by: Marc Zyngier

    Christoffer Dall
     

12 Jan, 2018

1 commit

  • Commit 3d1ad640f8c94 ("KVM: arm/arm64: Fix GICv4 ITS initialization
    issues") moved the vgic_supports_direct_msis() check in vgic_v4_init().
    However when vgic_v4_init is called from vgic_its_create(), the has_its
    field is not yet set. Hence vgic_supports_direct_msis returns false and
    vgic_v4_init does nothing.

    The gic/its init sequence is a bit messy, so let's be specific about the
    prerequisite checks in the various call paths instead of relying on a
    common wrapper.

    Fixes: 3d1ad640f8c94 ("KVM: arm/arm64: Fix GICv4 ITS initialization issues")
    Reported-by: Eric Auger
    Signed-off-by: Christoffer Dall

    Christoffer Dall
     

10 Nov, 2017

2 commits

  • We should only try to initialize GICv4 data structures on a GICv4
    capable system. Move the vgic_supports_direct_msis() check inito
    vgic_v4_init() so that any KVM VGIC initialization path does not fail
    on non-GICv4 systems.

    Also be slightly more strict in the checking of the return value in
    vgic_its_create, and only error out on negative return values from the
    vgic_v4_init() function. This is important because the kvm device code
    only treats negative values as errors and only cleans up in this case.
    Errornously treating a positive return value as an error from the
    vgic_v4_init() function can lead to NULL pointer dereferences, as has
    recently been observed.

    Acked-by: Marc Zyngier
    Signed-off-by: Christoffer Dall

    Christoffer Dall
     
  • In order to control the GICv4 view of virtual CPUs, we rely
    on an irqdomain allocated for that purpose. Let's add a couple
    of helpers to that effect.

    At the same time, the vgic data structures gain new fields to
    track all this... erm... wonderful stuff.

    The way we hook into the vgic init is slightly convoluted. We
    need the vgic to be initialized (in order to guarantee that
    the number of vcpus is now fixed), and we must have a vITS
    (otherwise this is all very pointless). So we end-up calling
    the init from both vgic_init and vgic_its_create.

    Reviewed-by: Christoffer Dall
    Signed-off-by: Marc Zyngier
    Signed-off-by: Christoffer Dall

    Marc Zyngier
     

25 Jul, 2017

1 commit

  • Commit 0e4e82f154e3 ("KVM: arm64: vgic-its: Enable ITS emulation as
    a virtual MSI controller") tried to advertise KVM_CAP_MSI_DEVID, but
    the code logic was not updating the dist->msis_require_devid field
    correctly. If hypervisor tool creates the ITS device after VGIC
    initialization then we don't advertise KVM_CAP_MSI_DEVID capability.

    Update the field msis_require_devid to true inside vgic_its_create()
    to fix the issue.

    Fixes: 0e4e82f154e3 ("vgic-its: Enable ITS emulation as a virtual MSI controller")
    Signed-off-by: Shanker Donthineni
    Signed-off-by: Marc Zyngier

    Shanker Donthineni
     

18 May, 2017

1 commit

  • If userspace creates the VCPUs after initializing the VGIC, then we end
    up in a situation where we trigger a bug in kvm_vcpu_get_idx(), because
    it is called prior to adding the VCPU into the vcpus array on the VM.

    There is no tight coupling between the VCPU index and the area of the
    redistributor region used for the VCPU, so we can simply ensure that all
    creations of redistributors are serialized per VM, and increment an
    offset when we successfully add a redistributor.

    The vgic_register_redist_iodev() function can be called from two paths:
    vgic_redister_all_redist_iodev() which is called via the kvm_vgic_addr()
    device attribute handler. This patch already holds the kvm->lock mutex.

    The other path is via kvm_vgic_vcpu_init, which is called through a
    longer chain from kvm_vm_ioctl_create_vcpu(), which releases the
    kvm->lock mutex just before calling kvm_arch_vcpu_create(), so we can
    simply take this mutex again later for our purposes.

    Fixes: ab6f468c10 ("KVM: arm/arm64: Register iodevs when setting redist base and creating VCPUs")
    Signed-off-by: Christoffer Dall
    Tested-by: Jean-Philippe Brucker
    Reviewed-by: Eric Auger

    Christoffer Dall
     

09 May, 2017

4 commits

  • …l/git/kvmarm/kvmarm into HEAD

    Second round of KVM/ARM Changes for v4.12.

    Changes include:
    - A fix related to the 32-bit idmap stub
    - A fix to the bitmask used to deode the operands of an AArch32 CP
    instruction
    - We have moved the files shared between arch/arm/kvm and
    arch/arm64/kvm to virt/kvm/arm
    - We add support for saving/restoring the virtual ITS state to
    userspace

    Paolo Bonzini
     
  • Instead of waiting with registering KVM iodevs until the first VCPU is
    run, we can actually create the iodevs when the redist base address is
    set. The only downside is that we must now also check if we need to do
    this for VCPUs which are created after creating the VGIC, because there
    is no enforced ordering between creating the VGIC (and setting its base
    addresses) and creating the VCPUs.

    Signed-off-by: Christoffer Dall
    Reviewed-by: Eric Auger

    Christoffer Dall
     
  • This function really doesn't init anything, it enables the CPU
    interface, so name it as such, which gives us the name to use for actual
    init work later on.

    Signed-off-by: Christoffer Dall
    Reviewed-by: Eric Auger

    Christoffer Dall
     
  • Pull KVM updates from Paolo Bonzini:
    "ARM:
    - HYP mode stub supports kexec/kdump on 32-bit
    - improved PMU support
    - virtual interrupt controller performance improvements
    - support for userspace virtual interrupt controller (slower, but
    necessary for KVM on the weird Broadcom SoCs used by the Raspberry
    Pi 3)

    MIPS:
    - basic support for hardware virtualization (ImgTec P5600/P6600/I6400
    and Cavium Octeon III)

    PPC:
    - in-kernel acceleration for VFIO

    s390:
    - support for guests without storage keys
    - adapter interruption suppression

    x86:
    - usual range of nVMX improvements, notably nested EPT support for
    accessed and dirty bits
    - emulation of CPL3 CPUID faulting

    generic:
    - first part of VCPU thread request API
    - kvm_stat improvements"

    * tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (227 commits)
    kvm: nVMX: Don't validate disabled secondary controls
    KVM: put back #ifndef CONFIG_S390 around kvm_vcpu_kick
    Revert "KVM: Support vCPU-based gfn->hva cache"
    tools/kvm: fix top level makefile
    KVM: x86: don't hold kvm->lock in KVM_SET_GSI_ROUTING
    KVM: Documentation: remove VM mmap documentation
    kvm: nVMX: Remove superfluous VMX instruction fault checks
    KVM: x86: fix emulation of RSM and IRET instructions
    KVM: mark requests that need synchronization
    KVM: return if kvm_vcpu_wake_up() did wake up the VCPU
    KVM: add explicit barrier to kvm_vcpu_kick
    KVM: perform a wake_up in kvm_make_all_cpus_request
    KVM: mark requests that do not need a wakeup
    KVM: remove #ifndef CONFIG_S390 around kvm_vcpu_wake_up
    KVM: x86: always use kvm_make_request instead of set_bit
    KVM: add kvm_{test,clear}_request to replace {test,clear}_bit
    s390: kvm: Cpu model support for msa6, msa7 and msa8
    KVM: x86: remove irq disablement around KVM_SET_CLOCK/KVM_GET_CLOCK
    kvm: better MWAIT emulation for guests
    KVM: x86: virtualize cpuid faulting
    ...

    Linus Torvalds
     

09 Apr, 2017

2 commits

  • Implement early initialization for both the distributor and the CPU
    interfaces. The basic idea is that even though the VGIC is not
    functional or not requested from user space, the critical path of the
    run loop can still call VGIC functions that just won't do anything,
    without them having to check additional initialization flags to ensure
    they don't look at uninitialized data structures.

    Acked-by: Marc Zyngier
    Signed-off-by: Christoffer Dall

    Christoffer Dall
     
  • We don't have to save/restore the VMCR on every entry to/from the guest,
    since on GICv2 we can access the control interface from EL1 and on VHE
    systems with GICv3 we can access the control interface from KVM running
    in EL2.

    GICv3 systems without VHE becomes the rare case, which has to
    save/restore the register on each round trip.

    Note that userspace accesses may see out-of-date values if the VCPU is
    running while accessing the VGIC state via the KVM device API, but this
    is already the case and it is up to userspace to quiesce the CPUs before
    reading the CPU registers from the GIC for an up-to-date view.

    Reviewed-by: Marc Zyngier
    Signed-off-by: Christoffer Dall
    Signed-off-by: Christoffer Dall

    Christoffer Dall
     

04 Apr, 2017

1 commit

  • We currently have some code to clear the list registers on GICv3, but we
    never call this code, because the caller got nuked when removing the old
    vgic. We also used to have a similar GICv2 part, but that got lost in
    the process too.

    Let's reintroduce the logic for GICv2 and call the logic when we
    initialize the use of hypervisors on the CPU, for example when first
    loading KVM or when exiting a low power state.

    Reviewed-by: Marc Zyngier
    Signed-off-by: Christoffer Dall
    Signed-off-by: Marc Zyngier

    Christoffer Dall
     

25 Jan, 2017

1 commit

  • Add a file to debugfs to read the in-kernel state of the vgic. We don't
    do any locking of the entire VGIC state while traversing all the IRQs,
    so if the VM is running the user/developer may not see a quiesced state,
    but should take care to pause the VM using facilities in user space for
    that purpose.

    We also don't support LPIs yet, but they can be added easily if needed.

    Reviewed-by: Eric Auger
    Tested-by: Eric Auger
    Tested-by: Andre Przywara
    Acked-by: Marc Zyngier
    Signed-off-by: Christoffer Dall

    Christoffer Dall
     

13 Jan, 2017

1 commit

  • Dmitry Vyukov reported that the syzkaller fuzzer triggered a
    deadlock in the vgic setup code when an error was detected, as
    the cleanup code tries to take a lock that is already held by
    the setup code.

    The fix is to avoid retaking the lock when cleaning up, by
    telling the cleanup function that we already hold it.

    Cc: stable@vger.kernel.org
    Reported-by: Dmitry Vyukov
    Reviewed-by: Christoffer Dall
    Reviewed-by: Eric Auger
    Signed-off-by: Marc Zyngier

    Marc Zyngier
     

25 Dec, 2016

1 commit

  • When the state names got added a script was used to add the extra argument
    to the calls. The script basically converted the state constant to a
    string, but the cleanup to convert these strings into meaningful ones did
    not happen.

    Replace all the useless strings with 'subsys/xxx/yyy:state' strings which
    are used in all the other places already.

    Signed-off-by: Thomas Gleixner
    Cc: Peter Zijlstra
    Cc: Sebastian Siewior
    Link: http://lkml.kernel.org/r/20161221192112.085444152@linutronix.de
    Signed-off-by: Thomas Gleixner

    Thomas Gleixner
     

22 Sep, 2016

1 commit

  • Currently GIC backend is selected via alternative framework and this
    is fine. We are going to introduce vgic-v3 to 32-bit world and there
    we don't have patching framework in hand, so we can either check
    support for GICv3 every time we need to choose which backend to use or
    try to optimise it by using static keys. The later looks quite
    promising because we can share logic involved in selecting GIC backend
    between architectures if both uses static keys.

    This patch moves arm64 from alternative to static keys framework for
    selecting GIC backend. For that we embed static key into vgic_global
    and enable the key during vgic initialisation based on what has
    already been exposed by the host GIC driver.

    Acked-by: Marc Zyngier
    Signed-off-by: Vladimir Murzin
    Signed-off-by: Christoffer Dall

    Vladimir Murzin
     

12 Aug, 2016

1 commit

  • KVM devices were manipulating list data structures without any form of
    synchronization, and some implementations of the create operations also
    suffered from a lack of synchronization.

    Now when we've split the xics create operation into create and init, we
    can hold the kvm->lock mutex while calling the create operation and when
    manipulating the devices list.

    The error path in the generic code gets slightly ugly because we have to
    take the mutex again and delete the device from the list, but holding
    the mutex during anon_inode_getfd or releasing/locking the mutex in the
    common non-error path seemed wrong.

    Signed-off-by: Christoffer Dall
    Reviewed-by: Paolo Bonzini
    Acked-by: Christian Borntraeger
    Signed-off-by: Radim Krčmář

    Christoffer Dall
     

04 Aug, 2016

1 commit


03 Aug, 2016

1 commit

  • Pull KVM updates from Paolo Bonzini:

    - ARM: GICv3 ITS emulation and various fixes. Removal of the
    old VGIC implementation.

    - s390: support for trapping software breakpoints, nested
    virtualization (vSIE), the STHYI opcode, initial extensions
    for CPU model support.

    - MIPS: support for MIPS64 hosts (32-bit guests only) and lots
    of cleanups, preliminary to this and the upcoming support for
    hardware virtualization extensions.

    - x86: support for execute-only mappings in nested EPT; reduced
    vmexit latency for TSC deadline timer (by about 30%) on Intel
    hosts; support for more than 255 vCPUs.

    - PPC: bugfixes.

    * tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (302 commits)
    KVM: PPC: Introduce KVM_CAP_PPC_HTM
    MIPS: Select HAVE_KVM for MIPS64_R{2,6}
    MIPS: KVM: Reset CP0_PageMask during host TLB flush
    MIPS: KVM: Fix ptr->int cast via KVM_GUEST_KSEGX()
    MIPS: KVM: Sign extend MFC0/RDHWR results
    MIPS: KVM: Fix 64-bit big endian dynamic translation
    MIPS: KVM: Fail if ebase doesn't fit in CP0_EBase
    MIPS: KVM: Use 64-bit CP0_EBase when appropriate
    MIPS: KVM: Set CP0_Status.KX on MIPS64
    MIPS: KVM: Make entry code MIPS64 friendly
    MIPS: KVM: Use kmap instead of CKSEG0ADDR()
    MIPS: KVM: Use virt_to_phys() to get commpage PFN
    MIPS: Fix definition of KSEGX() for 64-bit
    KVM: VMX: Add VMCS to CPU's loaded VMCSs before VMPTRLD
    kvm: x86: nVMX: maintain internal copy of current VMCS
    KVM: PPC: Book3S HV: Save/restore TM state in H_CEDE
    KVM: PPC: Book3S HV: Pull out TM state save/restore into separate procedures
    KVM: arm64: vgic-its: Simplify MAPI error handling
    KVM: arm64: vgic-its: Make vgic_its_cmd_handle_mapi similar to other handlers
    KVM: arm64: vgic-its: Turn device_id validation into generic ID validation
    ...

    Linus Torvalds
     

23 Jul, 2016

1 commit

  • This patch adds compilation and link against irqchip.

    Main motivation behind using irqchip code is to enable MSI
    routing code. In the future irqchip routing may also be useful
    when targeting multiple irqchips.

    Routing standard callbacks now are implemented in vgic-irqfd:
    - kvm_set_routing_entry
    - kvm_set_irq
    - kvm_set_msi

    They only are supported with new_vgic code.

    Both HAVE_KVM_IRQCHIP and HAVE_KVM_IRQ_ROUTING are defined.
    KVM_CAP_IRQ_ROUTING is advertised and KVM_SET_GSI_ROUTING is allowed.

    So from now on IRQCHIP routing is enabled and a routing table entry
    must exist for irqfd injection to succeed for a given SPI. This patch
    builds a default flat irqchip routing table (gsi=irqchip.pin) covering
    all the VGIC SPI indexes. This routing table is overwritten by the
    first first user-space call to KVM_SET_GSI_ROUTING ioctl.

    MSI routing setup is not yet allowed.

    Signed-off-by: Eric Auger
    Signed-off-by: Marc Zyngier

    Eric Auger
     

19 Jul, 2016

4 commits

  • Now that all ITS emulation functionality is in place, we advertise
    MSI functionality to userland and also the ITS device to the guest - if
    userland has configured that.

    Signed-off-by: Andre Przywara
    Reviewed-by: Marc Zyngier
    Tested-by: Eric Auger
    Signed-off-by: Marc Zyngier

    Andre Przywara
     
  • LPIs are dynamically created (mapped) at guest runtime and their
    actual number can be quite high, but is mostly assigned using a very
    sparse allocation scheme. So arrays are not an ideal data structure
    to hold the information.
    We use a spin-lock protected linked list to hold all mapped LPIs,
    represented by their struct vgic_irq. This lock is grouped between the
    ap_list_lock and the vgic_irq lock in our locking order.
    Also we store a pointer to that struct vgic_irq in our struct its_itte,
    so we can easily access it.
    Eventually we call our new vgic_get_lpi() from vgic_get_irq(), so
    the VGIC code gets transparently access to LPIs.

    Signed-off-by: Andre Przywara
    Reviewed-by: Marc Zyngier
    Tested-by: Eric Auger
    Signed-off-by: Marc Zyngier

    Andre Przywara
     
  • In the moment our struct vgic_irq's are statically allocated at guest
    creation time. So getting a pointer to an IRQ structure is trivial and
    safe. LPIs are more dynamic, they can be mapped and unmapped at any time
    during the guest's _runtime_.
    In preparation for supporting LPIs we introduce reference counting for
    those structures using the kernel's kref infrastructure.
    Since private IRQs and SPIs are statically allocated, we avoid actually
    refcounting them, since they would never be released anyway.
    But we take provisions to increase the refcount when an IRQ gets onto a
    VCPU list and decrease it when it gets removed. Also this introduces
    vgic_put_irq(), which wraps kref_put and hides the release function from
    the callers.

    Signed-off-by: Andre Przywara
    Reviewed-by: Marc Zyngier
    Tested-by: Eric Auger
    Signed-off-by: Marc Zyngier

    Andre Przywara
     
  • Logically a GICv3 redistributor is assigned to a (v)CPU, so we should
    aim to keep redistributor related variables out of our struct vgic_dist.

    Let's start by replacing the redistributor related kvm_io_device array
    with two members in our existing struct vgic_cpu, which are naturally
    per-VCPU and thus don't require any allocation / freeing.
    So apart from the better fit with the redistributor design this saves
    some code as well.

    Signed-off-by: Andre Przywara
    Reviewed-by: Eric Auger
    Reviewed-by: Marc Zyngier
    Tested-by: Eric Auger
    Signed-off-by: Marc Zyngier

    Andre Przywara
     

15 Jul, 2016

1 commit

  • Install the callbacks via the state machine and let the core invoke
    the callbacks on the already online CPUs.

    Signed-off-by: Anna-Maria Gleixner
    Cc: Andre Przywara
    Cc: Christoffer Dall
    Cc: Eric Auger
    Cc: Linus Torvalds
    Cc: Marc Zyngier
    Cc: Paolo Bonzini
    Cc: Peter Zijlstra
    Cc: Radim Krcmar
    Cc: Thomas Gleixner
    Cc: kvm@vger.kernel.org
    Cc: kvmarm@lists.cs.columbia.edu
    Cc: linux-arm-kernel@lists.infradead.org
    Cc: rt@linutronix.de
    Link: http://lkml.kernel.org/r/20160713153337.900484868@linutronix.de
    Signed-off-by: Ingo Molnar

    Anna-Maria Gleixner
     

20 May, 2016

4 commits

  • map_resources is the last initialization step. It is executed on
    first VCPU run. At that stage the code checks that userspace has provided
    the base addresses for the relevant VGIC regions, which depend on the
    type of VGIC that is exposed to the guest. Also we check if the two
    regions overlap.
    If the checks succeeded, we register the respective register frames with
    the kvm_io_bus framework.

    If we emulate a GICv2, the function also forces vgic_init execution if
    it has not been executed yet. Also we map the virtual GIC CPU interface
    onto the guest's CPU interface.

    Signed-off-by: Eric Auger
    Signed-off-by: Andre Przywara
    Reviewed-by: Christoffer Dall

    Eric Auger
     
  • This patch allocates and initializes the data structures used
    to model the vgic distributor and virtual cpu interfaces. At that
    stage the number of IRQs and number of virtual CPUs is frozen.

    Signed-off-by: Eric Auger
    Signed-off-by: Andre Przywara
    Reviewed-by: Christoffer Dall

    Eric Auger
     
  • This patch implements the vgic_creation function which is
    called on CREATE_IRQCHIP VM IOCTL (v2 only) or KVM_CREATE_DEVICE

    Signed-off-by: Eric Auger
    Signed-off-by: Andre Przywara
    Reviewed-by: Christoffer Dall

    Eric Auger
     
  • Implements kvm_vgic_hyp_init and vgic_probe function.
    This uses the new firmware independent VGIC probing to support both ACPI
    and DT based systems (code from Marc Zyngier).

    The vgic_global struct is enriched with new fields populated
    by those functions.

    Signed-off-by: Eric Auger
    Signed-off-by: Andre Przywara
    Reviewed-by: Christoffer Dall

    Eric Auger