devlink: restart dump based on devlink instance ids (nested)
authorJakub Kicinski <kuba@kernel.org>
Thu, 5 Jan 2023 04:05:27 +0000 (20:05 -0800)
committerJakub Kicinski <kuba@kernel.org>
Fri, 6 Jan 2023 06:13:39 +0000 (22:13 -0800)
Use xarray id for cases of simple sub-object iteration.
We'll now use the state->instance for the devlink instances
and state->idx for subobject index.

Moving the definition of idx into the inner loop makes sense,
so while at it also move other sub-object local variables into
the loop.

Reviewed-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

index b9bb6f7..1e32bde 100644 (file)
@@ -131,7 +131,7 @@ struct devlink_nl_dump_state {
 #define devlink_dump_for_each_instance_get(msg, state, devlink)                \
        for (; (devlink = devlinks_xa_find_get(sock_net(msg->sk),       \
                                               &state->instance, xa_find)); \
-            state->instance++)
+            state->instance++, state->idx = 0)
 
 extern const struct genl_small_ops devlink_nl_ops[56];
 
index db7c095..358cdfb 100644 (file)
@@ -1223,13 +1223,13 @@ static int devlink_nl_cmd_rate_get_dumpit(struct sk_buff *msg,
                                          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;
@@ -1245,6 +1245,7 @@ static int devlink_nl_cmd_rate_get_dumpit(struct sk_buff *msg,
                        if (err) {
                                devl_unlock(devlink);
                                devlink_put(devlink);
+                               state->idx = idx;
                                goto out;
                        }
                        idx++;
@@ -1256,7 +1257,6 @@ out:
        if (err != -EMSGSIZE)
                return err;
 
-       state->idx = idx;
        return msg->len;
 }
 
@@ -1363,12 +1363,13 @@ static int devlink_nl_cmd_port_get_dumpit(struct sk_buff *msg,
 {
        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) {
@@ -1383,6 +1384,7 @@ static int devlink_nl_cmd_port_get_dumpit(struct sk_buff *msg,
                        if (err) {
                                devl_unlock(devlink);
                                devlink_put(devlink);
+                               state->idx = idx;
                                goto out;
                        }
                        idx++;
@@ -1391,7 +1393,6 @@ static int devlink_nl_cmd_port_get_dumpit(struct sk_buff *msg,
                devlink_put(devlink);
        }
 out:
-       state->idx = idx;
        return msg->len;
 }
 
@@ -2143,11 +2144,11 @@ static int devlink_nl_cmd_linecard_get_dumpit(struct sk_buff *msg,
        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) {
@@ -2165,6 +2166,7 @@ static int devlink_nl_cmd_linecard_get_dumpit(struct sk_buff *msg,
                        if (err) {
                                mutex_unlock(&devlink->linecards_lock);
                                devlink_put(devlink);
+                               state->idx = idx;
                                goto out;
                        }
                        idx++;
@@ -2173,7 +2175,6 @@ static int devlink_nl_cmd_linecard_get_dumpit(struct sk_buff *msg,
                devlink_put(devlink);
        }
 out:
-       state->idx = idx;
        return msg->len;
 }
 
@@ -2404,12 +2405,12 @@ static int devlink_nl_cmd_sb_get_dumpit(struct sk_buff *msg,
 {
        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) {
@@ -2424,6 +2425,7 @@ static int devlink_nl_cmd_sb_get_dumpit(struct sk_buff *msg,
                        if (err) {
                                devl_unlock(devlink);
                                devlink_put(devlink);
+                               state->idx = idx;
                                goto out;
                        }
                        idx++;
@@ -2432,7 +2434,6 @@ static int devlink_nl_cmd_sb_get_dumpit(struct sk_buff *msg,
                devlink_put(devlink);
        }
 out:
-       state->idx = idx;
        return msg->len;
 }
 
@@ -5339,13 +5340,13 @@ static int devlink_nl_cmd_param_get_dumpit(struct sk_buff *msg,
                                           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) {
@@ -5362,6 +5363,7 @@ static int devlink_nl_cmd_param_get_dumpit(struct sk_buff *msg,
                        } else if (err) {
                                devl_unlock(devlink);
                                devlink_put(devlink);
+                               state->idx = idx;
                                goto out;
                        }
                        idx++;
@@ -5373,7 +5375,6 @@ out:
        if (err != -EMSGSIZE)
                return err;
 
-       state->idx = idx;
        return msg->len;
 }
 
@@ -7893,14 +7894,15 @@ devlink_nl_cmd_health_reporter_get_dumpit(struct sk_buff *msg,
                                          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) {
@@ -7915,6 +7917,7 @@ devlink_nl_cmd_health_reporter_get_dumpit(struct sk_buff *msg,
                        if (err) {
                                mutex_unlock(&devlink->reporters_lock);
                                devlink_put(devlink);
+                               state->idx = idx;
                                goto out;
                        }
                        idx++;
@@ -7938,6 +7941,7 @@ devlink_nl_cmd_health_reporter_get_dumpit(struct sk_buff *msg,
                                        mutex_unlock(&port->reporters_lock);
                                        devl_unlock(devlink);
                                        devlink_put(devlink);
+                                       state->idx = idx;
                                        goto out;
                                }
                                idx++;
@@ -7948,7 +7952,6 @@ devlink_nl_cmd_health_reporter_get_dumpit(struct sk_buff *msg,
                devlink_put(devlink);
        }
 out:
-       state->idx = idx;
        return msg->len;
 }
 
@@ -8474,13 +8477,13 @@ static int devlink_nl_cmd_trap_get_dumpit(struct sk_buff *msg,
                                          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) {
@@ -8495,6 +8498,7 @@ static int devlink_nl_cmd_trap_get_dumpit(struct sk_buff *msg,
                        if (err) {
                                devl_unlock(devlink);
                                devlink_put(devlink);
+                               state->idx = idx;
                                goto out;
                        }
                        idx++;
@@ -8503,7 +8507,6 @@ static int devlink_nl_cmd_trap_get_dumpit(struct sk_buff *msg,
                devlink_put(devlink);
        }
 out:
-       state->idx = idx;
        return msg->len;
 }
 
@@ -8690,14 +8693,14 @@ static int devlink_nl_cmd_trap_group_get_dumpit(struct sk_buff *msg,
 {
        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) {
@@ -8713,6 +8716,7 @@ static int devlink_nl_cmd_trap_group_get_dumpit(struct sk_buff *msg,
                        if (err) {
                                devl_unlock(devlink);
                                devlink_put(devlink);
+                               state->idx = idx;
                                goto out;
                        }
                        idx++;
@@ -8721,7 +8725,6 @@ static int devlink_nl_cmd_trap_group_get_dumpit(struct sk_buff *msg,
                devlink_put(devlink);
        }
 out:
-       state->idx = idx;
        return msg->len;
 }
 
@@ -8994,14 +8997,14 @@ static int devlink_nl_cmd_trap_policer_get_dumpit(struct sk_buff *msg,
 {
        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) {
@@ -9017,6 +9020,7 @@ static int devlink_nl_cmd_trap_policer_get_dumpit(struct sk_buff *msg,
                        if (err) {
                                devl_unlock(devlink);
                                devlink_put(devlink);
+                               state->idx = idx;
                                goto out;
                        }
                        idx++;
@@ -9025,7 +9029,6 @@ static int devlink_nl_cmd_trap_policer_get_dumpit(struct sk_buff *msg,
                devlink_put(devlink);
        }
 out:
-       state->idx = idx;
        return msg->len;
 }