FAILED: patch "[PATCH] IB/hfi1: Fix leak of rcvhdrtail_dummy_kvaddr" failed to apply to 4.14-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.14-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 60a8b5a1611b4a26de4839ab9c1fc2a9cf3e17c1 Mon Sep 17 00:00:00 2001
From: Mike Marciniszyn <[email protected]>
Date: Mon, 29 Nov 2021 14:20:08 -0500
Subject: [PATCH] IB/hfi1: Fix leak of rcvhdrtail_dummy_kvaddr
This buffer is currently allocated in hfi1_init():
if (reinit)
ret = init_after_reset(dd);
else
ret = loadtime_init(dd);
if (ret)
goto done;
/* allocate dummy tail memory for all receive contexts */
dd->rcvhdrtail_dummy_kvaddr = dma_alloc_coherent(&dd->pcidev->dev,
sizeof(u64),
&dd->rcvhdrtail_dummy_dma,
GFP_KERNEL);
if (!dd->rcvhdrtail_dummy_kvaddr) {
dd_dev_err(dd, "cannot allocate dummy tail memory\n");
ret = -ENOMEM;
goto done;
}The reinit triggered path will overwrite the old allocation and leak it.
Fix by moving the allocation to hfi1_alloc_devdata() and the deallocation to hfi1_free_devdata().
Fixes 46b010d3eeb8 ("staging/rdma/hfi1: Workaround to prevent corruption during packet delivery")
Signed-off-by Mike Marciniszyn <[email protected]>
Signed-off-by Dennis Dalessandro <[email protected]>
Signed-off-by Jason Gunthorpe <[email protected]>
drivers/infiniband/hw/hfi1/init.c +14 -19
@@ -875,18 +875,6 @@ int hfi1_init(struct hfi1_devdata *dd, int reinit)if (ret) goto done; -/* allocate dummy tail memory for all receive contexts */ - dd->rcvhdrtail_dummy_kvaddr =dma_alloc_coherent (&dd->pcidev->dev, -sizeof (u64), - &dd->rcvhdrtail_dummy_dma, -GFP_KERNEL ); - -if (!dd->rcvhdrtail_dummy_kvaddr) { -dd_dev_err (dd,"cannot allocate dummy tail memory\n" ); - ret = -ENOMEM ; - goto done; - } -/* dd->rcd can be NULL if early initialization failed */ for (i =0 ; dd->rcd && i < dd->first_dyn_alloc_ctxt; ++i) {/*
@@ -1200,6 +1188,11 @@ void hfi1_free_devdata(struct hfi1_devdata *dd) dd->tx_opstats =NULL ;kfree (dd->comp_vect); dd->comp_vect =NULL ; +if (dd->rcvhdrtail_dummy_kvaddr) +dma_free_coherent (&dd->pcidev->dev,sizeof (u64), + (void *)dd->rcvhdrtail_dummy_kvaddr, + dd->rcvhdrtail_dummy_dma); + dd->rcvhdrtail_dummy_kvaddr =NULL ;sdma_clean (dd, dd->num_sdma);rvt_dealloc_device (&dd->verbs_dev.rdi); }
@@ -1297,6 +1290,15 @@ static struct hfi1_devdata *hfi1_alloc_devdata(struct pci_dev *pdev, goto bail; } +/* allocate dummy tail memory for all receive contexts */ + dd->rcvhdrtail_dummy_kvaddr = +dma_alloc_coherent (&dd->pcidev->dev,sizeof (u64), + &dd->rcvhdrtail_dummy_dma,GFP_KERNEL ); +if (!dd->rcvhdrtail_dummy_kvaddr) { + ret = -ENOMEM ; + goto bail; + } +atomic_set (&dd->ipoib_rsm_usr_num,0 );return dd;
@@ -1504,13 +1506,6 @@ static void cleanup_device_data(struct hfi1_devdata *dd)free_credit_return (dd); -if (dd->rcvhdrtail_dummy_kvaddr) { -dma_free_coherent (&dd->pcidev->dev,sizeof (u64), - (void *)dd->rcvhdrtail_dummy_kvaddr, - dd->rcvhdrtail_dummy_dma); - dd->rcvhdrtail_dummy_kvaddr =NULL ; - } -/* * Free any resources still in use (usually just kernel contexts) * at unload; we do for ctxtcnt, because that's what we allocate.