RDMA/bnxt_re: Remove dynamic pkey table
authorKamal Heib <kamalheib1@gmail.com>
Thu, 25 Nov 2021 03:36:15 +0000 (05:36 +0200)
committerJason Gunthorpe <jgg@nvidia.com>
Thu, 25 Nov 2021 17:35:51 +0000 (13:35 -0400)
The RoCE spec requires RoCE devices to support only the default pkey.
However the bnxt_re driver maintains a 0xFFFF entry pkey table and uses
only the first entry. Remove the pkey table and hard code a table of
length one hard wired with the default pkey.

Link: https://lore.kernel.org/r/20211125033615.483750-1-kamalheib1@gmail.com
Signed-off-by: Kamal Heib <kamalheib1@gmail.com>
Reviewed-by: Devesh Sharma <devesh.s.sharma@oracle.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/hw/bnxt_re/ib_verbs.c
drivers/infiniband/hw/bnxt_re/qplib_fp.c
drivers/infiniband/hw/bnxt_re/qplib_res.c
drivers/infiniband/hw/bnxt_re/qplib_res.h
drivers/infiniband/hw/bnxt_re/qplib_sp.c
drivers/infiniband/hw/bnxt_re/qplib_sp.h

index 29cc0d1..3224f18 100644 (file)
@@ -262,13 +262,12 @@ void bnxt_re_query_fw_str(struct ib_device *ibdev, char *str)
 int bnxt_re_query_pkey(struct ib_device *ibdev, u32 port_num,
                       u16 index, u16 *pkey)
 {
-       struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev);
+       if (index > 0)
+               return -EINVAL;
 
-       /* Ignore port_num */
+       *pkey = IB_DEFAULT_PKEY_FULL;
 
-       memset(pkey, 0, sizeof(*pkey));
-       return bnxt_qplib_get_pkey(&rdev->qplib_res,
-                                  &rdev->qplib_res.pkey_tbl, index, pkey);
+       return 0;
 }
 
 int bnxt_re_query_gid(struct ib_device *ibdev, u32 port_num,
index ca88849..f6472cc 100644 (file)
@@ -46,6 +46,7 @@
 #include <linux/delay.h>
 #include <linux/prefetch.h>
 #include <linux/if_ether.h>
+#include <rdma/ib_mad.h>
 
 #include "roce_hsi.h"
 
@@ -1232,7 +1233,7 @@ int bnxt_qplib_modify_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)
        struct bnxt_qplib_rcfw *rcfw = res->rcfw;
        struct cmdq_modify_qp req;
        struct creq_modify_qp_resp resp;
-       u16 cmd_flags = 0, pkey;
+       u16 cmd_flags = 0;
        u32 temp32[4];
        u32 bmask;
        int rc;
@@ -1255,11 +1256,9 @@ int bnxt_qplib_modify_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)
        if (bmask & CMDQ_MODIFY_QP_MODIFY_MASK_ACCESS)
                req.access = qp->access;
 
-       if (bmask & CMDQ_MODIFY_QP_MODIFY_MASK_PKEY) {
-               if (!bnxt_qplib_get_pkey(res, &res->pkey_tbl,
-                                        qp->pkey_index, &pkey))
-                       req.pkey = cpu_to_le16(pkey);
-       }
+       if (bmask & CMDQ_MODIFY_QP_MODIFY_MASK_PKEY)
+               req.pkey = IB_DEFAULT_PKEY_FULL;
+
        if (bmask & CMDQ_MODIFY_QP_MODIFY_MASK_QKEY)
                req.qkey = cpu_to_le32(qp->qkey);
 
index bc1ba4b..126d4f2 100644 (file)
@@ -649,31 +649,6 @@ static void bnxt_qplib_init_sgid_tbl(struct bnxt_qplib_sgid_tbl *sgid_tbl,
        memset(sgid_tbl->hw_id, -1, sizeof(u16) * sgid_tbl->max);
 }
 
-static void bnxt_qplib_free_pkey_tbl(struct bnxt_qplib_res *res,
-                                    struct bnxt_qplib_pkey_tbl *pkey_tbl)
-{
-       if (!pkey_tbl->tbl)
-               dev_dbg(&res->pdev->dev, "PKEY tbl not present\n");
-       else
-               kfree(pkey_tbl->tbl);
-
-       pkey_tbl->tbl = NULL;
-       pkey_tbl->max = 0;
-       pkey_tbl->active = 0;
-}
-
-static int bnxt_qplib_alloc_pkey_tbl(struct bnxt_qplib_res *res,
-                                    struct bnxt_qplib_pkey_tbl *pkey_tbl,
-                                    u16 max)
-{
-       pkey_tbl->tbl = kcalloc(max, sizeof(u16), GFP_KERNEL);
-       if (!pkey_tbl->tbl)
-               return -ENOMEM;
-
-       pkey_tbl->max = max;
-       return 0;
-};
-
 /* PDs */
 int bnxt_qplib_alloc_pd(struct bnxt_qplib_pd_tbl *pdt, struct bnxt_qplib_pd *pd)
 {
@@ -843,24 +818,6 @@ unmap_io:
        return -ENOMEM;
 }
 
-/* PKEYs */
-static void bnxt_qplib_cleanup_pkey_tbl(struct bnxt_qplib_pkey_tbl *pkey_tbl)
-{
-       memset(pkey_tbl->tbl, 0, sizeof(u16) * pkey_tbl->max);
-       pkey_tbl->active = 0;
-}
-
-static void bnxt_qplib_init_pkey_tbl(struct bnxt_qplib_res *res,
-                                    struct bnxt_qplib_pkey_tbl *pkey_tbl)
-{
-       u16 pkey = 0xFFFF;
-
-       memset(pkey_tbl->tbl, 0, sizeof(u16) * pkey_tbl->max);
-
-       /* pkey default = 0xFFFF */
-       bnxt_qplib_add_pkey(res, pkey_tbl, &pkey, false);
-}
-
 /* Stats */
 static void bnxt_qplib_free_stats_ctx(struct pci_dev *pdev,
                                      struct bnxt_qplib_stats *stats)
@@ -891,21 +848,18 @@ static int bnxt_qplib_alloc_stats_ctx(struct pci_dev *pdev,
 
 void bnxt_qplib_cleanup_res(struct bnxt_qplib_res *res)
 {
-       bnxt_qplib_cleanup_pkey_tbl(&res->pkey_tbl);
        bnxt_qplib_cleanup_sgid_tbl(res, &res->sgid_tbl);
 }
 
 int bnxt_qplib_init_res(struct bnxt_qplib_res *res)
 {
        bnxt_qplib_init_sgid_tbl(&res->sgid_tbl, res->netdev);
-       bnxt_qplib_init_pkey_tbl(res, &res->pkey_tbl);
 
        return 0;
 }
 
 void bnxt_qplib_free_res(struct bnxt_qplib_res *res)
 {
-       bnxt_qplib_free_pkey_tbl(res, &res->pkey_tbl);
        bnxt_qplib_free_sgid_tbl(res, &res->sgid_tbl);
        bnxt_qplib_free_pd_tbl(&res->pd_tbl);
        bnxt_qplib_free_dpi_tbl(res, &res->dpi_tbl);
@@ -924,10 +878,6 @@ int bnxt_qplib_alloc_res(struct bnxt_qplib_res *res, struct pci_dev *pdev,
        if (rc)
                goto fail;
 
-       rc = bnxt_qplib_alloc_pkey_tbl(res, &res->pkey_tbl, dev_attr->max_pkey);
-       if (rc)
-               goto fail;
-
        rc = bnxt_qplib_alloc_pd_tbl(res, &res->pd_tbl, dev_attr->max_pd);
        if (rc)
                goto fail;
index e1411a2..982e2c9 100644 (file)
@@ -185,12 +185,6 @@ struct bnxt_qplib_sgid_tbl {
        u8                              *vlan;
 };
 
-struct bnxt_qplib_pkey_tbl {
-       u16                             *tbl;
-       u16                             max;
-       u16                             active;
-};
-
 struct bnxt_qplib_dpi {
        u32                             dpi;
        void __iomem                    *dbr;
@@ -258,7 +252,6 @@ struct bnxt_qplib_res {
        struct bnxt_qplib_rcfw          *rcfw;
        struct bnxt_qplib_pd_tbl        pd_tbl;
        struct bnxt_qplib_sgid_tbl      sgid_tbl;
-       struct bnxt_qplib_pkey_tbl      pkey_tbl;
        struct bnxt_qplib_dpi_tbl       dpi_tbl;
        bool                            prio;
        bool                            is_vf;
index 379e715..b802981 100644 (file)
@@ -146,17 +146,7 @@ int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw,
        attr->max_srq = le16_to_cpu(sb->max_srq);
        attr->max_srq_wqes = le32_to_cpu(sb->max_srq_wr) - 1;
        attr->max_srq_sges = sb->max_srq_sge;
-       attr->max_pkey = le32_to_cpu(sb->max_pkeys);
-       /*
-        * Some versions of FW reports more than 0xFFFF.
-        * Restrict it for now to 0xFFFF to avoid
-        * reporting trucated value
-        */
-       if (attr->max_pkey > 0xFFFF) {
-               /* ib_port_attr::pkey_tbl_len is u16 */
-               attr->max_pkey = 0xFFFF;
-       }
-
+       attr->max_pkey = 1;
        attr->max_inline_data = le32_to_cpu(sb->max_inline_data);
        attr->l2_db_size = (sb->l2_db_space_size + 1) *
                            (0x01 << RCFW_DBR_BASE_PAGE_SHIFT);
@@ -414,93 +404,6 @@ int bnxt_qplib_update_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl,
        return rc;
 }
 
-/* pkeys */
-int bnxt_qplib_get_pkey(struct bnxt_qplib_res *res,
-                       struct bnxt_qplib_pkey_tbl *pkey_tbl, u16 index,
-                       u16 *pkey)
-{
-       if (index == 0xFFFF) {
-               *pkey = 0xFFFF;
-               return 0;
-       }
-       if (index >= pkey_tbl->max) {
-               dev_err(&res->pdev->dev,
-                       "Index %d exceeded PKEY table max (%d)\n",
-                       index, pkey_tbl->max);
-               return -EINVAL;
-       }
-       memcpy(pkey, &pkey_tbl->tbl[index], sizeof(*pkey));
-       return 0;
-}
-
-int bnxt_qplib_del_pkey(struct bnxt_qplib_res *res,
-                       struct bnxt_qplib_pkey_tbl *pkey_tbl, u16 *pkey,
-                       bool update)
-{
-       int i, rc = 0;
-
-       if (!pkey_tbl) {
-               dev_err(&res->pdev->dev, "PKEY table not allocated\n");
-               return -EINVAL;
-       }
-
-       /* Do we need a pkey_lock here? */
-       if (!pkey_tbl->active) {
-               dev_err(&res->pdev->dev, "PKEY table has no active entries\n");
-               return -ENOMEM;
-       }
-       for (i = 0; i < pkey_tbl->max; i++) {
-               if (!memcmp(&pkey_tbl->tbl[i], pkey, sizeof(*pkey)))
-                       break;
-       }
-       if (i == pkey_tbl->max) {
-               dev_err(&res->pdev->dev,
-                       "PKEY 0x%04x not found in the pkey table\n", *pkey);
-               return -ENOMEM;
-       }
-       memset(&pkey_tbl->tbl[i], 0, sizeof(*pkey));
-       pkey_tbl->active--;
-
-       /* unlock */
-       return rc;
-}
-
-int bnxt_qplib_add_pkey(struct bnxt_qplib_res *res,
-                       struct bnxt_qplib_pkey_tbl *pkey_tbl, u16 *pkey,
-                       bool update)
-{
-       int i, free_idx, rc = 0;
-
-       if (!pkey_tbl) {
-               dev_err(&res->pdev->dev, "PKEY table not allocated\n");
-               return -EINVAL;
-       }
-
-       /* Do we need a pkey_lock here? */
-       if (pkey_tbl->active == pkey_tbl->max) {
-               dev_err(&res->pdev->dev, "PKEY table is full\n");
-               return -ENOMEM;
-       }
-       free_idx = pkey_tbl->max;
-       for (i = 0; i < pkey_tbl->max; i++) {
-               if (!memcmp(&pkey_tbl->tbl[i], pkey, sizeof(*pkey)))
-                       return -EALREADY;
-               else if (!pkey_tbl->tbl[i] && free_idx == pkey_tbl->max)
-                       free_idx = i;
-       }
-       if (free_idx == pkey_tbl->max) {
-               dev_err(&res->pdev->dev,
-                       "PKEY table is FULL but count is not MAX??\n");
-               return -ENOMEM;
-       }
-       /* Add PKEY to the pkey_tbl */
-       memcpy(&pkey_tbl->tbl[free_idx], pkey, sizeof(*pkey));
-       pkey_tbl->active++;
-
-       /* unlock */
-       return rc;
-}
-
 /* AH */
 int bnxt_qplib_create_ah(struct bnxt_qplib_res *res, struct bnxt_qplib_ah *ah,
                         bool block)
index a18f568..5939e8f 100644 (file)
@@ -255,15 +255,6 @@ int bnxt_qplib_add_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl,
 int bnxt_qplib_update_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl,
                           struct bnxt_qplib_gid *gid, u16 gid_idx,
                           const u8 *smac);
-int bnxt_qplib_get_pkey(struct bnxt_qplib_res *res,
-                       struct bnxt_qplib_pkey_tbl *pkey_tbl, u16 index,
-                       u16 *pkey);
-int bnxt_qplib_del_pkey(struct bnxt_qplib_res *res,
-                       struct bnxt_qplib_pkey_tbl *pkey_tbl, u16 *pkey,
-                       bool update);
-int bnxt_qplib_add_pkey(struct bnxt_qplib_res *res,
-                       struct bnxt_qplib_pkey_tbl *pkey_tbl, u16 *pkey,
-                       bool update);
 int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw,
                            struct bnxt_qplib_dev_attr *attr, bool vf);
 int bnxt_qplib_set_func_resources(struct bnxt_qplib_res *res,