summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--net/devlink/devl_internal.h11
-rw-r--r--net/devlink/netlink.c5
2 files changed, 4 insertions, 12 deletions
diff --git a/net/devlink/devl_internal.h b/net/devlink/devl_internal.h
index 10975e4ea2f4..75752f8c4a26 100644
--- a/net/devlink/devl_internal.h
+++ b/net/devlink/devl_internal.h
@@ -123,17 +123,6 @@ struct devlink_gen_cmd {
struct netlink_callback *cb);
};
-/* Iterate over registered devlink instances for devlink dump.
- * devlink_put() needs to be called for each iterated devlink pointer
- * in loop body in order to release the reference.
- * Note: this is NOT a generic iterator, it makes assumptions about the use
- * of @state and can only be used once per dumpit implementation.
- */
-#define devlink_dump_for_each_instance_get(msg, state, devlink) \
- for (; (devlink = devlinks_xa_find_get(sock_net(msg->sk), \
- &state->instance)); \
- state->instance++, state->idx = 0)
-
extern const struct genl_small_ops devlink_nl_ops[56];
struct devlink *
diff --git a/net/devlink/netlink.c b/net/devlink/netlink.c
index d4539c1aedea..3f44633af01c 100644
--- a/net/devlink/netlink.c
+++ b/net/devlink/netlink.c
@@ -207,7 +207,8 @@ int devlink_nl_instance_iter_dump(struct sk_buff *msg,
cmd = devl_gen_cmds[info->op.cmd];
- devlink_dump_for_each_instance_get(msg, state, devlink) {
+ while ((devlink = devlinks_xa_find_get(sock_net(msg->sk),
+ &state->instance))) {
devl_lock(devlink);
if (devl_is_registered(devlink))
@@ -221,6 +222,8 @@ int devlink_nl_instance_iter_dump(struct sk_buff *msg,
if (err)
break;
+ state->instance++;
+
/* restart sub-object walk for the next instance */
state->idx = 0;
}