IB/hfi1: Check for error on call to alloc_rsm_map_table [Linux 4.14.137]

This Linux kernel change "IB/hfi1: Check for error on call to alloc_rsm_map_table" is included in the Linux 4.14.137 release. This change is authored by John Fleck <john.fleck [at] intel.com> on Mon Jul 15 12:45:21 2019 -0400. The commit for this change in Linux stable tree is 5ba28ec (patch) which is from upstream commit cd48a82. The same Linux upstream change may have been applied to various maintained Linux releases and you can find all Linux releases containing changes from upstream cd48a82.

IB/hfi1: Check for error on call to alloc_rsm_map_table

commit cd48a82087231fdba0e77521102386c6ed0168d6 upstream.

The call to alloc_rsm_map_table does not check if the kmalloc fails.
Check for a NULL on alloc, and bail if it fails.

Fixes: 372cc85a13c9 ("IB/hfi1: Extract RSM map table init from QOS")
Link: https://lore.kernel.org/r/20190715164521.74174.27047.stgit@awfm-01.aw.intel.com
Cc: <stable@vger.kernel.org>
Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: John Fleck <john.fleck@intel.com>
Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

There are 11 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/infiniband/hw/hfi1/chip.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/infiniband/hw/hfi1/chip.c b/drivers/infiniband/hw/hfi1/chip.c
index 69a79fd..9dcdc0a 100644
--- a/drivers/infiniband/hw/hfi1/chip.c
+++ b/drivers/infiniband/hw/hfi1/chip.c
@@ -14566,7 +14566,7 @@ void hfi1_deinit_vnic_rsm(struct hfi1_devdata *dd)
        clear_rcvctrl(dd, RCV_CTRL_RCV_RSM_ENABLE_SMASK);
 }

-static void init_rxe(struct hfi1_devdata *dd)
+static int init_rxe(struct hfi1_devdata *dd)
 {
    struct rsm_map_table *rmt;
    u64 val;
@@ -14575,6 +14575,9 @@ static void init_rxe(struct hfi1_devdata *dd)
    write_csr(dd, RCV_ERR_MASK, ~0ull);

    rmt = alloc_rsm_map_table(dd);
+   if (!rmt)
+       return -ENOMEM;
+
    /* set up QOS, including the QPN map table */
    init_qos(dd, rmt);
    init_user_fecn_handling(dd, rmt);
@@ -14599,6 +14602,7 @@ static void init_rxe(struct hfi1_devdata *dd)
    val = read_csr(dd, RCV_BYPASS);
    val |= (4ull << 16);
    write_csr(dd, RCV_BYPASS, val);
+   return 0;
 }

 static void init_other(struct hfi1_devdata *dd)
@@ -15154,7 +15158,10 @@ struct hfi1_devdata *hfi1_init_dd(struct pci_dev *pdev,
        goto bail_cleanup;

    /* set initial RXE CSRs */
-   init_rxe(dd);
+   ret = init_rxe(dd);
+   if (ret)
+       goto bail_cleanup;
+
    /* set initial TXE CSRs */
    init_txe(dd);
    /* set initial non-RXE, non-TXE CSRs */

Leave a Reply

Your email address will not be published. Required fields are marked *