• Will Deacon's avatar
    iommu/arm-smmu-v3: Use explicit mb() when moving cons pointer · d765bc20
    Will Deacon authored
    [ Upstream commit a868e853 ]
    
    After removing an entry from a queue (e.g. reading an event in
    arm_smmu_evtq_thread()) it is necessary to advance the MMIO consumer
    pointer to free the queue slot back to the SMMU. A memory barrier is
    required here so that all reads targetting the queue entry have
    completed before the consumer pointer is updated.
    
    The implementation of queue_inc_cons() relies on a writel() to complete
    the previous reads, but this is incorrect because writel() is only
    guaranteed to complete prior writes. This patch replaces the call to
    writel() with an mb(); writel_relaxed() sequence, which gives us the
    read->write ordering which we require.
    
    Cc: Robin Murphy <robin.murphy@arm.com>
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    d765bc20
arm-smmu-v3.c 74.4 KB