RDMA/usnic: use iommu_map_atomic() under spin_lock()
authorYang Yingliang <yangyingliang@huawei.com>
Sun, 29 Jan 2023 09:37:57 +0000 (17:37 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 14 Feb 2023 18:11:43 +0000 (19:11 +0100)
[ Upstream commit b7e08a5a63a11627601915473c3b569c1f6c6c06 ]

usnic_uiom_map_sorted_intervals() is called under spin_lock(), iommu_map()
might sleep, use iommu_map_atomic() to avoid potential sleep in atomic
context.

Fixes: e3cf00d0a87f ("IB/usnic: Add Cisco VIC low-level hardware driver")
Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
Link: https://lore.kernel.org/r/20230129093757.637354-1-yangyingliang@huawei.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/infiniband/hw/usnic/usnic_uiom.c

index 67923ced6e2d193426d1ca720d1b5c55161df555..b343f6f1bda5777d6fb99edfe58b042fd817c18b 100644 (file)
@@ -277,8 +277,8 @@ iter_chunk:
                                size = pa_end - pa_start + PAGE_SIZE;
                                usnic_dbg("va 0x%lx pa %pa size 0x%zx flags 0x%x",
                                        va_start, &pa_start, size, flags);
-                               err = iommu_map(pd->domain, va_start, pa_start,
-                                                       size, flags);
+                               err = iommu_map_atomic(pd->domain, va_start,
+                                                      pa_start, size, flags);
                                if (err) {
                                        usnic_err("Failed to map va 0x%lx pa %pa size 0x%zx with err %d\n",
                                                va_start, &pa_start, size, err);
@@ -294,8 +294,8 @@ iter_chunk:
                                size = pa - pa_start + PAGE_SIZE;
                                usnic_dbg("va 0x%lx pa %pa size 0x%zx flags 0x%x\n",
                                        va_start, &pa_start, size, flags);
-                               err = iommu_map(pd->domain, va_start, pa_start,
-                                               size, flags);
+                               err = iommu_map_atomic(pd->domain, va_start,
+                                                      pa_start, size, flags);
                                if (err) {
                                        usnic_err("Failed to map va 0x%lx pa %pa size 0x%zx with err %d\n",
                                                va_start, &pa_start, size, err);