RDMA/qib: Remove deprecated kmap() call
authorIra Weiny <ira.weiny@intel.com>
Tue, 7 Mar 2023 17:15:31 +0000 (09:15 -0800)
committerLeon Romanovsky <leon@kernel.org>
Sun, 19 Mar 2023 09:35:53 +0000 (11:35 +0200)
kmap() has been deprecated in favor of the kmap_local_page() call.
kmap_local_page() is thread local.

In the sdma coalesce case the page allocated is potentially free'ed in a
different context through qib_sdma_get_complete() ->
qib_user_sdma_make_progress().  The use of kmap_local_page() is
inappropriate in this call path.  However, the page is allocated using
GFP_KERNEL and will never be from highmem.

Remove the use of kmap calls and use page_address() in this case.

Signed-off-by: Ira Weiny <ira.weiny@intel.com>
Link: https://lore.kernel.org/r/20230217-kmap-qib-v1-1-e5a6fde167e0@intel.com
Acked-by: Dennis Dalessandro <dennis.dalessandro@cornelisnetworks.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/qib/qib_user_sdma.c

index 9fe03d6..336eb15 100644 (file)
@@ -320,7 +320,6 @@ static int qib_user_sdma_page_to_frags(const struct qib_devdata *dd,
                        unpin_user_page(page);
                } else {
                        /* coalesce case */
-                       kunmap(page);
                        __free_page(page);
                }
                ret = -ENOMEM;
@@ -572,7 +571,7 @@ static int qib_user_sdma_coalesce(const struct qib_devdata *dd,
                goto done;
        }
 
-       mpage = kmap(page);
+       mpage = page_address(page);
        mpage_save = mpage;
        for (i = 0; i < niov; i++) {
                int cfur;
@@ -581,7 +580,7 @@ static int qib_user_sdma_coalesce(const struct qib_devdata *dd,
                                      iov[i].iov_base, iov[i].iov_len);
                if (cfur) {
                        ret = -EFAULT;
-                       goto free_unmap;
+                       goto page_free;
                }
 
                mpage += iov[i].iov_len;
@@ -592,8 +591,7 @@ static int qib_user_sdma_coalesce(const struct qib_devdata *dd,
                        page, 0, 0, len, mpage_save);
        goto done;
 
-free_unmap:
-       kunmap(page);
+page_free:
        __free_page(page);
 done:
        return ret;
@@ -627,9 +625,6 @@ static void qib_user_sdma_free_pkt_frag(struct device *dev,
                                       pkt->addr[i].dma_length,
                                       DMA_TO_DEVICE);
 
-               if (pkt->addr[i].kvaddr)
-                       kunmap(pkt->addr[i].page);
-
                if (pkt->addr[i].put_page)
                        unpin_user_page(pkt->addr[i].page);
                else