Patch "iommu/vt-d: Clear PRQ overflow only when PRQ is empty" has been added to the 5.11-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    iommu/vt-d: Clear PRQ overflow only when PRQ is empty

to the 5.11-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     iommu-vt-d-clear-prq-overflow-only-when-prq-is-empty.patch
and it can be found in the queue-5.11 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 5908cf154f68db93f7ce7225ab48ec747fe52a12
Author: Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx>
Date:   Tue Jan 26 16:07:29 2021 +0800

    iommu/vt-d: Clear PRQ overflow only when PRQ is empty
    
    [ Upstream commit 28a77185f1cd0650b664f54614143aaaa3a7a615 ]
    
    It is incorrect to always clear PRO when it's set w/o first checking
    whether the overflow condition has been cleared. Current code assumes
    that if an overflow condition occurs it must have been cleared by earlier
    loop. However since the code runs in a threaded context, the overflow
    condition could occur even after setting the head to the tail under some
    extreme condition. To be sane, we should read both head/tail again when
    seeing a pending PRO and only clear PRO after all pending PRs have been
    handled.
    
    Suggested-by: Kevin Tian <kevin.tian@xxxxxxxxx>
    Signed-off-by: Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx>
    Link: https://lore.kernel.org/linux-iommu/MWHPR11MB18862D2EA5BD432BF22D99A48CA09@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/
    Link: https://lore.kernel.org/r/20210126080730.2232859-2-baolu.lu@xxxxxxxxxxxxxxx
    Signed-off-by: Joerg Roedel <jroedel@xxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/iommu/intel/svm.c b/drivers/iommu/intel/svm.c
index 18a9f05df407..b3bcd6dec93e 100644
--- a/drivers/iommu/intel/svm.c
+++ b/drivers/iommu/intel/svm.c
@@ -1079,8 +1079,17 @@ static irqreturn_t prq_event_thread(int irq, void *d)
 	 * Clear the page request overflow bit and wake up all threads that
 	 * are waiting for the completion of this handling.
 	 */
-	if (readl(iommu->reg + DMAR_PRS_REG) & DMA_PRS_PRO)
-		writel(DMA_PRS_PRO, iommu->reg + DMAR_PRS_REG);
+	if (readl(iommu->reg + DMAR_PRS_REG) & DMA_PRS_PRO) {
+		pr_info_ratelimited("IOMMU: %s: PRQ overflow detected\n",
+				    iommu->name);
+		head = dmar_readq(iommu->reg + DMAR_PQH_REG) & PRQ_RING_MASK;
+		tail = dmar_readq(iommu->reg + DMAR_PQT_REG) & PRQ_RING_MASK;
+		if (head == tail) {
+			writel(DMA_PRS_PRO, iommu->reg + DMAR_PRS_REG);
+			pr_info_ratelimited("IOMMU: %s: PRQ overflow cleared",
+					    iommu->name);
+		}
+	}
 
 	if (!completion_done(&iommu->prq_complete))
 		complete(&iommu->prq_complete);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux