}
 
 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)
                .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 */
        },