lkml.org 
[lkml]   [2018]   [May]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 249/496] KVM: arm/arm64: vgic: Add missing irq_lock to vgic_mmio_read_pending
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Andre Przywara <andre.przywara@arm.com>

    [ Upstream commit 62b06f8f429cd233e4e2e7bbd21081ad60c9018f ]

    Our irq_is_pending() helper function accesses multiple members of the
    vgic_irq struct, so we need to hold the lock when calling it.
    Add that requirement as a comment to the definition and take the lock
    around the call in vgic_mmio_read_pending(), where we were missing it
    before.

    Fixes: 96b298000db4 ("KVM: arm/arm64: vgic-new: Add PENDING registers handlers")
    Signed-off-by: Andre Przywara <andre.przywara@arm.com>
    Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    virt/kvm/arm/vgic/vgic-mmio.c | 3 +++
    virt/kvm/arm/vgic/vgic.h | 1 +
    2 files changed, 4 insertions(+)

    --- a/virt/kvm/arm/vgic/vgic-mmio.c
    +++ b/virt/kvm/arm/vgic/vgic-mmio.c
    @@ -110,9 +110,12 @@ unsigned long vgic_mmio_read_pending(str
    /* Loop over all IRQs affected by this read */
    for (i = 0; i < len * 8; i++) {
    struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
    + unsigned long flags;

    + spin_lock_irqsave(&irq->irq_lock, flags);
    if (irq_is_pending(irq))
    value |= (1U << i);
    + spin_unlock_irqrestore(&irq->irq_lock, flags);

    vgic_put_irq(vcpu->kvm, irq);
    }
    --- a/virt/kvm/arm/vgic/vgic.h
    +++ b/virt/kvm/arm/vgic/vgic.h
    @@ -96,6 +96,7 @@
    /* we only support 64 kB translation table page size */
    #define KVM_ITS_L1E_ADDR_MASK GENMASK_ULL(51, 16)

    +/* Requires the irq_lock to be held by the caller. */
    static inline bool irq_is_pending(struct vgic_irq *irq)
    {
    if (irq->config == VGIC_CONFIG_EDGE)

    \
     
     \ /
      Last update: 2018-05-28 14:59    [W:4.097 / U:0.088 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site