devlink: convert reporters dump to devlink_nl_instance_iter_dump()
authorJiri Pirko <jiri@nvidia.com>
Wed, 18 Jan 2023 15:21:13 +0000 (16:21 +0100)
committerJakub Kicinski <kuba@kernel.org>
Fri, 20 Jan 2023 03:08:38 +0000 (19:08 -0800)
Benefit from recently introduced instance iteration and convert
reporters .dumpit generic netlink callback to use it.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/devlink/devl_internal.h
net/devlink/leftover.c
net/devlink/netlink.c

index d8f8e4bff5b48a6970e3a224f8bd95f38621398f..10975e4ea2f4e5d6b76630fe55431191e5d947c6 100644 (file)
@@ -164,6 +164,7 @@ extern const struct devlink_gen_cmd devl_gen_selftests;
 extern const struct devlink_gen_cmd devl_gen_param;
 extern const struct devlink_gen_cmd devl_gen_region;
 extern const struct devlink_gen_cmd devl_gen_info;
+extern const struct devlink_gen_cmd devl_gen_health_reporter;
 extern const struct devlink_gen_cmd devl_gen_trap;
 extern const struct devlink_gen_cmd devl_gen_trap_group;
 extern const struct devlink_gen_cmd devl_gen_trap_policer;
index 685845a2fc78cf3550a3f3bf1693a1396db05f88..8eab95cae917f5c5c7018f6602afb4863947d065 100644 (file)
@@ -7768,70 +7768,59 @@ static int devlink_nl_cmd_health_reporter_get_doit(struct sk_buff *skb,
 }
 
 static int
-devlink_nl_cmd_health_reporter_get_dumpit(struct sk_buff *msg,
-                                         struct netlink_callback *cb)
+devlink_nl_cmd_health_reporter_get_dump_one(struct sk_buff *msg,
+                                           struct devlink *devlink,
+                                           struct netlink_callback *cb)
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
-       struct devlink *devlink;
+       struct devlink_health_reporter *reporter;
+       struct devlink_port *port;
+       unsigned long port_index;
+       int idx = 0;
        int err;
 
-       devlink_dump_for_each_instance_get(msg, state, devlink) {
-               struct devlink_health_reporter *reporter;
-               struct devlink_port *port;
-               unsigned long port_index;
-               int idx = 0;
-
-               devl_lock(devlink);
-               if (!devl_is_registered(devlink))
-                       goto next_devlink;
-
-               list_for_each_entry(reporter, &devlink->reporter_list,
-                                   list) {
+       list_for_each_entry(reporter, &devlink->reporter_list, list) {
+               if (idx < state->idx) {
+                       idx++;
+                       continue;
+               }
+               err = devlink_nl_health_reporter_fill(msg, reporter,
+                                                     DEVLINK_CMD_HEALTH_REPORTER_GET,
+                                                     NETLINK_CB(cb->skb).portid,
+                                                     cb->nlh->nlmsg_seq,
+                                                     NLM_F_MULTI);
+               if (err) {
+                       state->idx = idx;
+                       return err;
+               }
+               idx++;
+       }
+       xa_for_each(&devlink->ports, port_index, port) {
+               list_for_each_entry(reporter, &port->reporter_list, list) {
                        if (idx < state->idx) {
                                idx++;
                                continue;
                        }
-                       err = devlink_nl_health_reporter_fill(
-                               msg, reporter, DEVLINK_CMD_HEALTH_REPORTER_GET,
-                               NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq,
-                               NLM_F_MULTI);
+                       err = devlink_nl_health_reporter_fill(msg, reporter,
+                                                             DEVLINK_CMD_HEALTH_REPORTER_GET,
+                                                             NETLINK_CB(cb->skb).portid,
+                                                             cb->nlh->nlmsg_seq,
+                                                             NLM_F_MULTI);
                        if (err) {
-                               devl_unlock(devlink);
-                               devlink_put(devlink);
                                state->idx = idx;
-                               goto out;
+                               return err;
                        }
                        idx++;
                }
-
-               xa_for_each(&devlink->ports, port_index, port) {
-                       list_for_each_entry(reporter, &port->reporter_list, list) {
-                               if (idx < state->idx) {
-                                       idx++;
-                                       continue;
-                               }
-                               err = devlink_nl_health_reporter_fill(
-                                       msg, reporter,
-                                       DEVLINK_CMD_HEALTH_REPORTER_GET,
-                                       NETLINK_CB(cb->skb).portid,
-                                       cb->nlh->nlmsg_seq, NLM_F_MULTI);
-                               if (err) {
-                                       devl_unlock(devlink);
-                                       devlink_put(devlink);
-                                       state->idx = idx;
-                                       goto out;
-                               }
-                               idx++;
-                       }
-               }
-next_devlink:
-               devl_unlock(devlink);
-               devlink_put(devlink);
        }
-out:
-       return msg->len;
+
+       return 0;
 }
 
+const struct devlink_gen_cmd devl_gen_health_reporter = {
+       .dump_one               = devlink_nl_cmd_health_reporter_get_dump_one,
+};
+
 static int
 devlink_nl_cmd_health_reporter_set_doit(struct sk_buff *skb,
                                        struct genl_info *info)
@@ -9193,7 +9182,7 @@ const struct genl_small_ops devlink_nl_ops[56] = {
                .cmd = DEVLINK_CMD_HEALTH_REPORTER_GET,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = devlink_nl_cmd_health_reporter_get_doit,
-               .dumpit = devlink_nl_cmd_health_reporter_get_dumpit,
+               .dumpit = devlink_nl_instance_iter_dump,
                .internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK_OR_PORT,
                /* can be retrieved by unprivileged users */
        },
index b18e216e09b05b626807ee10af09884a6217d147..d4539c1aedead778eba00637429b00a126d192c2 100644 (file)
@@ -187,6 +187,7 @@ static const struct devlink_gen_cmd *devl_gen_cmds[] = {
        [DEVLINK_CMD_PARAM_GET]         = &devl_gen_param,
        [DEVLINK_CMD_REGION_GET]        = &devl_gen_region,
        [DEVLINK_CMD_INFO_GET]          = &devl_gen_info,
+       [DEVLINK_CMD_HEALTH_REPORTER_GET] = &devl_gen_health_reporter,
        [DEVLINK_CMD_RATE_GET]          = &devl_gen_rate_get,
        [DEVLINK_CMD_TRAP_GET]          = &devl_gen_trap,
        [DEVLINK_CMD_TRAP_GROUP_GET]    = &devl_gen_trap_group,