Patch "iommu/amd: Invalidate cache before removing device from domain list" has been added to the 6.9-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/amd: Invalidate cache before removing device from domain list

to the 6.9-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-amd-invalidate-cache-before-removing-device-fr.patch
and it can be found in the queue-6.9 subdirectory.

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



commit 87c5fa4ce9c8ed264aaec20f6b3c6b74373b1ba2
Author: Vasant Hegde <vasant.hegde@xxxxxxx>
Date:   Thu Jun 20 06:05:52 2024 +0000

    iommu/amd: Invalidate cache before removing device from domain list
    
    [ Upstream commit c362f32a59a84fe4453abecc6b53f5f70894a6d5 ]
    
    Commit 87a6f1f22c97 ("iommu/amd: Introduce per-device domain ID to fix
    potential TLB aliasing issue") introduced per device domain ID when
    domain is configured with v2 page table. And in invalidation path, it
    uses per device structure (dev_data->gcr3_info.domid) to get the domain ID.
    
    In detach_device() path, current code tries to invalidate IOMMU cache
    after removing dev_data from domain device list. This means when domain
    is configured with v2 page table, amd_iommu_domain_flush_all() will not be
    able to invalidate cache as device is already removed from domain device
    list.
    
    This is causing change domain tests (changing domain type from identity to DMA)
    to fail with IO_PAGE_FAULT issue.
    
    Hence invalidate cache and update DTE before updating data structures.
    
    Reported-by: FahHean Lee <fahhean.lee@xxxxxxx>
    Reported-by: Dheeraj Kumar Srivastava <dheerajkumar.srivastava@xxxxxxx>
    Fixes: 87a6f1f22c97 ("iommu/amd: Introduce per-device domain ID to fix potential TLB aliasing issue")
    Tested-by: Dheeraj Kumar Srivastava <dheerajkumar.srivastava@xxxxxxx>
    Tested-by: Sairaj Arun Kodilkar <sairaj.arunkodilkar@xxxxxxx>
    Tested-by: FahHean Lee <fahhean.lee@xxxxxxx>
    Signed-off-by: Vasant Hegde <vasant.hegde@xxxxxxx>
    Reviewed-by: Jerry Snitselaar <jsnitsel@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20240620060552.13984-1-vasant.hegde@xxxxxxx
    Signed-off-by: Joerg Roedel <jroedel@xxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index d19a12a158085..e2b900ffbc158 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -2061,6 +2061,12 @@ static void do_detach(struct iommu_dev_data *dev_data)
 	struct protection_domain *domain = dev_data->domain;
 	struct amd_iommu *iommu = get_amd_iommu_from_dev_data(dev_data);
 
+	/* Clear DTE and flush the entry */
+	amd_iommu_dev_update_dte(dev_data, false);
+
+	/* Flush IOTLB and wait for the flushes to finish */
+	amd_iommu_domain_flush_all(domain);
+
 	/* Clear GCR3 table */
 	if (domain->pd_mode == PD_MODE_V2) {
 		update_gcr3(dev_data, 0, 0, false);
@@ -2071,12 +2077,6 @@ static void do_detach(struct iommu_dev_data *dev_data)
 	dev_data->domain = NULL;
 	list_del(&dev_data->list);
 
-	/* Clear DTE and flush the entry */
-	amd_iommu_dev_update_dte(dev_data, false);
-
-	/* Flush IOTLB and wait for the flushes to finish */
-	amd_iommu_domain_flush_all(domain);
-
 	/* decrease reference counters - needs to happen after the flushes */
 	domain->dev_iommu[iommu->index] -= 1;
 	domain->dev_cnt                 -= 1;




[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