lkml.org 
[lkml]   [2018]   [Apr]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 04/12] KVM: arm/arm64: Helper to locate free rdist index
    Date
    We introduce vgic_v3_rdist_free_slot to help identifying
    where we can place a new 2x64KB redistributor.

    Signed-off-by: Eric Auger <eric.auger@redhat.com>
    ---
    virt/kvm/arm/vgic/vgic-mmio-v3.c | 3 +--
    virt/kvm/arm/vgic/vgic-v3.c | 17 +++++++++++++++++
    virt/kvm/arm/vgic/vgic.h | 11 +++++++++++
    3 files changed, 29 insertions(+), 2 deletions(-)

    diff --git a/virt/kvm/arm/vgic/vgic-mmio-v3.c b/virt/kvm/arm/vgic/vgic-mmio-v3.c
    index d1aab18..49ca176 100644
    --- a/virt/kvm/arm/vgic/vgic-mmio-v3.c
    +++ b/virt/kvm/arm/vgic/vgic-mmio-v3.c
    @@ -593,8 +593,7 @@ int vgic_register_redist_iodev(struct kvm_vcpu *vcpu)
    * function for all VCPUs when the base address is set. Just return
    * without doing any work for now.
    */
    - rdreg = list_first_entry(&vgic->rd_regions,
    - struct vgic_redist_region, list);
    + rdreg = vgic_v3_rdist_free_slot(&vgic->rd_regions);
    if (!rdreg)
    return 0;

    diff --git a/virt/kvm/arm/vgic/vgic-v3.c b/virt/kvm/arm/vgic/vgic-v3.c
    index 94de6cd..820012a 100644
    --- a/virt/kvm/arm/vgic/vgic-v3.c
    +++ b/virt/kvm/arm/vgic/vgic-v3.c
    @@ -444,6 +444,23 @@ bool vgic_v3_check_base(struct kvm *kvm)
    return false;
    }

    +/**
    + * vgic_v3_rdist_free_slot - Look up registered rdist regions and identify one
    + * which has free space to put a new rdist regions
    + *
    + * If any, return this redist region handle, otherwise returns NULL.
    + */
    +struct vgic_redist_region *vgic_v3_rdist_free_slot(struct list_head *rd_regions)
    +{
    + struct vgic_redist_region *rdreg;
    +
    + list_for_each_entry(rdreg, rd_regions, list) {
    + if (!vgic_v3_redist_region_full(rdreg))
    + return rdreg;
    + }
    + return NULL;
    +}
    +
    int vgic_v3_map_resources(struct kvm *kvm)
    {
    int ret = 0;
    diff --git a/virt/kvm/arm/vgic/vgic.h b/virt/kvm/arm/vgic/vgic.h
    index 830e815..fea32cb 100644
    --- a/virt/kvm/arm/vgic/vgic.h
    +++ b/virt/kvm/arm/vgic/vgic.h
    @@ -251,6 +251,17 @@ static inline int vgic_v3_max_apr_idx(struct kvm_vcpu *vcpu)
    }
    }

    +static inline bool
    +vgic_v3_redist_region_full(struct vgic_redist_region *region)
    +{
    + if (!region->count)
    + return false;
    +
    + return (region->free_index >= region->count);
    +}
    +
    +struct vgic_redist_region *vgic_v3_rdist_free_slot(struct list_head *rdregs);
    +
    int vgic_its_resolve_lpi(struct kvm *kvm, struct vgic_its *its,
    u32 devid, u32 eventid, struct vgic_irq **irq);
    struct vgic_its *vgic_msi_to_its(struct kvm *kvm, struct kvm_msi *msi);
    --
    2.5.5
    \
     
     \ /
      Last update: 2018-04-13 10:26    [W:3.506 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site