struct netlink_callback *cb)
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
-       struct devlink_rate *devlink_rate;
        struct devlink *devlink;
-       unsigned long index;
-       int idx = 0;
        int err = 0;
 
-       devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) {
+       devlink_dump_for_each_instance_get(msg, state, devlink) {
+               struct devlink_rate *devlink_rate;
+               int idx = 0;
+
                devl_lock(devlink);
                list_for_each_entry(devlink_rate, &devlink->rate_list, list) {
                        enum devlink_command cmd = DEVLINK_CMD_RATE_NEW;
                        if (err) {
                                devl_unlock(devlink);
                                devlink_put(devlink);
+                               state->idx = idx;
                                goto out;
                        }
                        idx++;
        if (err != -EMSGSIZE)
                return err;
 
-       state->idx = idx;
        return msg->len;
 }
 
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
        struct devlink *devlink;
-       struct devlink_port *devlink_port;
-       unsigned long index, port_index;
-       int idx = 0;
        int err;
 
-       devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) {
+       devlink_dump_for_each_instance_get(msg, state, devlink) {
+               struct devlink_port *devlink_port;
+               unsigned long port_index;
+               int idx = 0;
+
                devl_lock(devlink);
                xa_for_each(&devlink->ports, port_index, devlink_port) {
                        if (idx < state->idx) {
                        if (err) {
                                devl_unlock(devlink);
                                devlink_put(devlink);
+                               state->idx = idx;
                                goto out;
                        }
                        idx++;
                devlink_put(devlink);
        }
 out:
-       state->idx = idx;
        return msg->len;
 }
 
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
        struct devlink_linecard *linecard;
        struct devlink *devlink;
-       unsigned long index;
-       int idx = 0;
        int err;
 
-       devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) {
+       devlink_dump_for_each_instance_get(msg, state, devlink) {
+               int idx = 0;
+
                mutex_lock(&devlink->linecards_lock);
                list_for_each_entry(linecard, &devlink->linecard_list, list) {
                        if (idx < state->idx) {
                        if (err) {
                                mutex_unlock(&devlink->linecards_lock);
                                devlink_put(devlink);
+                               state->idx = idx;
                                goto out;
                        }
                        idx++;
                devlink_put(devlink);
        }
 out:
-       state->idx = idx;
        return msg->len;
 }
 
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
        struct devlink *devlink;
-       struct devlink_sb *devlink_sb;
-       unsigned long index;
-       int idx = 0;
        int err;
 
-       devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) {
+       devlink_dump_for_each_instance_get(msg, state, devlink) {
+               struct devlink_sb *devlink_sb;
+               int idx = 0;
+
                devl_lock(devlink);
                list_for_each_entry(devlink_sb, &devlink->sb_list, list) {
                        if (idx < state->idx) {
                        if (err) {
                                devl_unlock(devlink);
                                devlink_put(devlink);
+                               state->idx = idx;
                                goto out;
                        }
                        idx++;
                devlink_put(devlink);
        }
 out:
-       state->idx = idx;
        return msg->len;
 }
 
                                           struct netlink_callback *cb)
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
-       struct devlink_param_item *param_item;
        struct devlink *devlink;
-       unsigned long index;
-       int idx = 0;
        int err = 0;
 
-       devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) {
+       devlink_dump_for_each_instance_get(msg, state, devlink) {
+               struct devlink_param_item *param_item;
+               int idx = 0;
+
                devl_lock(devlink);
                list_for_each_entry(param_item, &devlink->param_list, list) {
                        if (idx < state->idx) {
                        } else if (err) {
                                devl_unlock(devlink);
                                devlink_put(devlink);
+                               state->idx = idx;
                                goto out;
                        }
                        idx++;
        if (err != -EMSGSIZE)
                return err;
 
-       state->idx = idx;
        return msg->len;
 }
 
                                          struct netlink_callback *cb)
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
-       struct devlink_health_reporter *reporter;
-       unsigned long index, port_index;
-       struct devlink_port *port;
        struct devlink *devlink;
-       int idx = 0;
        int err;
 
-       devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) {
+       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;
+
                mutex_lock(&devlink->reporters_lock);
                list_for_each_entry(reporter, &devlink->reporter_list,
                                    list) {
                        if (err) {
                                mutex_unlock(&devlink->reporters_lock);
                                devlink_put(devlink);
+                               state->idx = idx;
                                goto out;
                        }
                        idx++;
                                        mutex_unlock(&port->reporters_lock);
                                        devl_unlock(devlink);
                                        devlink_put(devlink);
+                                       state->idx = idx;
                                        goto out;
                                }
                                idx++;
                devlink_put(devlink);
        }
 out:
-       state->idx = idx;
        return msg->len;
 }
 
                                          struct netlink_callback *cb)
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
-       struct devlink_trap_item *trap_item;
        struct devlink *devlink;
-       unsigned long index;
-       int idx = 0;
        int err;
 
-       devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) {
+       devlink_dump_for_each_instance_get(msg, state, devlink) {
+               struct devlink_trap_item *trap_item;
+               int idx = 0;
+
                devl_lock(devlink);
                list_for_each_entry(trap_item, &devlink->trap_list, list) {
                        if (idx < state->idx) {
                        if (err) {
                                devl_unlock(devlink);
                                devlink_put(devlink);
+                               state->idx = idx;
                                goto out;
                        }
                        idx++;
                devlink_put(devlink);
        }
 out:
-       state->idx = idx;
        return msg->len;
 }
 
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
        enum devlink_command cmd = DEVLINK_CMD_TRAP_GROUP_NEW;
-       struct devlink_trap_group_item *group_item;
        u32 portid = NETLINK_CB(cb->skb).portid;
        struct devlink *devlink;
-       unsigned long index;
-       int idx = 0;
        int err;
 
-       devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) {
+       devlink_dump_for_each_instance_get(msg, state, devlink) {
+               struct devlink_trap_group_item *group_item;
+               int idx = 0;
+
                devl_lock(devlink);
                list_for_each_entry(group_item, &devlink->trap_group_list,
                                    list) {
                        if (err) {
                                devl_unlock(devlink);
                                devlink_put(devlink);
+                               state->idx = idx;
                                goto out;
                        }
                        idx++;
                devlink_put(devlink);
        }
 out:
-       state->idx = idx;
        return msg->len;
 }
 
 {
        struct devlink_nl_dump_state *state = devlink_dump_state(cb);
        enum devlink_command cmd = DEVLINK_CMD_TRAP_POLICER_NEW;
-       struct devlink_trap_policer_item *policer_item;
        u32 portid = NETLINK_CB(cb->skb).portid;
        struct devlink *devlink;
-       unsigned long index;
-       int idx = 0;
        int err;
 
-       devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) {
+       devlink_dump_for_each_instance_get(msg, state, devlink) {
+               struct devlink_trap_policer_item *policer_item;
+               int idx = 0;
+
                devl_lock(devlink);
                list_for_each_entry(policer_item, &devlink->trap_policer_list,
                                    list) {
                        if (err) {
                                devl_unlock(devlink);
                                devlink_put(devlink);
+                               state->idx = idx;
                                goto out;
                        }
                        idx++;
                devlink_put(devlink);
        }
 out:
-       state->idx = idx;
        return msg->len;
 }