RDMA/erdma: Support dynamic mtu
authorCheng Xu <chengyou@linux.alibaba.com>
Fri, 9 Sep 2022 09:38:22 +0000 (17:38 +0800)
committerLeon Romanovsky <leon@kernel.org>
Wed, 21 Sep 2022 07:31:24 +0000 (10:31 +0300)
Hardware now support jumbo frame for RDMA. So we introduce a new CMDQ
message to support mtu change notification.

Signed-off-by: Cheng Xu <chengyou@linux.alibaba.com>
Link: https://lore.kernel.org/r/20220909093822.33868-5-chengyou@linux.alibaba.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/erdma/erdma.h
drivers/infiniband/hw/erdma/erdma_hw.h
drivers/infiniband/hw/erdma/erdma_main.c
drivers/infiniband/hw/erdma/erdma_verbs.c
drivers/infiniband/hw/erdma/erdma_verbs.h

index cc5e4eb..730783f 100644 (file)
@@ -197,6 +197,7 @@ struct erdma_dev {
        struct erdma_devattr attrs;
        /* physical port state (only one port per device) */
        enum ib_port_state state;
+       u32 mtu;
 
        /* cmdq and aeq use the same msix vector */
        struct erdma_irq comm_irq;
index 3004cf3..e788887 100644 (file)
@@ -153,6 +153,7 @@ enum CMDQ_COMMON_OPCODE {
        CMDQ_OPCODE_CREATE_EQ = 0,
        CMDQ_OPCODE_DESTROY_EQ = 1,
        CMDQ_OPCODE_QUERY_FW_INFO = 2,
+       CMDQ_OPCODE_CONF_MTU = 3,
 };
 
 /* cmdq-SQE HDR */
@@ -190,6 +191,11 @@ struct erdma_cmdq_destroy_eq_req {
        u8 qtype;
 };
 
+struct erdma_cmdq_config_mtu_req {
+       u64 hdr;
+       u32 mtu;
+};
+
 /* create_cq cfg0 */
 #define ERDMA_CMD_CREATE_CQ_DEPTH_MASK GENMASK(31, 24)
 #define ERDMA_CMD_CREATE_CQ_PAGESIZE_MASK GENMASK(23, 20)
index 6d3e02b..49778bb 100644 (file)
@@ -34,10 +34,15 @@ static int erdma_netdev_event(struct notifier_block *nb, unsigned long event,
                dev->state = IB_PORT_DOWN;
                erdma_port_event(dev, IB_EVENT_PORT_ERR);
                break;
+       case NETDEV_CHANGEMTU:
+               if (dev->mtu != netdev->mtu) {
+                       erdma_set_mtu(dev, netdev->mtu);
+                       dev->mtu = netdev->mtu;
+               }
+               break;
        case NETDEV_REGISTER:
        case NETDEV_UNREGISTER:
        case NETDEV_CHANGEADDR:
-       case NETDEV_CHANGEMTU:
        case NETDEV_GOING_DOWN:
        case NETDEV_CHANGE:
        default:
@@ -95,6 +100,7 @@ static int erdma_device_register(struct erdma_dev *dev)
        if (ret)
                return ret;
 
+       dev->mtu = dev->netdev->mtu;
        addrconf_addr_eui48((u8 *)&ibdev->node_guid, dev->netdev->dev_addr);
 
        ret = ib_register_device(ibdev, "erdma_%d", &dev->pdev->dev);
index c99e296..3d79666 100644 (file)
@@ -1436,6 +1436,17 @@ err_out_xa:
        return ret;
 }
 
+void erdma_set_mtu(struct erdma_dev *dev, u32 mtu)
+{
+       struct erdma_cmdq_config_mtu_req req;
+
+       erdma_cmdq_build_reqhdr(&req.hdr, CMDQ_SUBMOD_COMMON,
+                               CMDQ_OPCODE_CONF_MTU);
+       req.mtu = mtu;
+
+       erdma_post_cmd_wait(&dev->cmdq, &req, sizeof(req), NULL, NULL);
+}
+
 void erdma_port_event(struct erdma_dev *dev, enum ib_event_type reason)
 {
        struct ib_event event;
index fe93e1a..ab63806 100644 (file)
@@ -330,5 +330,6 @@ struct ib_mr *erdma_ib_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,
 int erdma_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents,
                    unsigned int *sg_offset);
 void erdma_port_event(struct erdma_dev *dev, enum ib_event_type reason);
+void erdma_set_mtu(struct erdma_dev *dev, u32 mtu);
 
 #endif