RDMA/rxe: Remove pkey table
authorKamal Heib <kamalheib1@gmail.com>
Tue, 21 Jul 2020 10:16:18 +0000 (13:16 +0300)
committerJason Gunthorpe <jgg@nvidia.com>
Fri, 31 Jul 2020 19:17:56 +0000 (16:17 -0300)
The RoCE spec requires RoCE devices to support only the default pkey.
However the rxe driver maintains a 64 enties 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. Replace all checks of the pkey_table
with a comparison to the default_pkey instead.

Link: https://lore.kernel.org/r/20200721101618.686110-1-kamalheib1@gmail.com
Signed-off-by: Kamal Heib <kamalheib1@gmail.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/sw/rxe/rxe.c
drivers/infiniband/sw/rxe/rxe_param.h
drivers/infiniband/sw/rxe/rxe_recv.c
drivers/infiniband/sw/rxe/rxe_req.c
drivers/infiniband/sw/rxe/rxe_verbs.c
drivers/infiniband/sw/rxe/rxe_verbs.h

index efcb72c92be6726179c279eb9480610cc8f99c20..907203afbd99431cc900ae9d334d132f03666a46 100644 (file)
@@ -40,14 +40,6 @@ MODULE_AUTHOR("Bob Pearson, Frank Zago, John Groves, Kamal Heib");
 MODULE_DESCRIPTION("Soft RDMA transport");
 MODULE_LICENSE("Dual BSD/GPL");
 
-/* free resources for all ports on a device */
-static void rxe_cleanup_ports(struct rxe_dev *rxe)
-{
-       kfree(rxe->port.pkey_tbl);
-       rxe->port.pkey_tbl = NULL;
-
-}
-
 /* free resources for a rxe device all objects created for this device must
  * have been destroyed
  */
@@ -66,8 +58,6 @@ void rxe_dealloc(struct ib_device *ib_dev)
        rxe_pool_cleanup(&rxe->mc_grp_pool);
        rxe_pool_cleanup(&rxe->mc_elem_pool);
 
-       rxe_cleanup_ports(rxe);
-
        if (rxe->tfm)
                crypto_free_shash(rxe->tfm);
 }
@@ -139,25 +129,14 @@ static void rxe_init_port_param(struct rxe_port *port)
 /* initialize port state, note IB convention that HCA ports are always
  * numbered from 1
  */
-static int rxe_init_ports(struct rxe_dev *rxe)
+static void rxe_init_ports(struct rxe_dev *rxe)
 {
        struct rxe_port *port = &rxe->port;
 
        rxe_init_port_param(port);
-
-       port->pkey_tbl = kcalloc(port->attr.pkey_tbl_len,
-                       sizeof(*port->pkey_tbl), GFP_KERNEL);
-
-       if (!port->pkey_tbl)
-               return -ENOMEM;
-
-       port->pkey_tbl[0] = 0xffff;
        addrconf_addr_eui48((unsigned char *)&port->port_guid,
                            rxe->ndev->dev_addr);
-
        spin_lock_init(&port->port_lock);
-
-       return 0;
 }
 
 /* init pools of managed objects */
@@ -247,13 +226,11 @@ static int rxe_init(struct rxe_dev *rxe)
        /* init default device parameters */
        rxe_init_device_param(rxe);
 
-       err = rxe_init_ports(rxe);
-       if (err)
-               goto err1;
+       rxe_init_ports(rxe);
 
        err = rxe_init_pools(rxe);
        if (err)
-               goto err2;
+               return err;
 
        /* init pending mmap list */
        spin_lock_init(&rxe->mmap_offset_lock);
@@ -263,11 +240,6 @@ static int rxe_init(struct rxe_dev *rxe)
        mutex_init(&rxe->usdev_lock);
 
        return 0;
-
-err2:
-       rxe_cleanup_ports(rxe);
-err1:
-       return err;
 }
 
 void rxe_set_mtu(struct rxe_dev *rxe, unsigned int ndev_mtu)
index 99e9d8ba97678635ea1224ac2760a619c54191f5..2f381aeafcb57babbc83586177b98f3d998a488a 100644 (file)
@@ -100,7 +100,7 @@ enum rxe_device_param {
        RXE_MAX_SRQ_SGE                 = 27,
        RXE_MIN_SRQ_SGE                 = 1,
        RXE_MAX_FMR_PAGE_LIST_LEN       = 512,
-       RXE_MAX_PKEYS                   = 64,
+       RXE_MAX_PKEYS                   = 1,
        RXE_LOCAL_CA_ACK_DELAY          = 15,
 
        RXE_MAX_UCONTEXT                = 512,
@@ -148,7 +148,7 @@ enum rxe_port_param {
        RXE_PORT_INIT_TYPE_REPLY        = 0,
        RXE_PORT_ACTIVE_WIDTH           = IB_WIDTH_1X,
        RXE_PORT_ACTIVE_SPEED           = 1,
-       RXE_PORT_PKEY_TBL_LEN           = 64,
+       RXE_PORT_PKEY_TBL_LEN           = 1,
        RXE_PORT_PHYS_STATE             = IB_PORT_PHYS_STATE_POLLING,
        RXE_PORT_SUBNET_PREFIX          = 0xfe80000000000000ULL,
 };
index 46e111c218fd4fbb9577c492635246b2d4e7d12c..7e123d3c4d09b062ca4fa41855df6c8d3df29e35 100644 (file)
@@ -101,36 +101,15 @@ static void set_qkey_viol_cntr(struct rxe_port *port)
 static int check_keys(struct rxe_dev *rxe, struct rxe_pkt_info *pkt,
                      u32 qpn, struct rxe_qp *qp)
 {
-       int i;
-       int found_pkey = 0;
        struct rxe_port *port = &rxe->port;
        u16 pkey = bth_pkey(pkt);
 
        pkt->pkey_index = 0;
 
-       if (qpn == 1) {
-               for (i = 0; i < port->attr.pkey_tbl_len; i++) {
-                       if (pkey_match(pkey, port->pkey_tbl[i])) {
-                               pkt->pkey_index = i;
-                               found_pkey = 1;
-                               break;
-                       }
-               }
-
-               if (!found_pkey) {
-                       pr_warn_ratelimited("bad pkey = 0x%x\n", pkey);
-                       set_bad_pkey_cntr(port);
-                       goto err1;
-               }
-       } else {
-               if (unlikely(!pkey_match(pkey,
-                                        port->pkey_tbl[qp->attr.pkey_index]
-                                       ))) {
-                       pr_warn_ratelimited("bad pkey = 0x%0x\n", pkey);
-                       set_bad_pkey_cntr(port);
-                       goto err1;
-               }
-               pkt->pkey_index = qp->attr.pkey_index;
+       if (!pkey_match(pkey, IB_DEFAULT_PKEY_FULL)) {
+               pr_warn_ratelimited("bad pkey = 0x%x\n", pkey);
+               set_bad_pkey_cntr(port);
+               goto err1;
        }
 
        if ((qp_type(qp) == IB_QPT_UD || qp_type(qp) == IB_QPT_GSI) &&
index e5031172c0193ad3e2906210fe2e20f2da398a32..34df2b55e650d5ad1af819ffd87a8d52157b816e 100644 (file)
@@ -381,7 +381,6 @@ static struct sk_buff *init_req_packet(struct rxe_qp *qp,
                                       struct rxe_pkt_info *pkt)
 {
        struct rxe_dev          *rxe = to_rdev(qp->ibqp.device);
-       struct rxe_port         *port = &rxe->port;
        struct sk_buff          *skb;
        struct rxe_send_wr      *ibwr = &wqe->wr;
        struct rxe_av           *av;
@@ -419,9 +418,7 @@ static struct sk_buff *init_req_packet(struct rxe_qp *qp,
                        (pkt->mask & (RXE_WRITE_MASK | RXE_IMMDT_MASK)) ==
                        (RXE_WRITE_MASK | RXE_IMMDT_MASK));
 
-       pkey = (qp_type(qp) == IB_QPT_GSI) ?
-                port->pkey_tbl[ibwr->wr.ud.pkey_index] :
-                port->pkey_tbl[qp->attr.pkey_index];
+       pkey = IB_DEFAULT_PKEY_FULL;
 
        qp_num = (pkt->mask & RXE_DETH_MASK) ? ibwr->wr.ud.remote_qpn :
                                         qp->attr.dest_qp_num;
index c1649aec8c23d0a9dc4a36e9bdd9eadb9e4b8d2c..bb61e534e468221ae7413c7833a0492d31bdfcaf 100644 (file)
@@ -83,22 +83,11 @@ static int rxe_query_port(struct ib_device *dev,
 static int rxe_query_pkey(struct ib_device *device,
                          u8 port_num, u16 index, u16 *pkey)
 {
-       struct rxe_dev *rxe = to_rdev(device);
-       struct rxe_port *port;
-
-       port = &rxe->port;
-
-       if (unlikely(index >= port->attr.pkey_tbl_len)) {
-               dev_warn(device->dev.parent, "invalid index = %d\n",
-                        index);
-               goto err1;
-       }
+       if (index > 0)
+               return -EINVAL;
 
-       *pkey = port->pkey_tbl[index];
+       *pkey = IB_DEFAULT_PKEY_FULL;
        return 0;
-
-err1:
-       return -EINVAL;
 }
 
 static int rxe_modify_device(struct ib_device *dev,
index 92de39c4a7c1ed3d25488e306816b97b92101790..c664c7f36ab5bd4ae897a909370e60bc596dbfe7 100644 (file)
@@ -371,7 +371,6 @@ struct rxe_mc_elem {
 
 struct rxe_port {
        struct ib_port_attr     attr;
-       u16                     *pkey_tbl;
        __be64                  port_guid;
        __be64                  subnet_prefix;
        spinlock_t              port_lock; /* guard port */