Patch "powerpc/pseries/iommu: enable_ddw incorrectly returns direct mapping for SR-IOV device" has been added to the 6.6-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

    powerpc/pseries/iommu: enable_ddw incorrectly returns direct mapping for SR-IOV device

to the 6.6-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:
     powerpc-pseries-iommu-enable_ddw-incorrectly-returns.patch
and it can be found in the queue-6.6 subdirectory.

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



commit 378d567a97cbfd7670dd69fc2f29994ab5c7d645
Author: Gaurav Batra <gbatra@xxxxxxxxxxxxxxxxxx>
Date:   Mon Oct 2 22:08:02 2023 -0500

    powerpc/pseries/iommu: enable_ddw incorrectly returns direct mapping for SR-IOV device
    
    [ Upstream commit 3bf983e4e93ce8e6d69e9d63f52a66ec0856672e ]
    
    When a device is initialized, the driver invokes dma_supported() twice -
    first for streaming mappings followed by coherent mappings. For an
    SR-IOV device, default window is deleted and DDW created. With vPMEM
    enabled, TCE mappings are dynamically created for both vPMEM and SR-IOV
    device.  There are no direct mappings.
    
    First time when dma_supported() is called with 64 bit mask, DDW is created
    and marked as dynamic window. The second time dma_supported() is called,
    enable_ddw() finds existing window for the device and incorrectly returns
    it as "direct mapping".
    
    This only happens when size of DDW is big enough to map max LPAR memory.
    
    This results in streaming TCEs to not get dynamically mapped, since code
    incorrently assumes these are already pre-mapped. The adapter initially
    comes up but goes down due to EEH.
    
    Fixes: 381ceda88c4c ("powerpc/pseries/iommu: Make use of DDW for indirect mapping")
    Cc: stable@xxxxxxxxxxxxxxx # v5.15+
    Signed-off-by: Gaurav Batra <gbatra@xxxxxxxxxxxxxxxxxx>
    Signed-off-by: Michael Ellerman <mpe@xxxxxxxxxxxxxx>
    Link: https://msgid.link/20231003030802.47914-1-gbatra@xxxxxxxxxxxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c
index 16d93b580f61f..496e16c588aaa 100644
--- a/arch/powerpc/platforms/pseries/iommu.c
+++ b/arch/powerpc/platforms/pseries/iommu.c
@@ -914,7 +914,8 @@ static int remove_ddw(struct device_node *np, bool remove_prop, const char *win_
 	return 0;
 }
 
-static bool find_existing_ddw(struct device_node *pdn, u64 *dma_addr, int *window_shift)
+static bool find_existing_ddw(struct device_node *pdn, u64 *dma_addr, int *window_shift,
+			      bool *direct_mapping)
 {
 	struct dma_win *window;
 	const struct dynamic_dma_window_prop *dma64;
@@ -927,6 +928,7 @@ static bool find_existing_ddw(struct device_node *pdn, u64 *dma_addr, int *windo
 			dma64 = window->prop;
 			*dma_addr = be64_to_cpu(dma64->dma_base);
 			*window_shift = be32_to_cpu(dma64->window_shift);
+			*direct_mapping = window->direct;
 			found = true;
 			break;
 		}
@@ -1270,10 +1272,8 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn)
 
 	mutex_lock(&dma_win_init_mutex);
 
-	if (find_existing_ddw(pdn, &dev->dev.archdata.dma_offset, &len)) {
-		direct_mapping = (len >= max_ram_len);
+	if (find_existing_ddw(pdn, &dev->dev.archdata.dma_offset, &len, &direct_mapping))
 		goto out_unlock;
-	}
 
 	/*
 	 * If we already went through this for a previous function of



[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