• Lior Amsalem's avatar
    irqchip: armada-370-xp: fix MSI race condition · c7f7bd4a
    Lior Amsalem authored
    In the Armada 370/XP driver, when we receive an IRQ 1, we read the
    list of doorbells that caused the interrupt from register
    ARMADA_370_XP_IN_DRBEL_CAUSE_OFFS. This gives the list of MSIs that
    were generated. However, instead of acknowledging only the MSIs that
    were generated, we acknowledge *all* the MSIs, by writing
    ~MSI_DOORBELL_MASK in the ARMADA_370_XP_IN_DRBEL_CAUSE_OFFS register.
    
    This creates a race condition: if a new MSI that isn't part of the
    ones read into the temporary "msimask" variable is fired before we
    acknowledge all MSIs, then we will simply loose it.
    
    It is important to mention that this ARMADA_370_XP_IN_DRBEL_CAUSE_OFFS
    register has the following behavior: "A CPU write of 0 clears the bits
    in this field. A CPU write of 1 has no effect". This is what allows us
    to simply write ~msimask to acknoledge the handled MSIs.
    
    Notice that the same problem is present in the IPI implementation, but
    it is fixed as a separate patch, so that this IPI fix can be pushed to
    older stable versions as appropriate (all the way to 3.8), while the
    MSI code only appeared in 3.13.
    Signed-off-by: default avatarLior Amsalem <alior@marvell.com>
    Signed-off-by: default avatarThomas Petazzoni <thomas.petazzoni@free-electrons.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarJason Cooper <jason@lakedaemon.net>
    c7f7bd4a
irq-armada-370-xp.c 11.8 KB