]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
rdma: Control CQ adaptive moderation (DIM)
authorYamin Friedman <yaminf@mellanox.com>
Mon, 29 Jul 2019 07:42:25 +0000 (10:42 +0300)
committerStephen Hemminger <stephen@networkplumber.org>
Fri, 2 Aug 2019 16:30:56 +0000 (09:30 -0700)
In order to set adaptive-moderation for an ib device the command is:
rdma dev set [DEV] adaptive-moderation [on|off]

rdma dev show -d
0: mlx5_0: node_type ca fw 16.25.0319 node_guid 248a:0703:00a5:29d0
sys_image_guid 248a:0703:00a5:29d0 adaptive-moderation on
caps: <BAD_PKEY_CNTR, BAD_QKEY_CNTR, AUTO_PATH_MIG, CHANGE_PHY_PORT,
PORT_ACTIVE_EVENT, SYS_IMAGE_GUID, RC_RNR_NAK_GEN, MEM_WINDOW, XRC,
MEM_MGT_EXTENSIONS, BLOCK_MULTICAST_LOOPBACK, MEM_WINDOW_TYPE_2B,
RAW_IP_CSUM, CROSS_CHANNEL, MANAGED_FLOW_STEERING, SIGNATURE_HANDOVER,
ON_DEMAND_PAGING, SG_GAPS_REG, RAW_SCATTER_FCS, PCI_WRITE_END_PADDING>

rdma resource show cq
dev mlx5_0 cqn 0 cqe 1023 users 4 poll-ctx UNBOUND_WORKQUEUE
adaptive-moderation off comm [ib_core]

Signed-off-by: Yamin Friedman <yaminf@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
rdma/dev.c
rdma/rdma.h
rdma/res-cq.c
rdma/utils.c

index d28bf6b3b83b0aa40402b4b6f4818bbc7378d81d..c597cba53e02f9e572013d61fe37c759b083af3d 100644 (file)
@@ -12,6 +12,7 @@ static int dev_help(struct rd *rd)
        pr_out("Usage: %s dev show [DEV]\n", rd->filename);
        pr_out("       %s dev set [DEV] name DEVNAME\n", rd->filename);
        pr_out("       %s dev set [DEV] netns NSNAME\n", rd->filename);
+       pr_out("       %s dev set [DEV] adaptive-moderation [on|off]\n", rd->filename);
        return 0;
 }
 
@@ -167,6 +168,21 @@ static void dev_print_sys_image_guid(struct rd *rd, struct nlattr **tb)
                pr_out("sys_image_guid %s ", str);
 }
 
+static void dev_print_dim_setting(struct rd *rd, struct nlattr **tb)
+{
+       uint8_t dim_setting;
+
+       if (!tb[RDMA_NLDEV_ATTR_DEV_DIM])
+               return;
+
+       dim_setting = mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_DEV_DIM]);
+       if (dim_setting > 1)
+               return;
+
+       print_on_off(rd, "adaptive-moderation", dim_setting);
+
+}
+
 static const char *node_type_to_str(uint8_t node_type)
 {
        static const char * const node_type_str[] = { "unknown", "ca",
@@ -219,8 +235,10 @@ static int dev_parse_cb(const struct nlmsghdr *nlh, void *data)
        dev_print_fw(rd, tb);
        dev_print_node_guid(rd, tb);
        dev_print_sys_image_guid(rd, tb);
-       if (rd->show_details)
+       if (rd->show_details) {
+               dev_print_dim_setting(rd, tb);
                dev_print_caps(rd, tb);
+       }
 
        if (!rd->json_output)
                pr_out("\n");
@@ -308,12 +326,47 @@ done:
        return ret;
 }
 
+static int dev_set_dim_sendmsg(struct rd *rd, uint8_t dim_setting)
+{
+       uint32_t seq;
+
+       rd_prepare_msg(rd, RDMA_NLDEV_CMD_SET, &seq,
+                      (NLM_F_REQUEST | NLM_F_ACK));
+       mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx);
+       mnl_attr_put_u8(rd->nlh, RDMA_NLDEV_ATTR_DEV_DIM, dim_setting);
+
+       return rd_sendrecv_msg(rd, seq);
+}
+
+static int dev_set_dim_off(struct rd *rd)
+{
+       return dev_set_dim_sendmsg(rd, 0);
+}
+
+static int dev_set_dim_on(struct rd *rd)
+{
+       return dev_set_dim_sendmsg(rd, 1);
+}
+
+static int dev_set_dim(struct rd *rd)
+{
+       const struct rd_cmd cmds[] = {
+               { NULL,         dev_help},
+               { "on",         dev_set_dim_on},
+               { "off",        dev_set_dim_off},
+               { 0 }
+       };
+
+       return rd_exec_cmd(rd, cmds, "parameter");
+}
+
 static int dev_one_set(struct rd *rd)
 {
        const struct rd_cmd cmds[] = {
                { NULL,         dev_help},
                { "name",       dev_set_name},
                { "netns",      dev_set_netns},
+               { "adaptive-moderation",        dev_set_dim},
                { 0 }
        };
 
index 23157743b27c88426065fcfd3424fc91f5cf04ee..dfd1b70b2e149dd8ea9af029836bddfa39c604b4 100644 (file)
@@ -136,6 +136,7 @@ int rd_attr_check(const struct nlattr *attr, int *typep);
 void print_driver_table(struct rd *rd, struct nlattr *tb);
 void newline(struct rd *rd);
 void newline_indent(struct rd *rd);
+void print_on_off(struct rd *rd, const char *key_str, bool on);
 #define MAX_LINE_LENGTH 80
 
 #endif /* _RDMA_TOOL_H_ */
index 5afb97c5bbf458d35893f48de4d60ea0e56446bc..d2591fbebfb5289d41c55196475ad8c4bc9d297e 100644 (file)
@@ -30,6 +30,20 @@ static void print_poll_ctx(struct rd *rd, uint8_t poll_ctx, struct nlattr *attr)
        pr_out("poll-ctx %s ", poll_ctx_to_str(poll_ctx));
 }
 
+static void print_cq_dim_setting(struct rd *rd, struct nlattr *attr)
+{
+       uint8_t dim_setting;
+
+       if (!attr)
+               return;
+
+       dim_setting = mnl_attr_get_u8(attr);
+       if (dim_setting > 1)
+               return;
+
+       print_on_off(rd, "adaptive-moderation", dim_setting);
+}
+
 static int res_cq_line(struct rd *rd, const char *name, int idx,
                       struct nlattr **nla_line)
 {
@@ -97,6 +111,7 @@ static int res_cq_line(struct rd *rd, const char *name, int idx,
        res_print_uint(rd, "users", users,
                       nla_line[RDMA_NLDEV_ATTR_RES_USECNT]);
        print_poll_ctx(rd, poll_ctx, nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]);
+       print_cq_dim_setting(rd, nla_line[RDMA_NLDEV_ATTR_DEV_DIM]);
        res_print_uint(rd, "ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
        res_print_uint(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
        print_comm(rd, comm, nla_line);
index 95b669f39e307d0c0fb8e731ddb0e5eb92262cce..37659011d167c77ea540c52c5243ac90f8767652 100644 (file)
@@ -449,6 +449,7 @@ static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
        [RDMA_NLDEV_ATTR_STAT_MODE] = MNL_TYPE_U32,
        [RDMA_NLDEV_ATTR_STAT_RES] = MNL_TYPE_U32,
        [RDMA_NLDEV_ATTR_STAT_AUTO_MODE_MASK] = MNL_TYPE_U32,
+       [RDMA_NLDEV_ATTR_DEV_DIM] = MNL_TYPE_U8,
 };
 
 int rd_attr_check(const struct nlattr *attr, int *typep)
@@ -789,6 +790,11 @@ static int print_driver_string(struct rd *rd, const char *key_str,
        }
 }
 
+void print_on_off(struct rd *rd, const char *key_str, bool on)
+{
+       print_driver_string(rd, key_str, (on) ? "on":"off");
+}
+
 static int print_driver_s32(struct rd *rd, const char *key_str, int32_t val,
                              enum rdma_nldev_print_type print_type)
 {