diff options
author | Jakub Kicinski <kuba@kernel.org> | 2023-01-05 05:05:27 +0100 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2023-01-06 07:13:39 +0100 |
commit | a8f947073f4ae489e8b9f3c19a17341cb260f660 (patch) | |
tree | f8e5eee88e263b7faac89f97267f44c500e69bd9 /net/devlink/leftover.c | |
parent | devlink: restart dump based on devlink instance ids (simple) (diff) | |
download | linux-a8f947073f4ae489e8b9f3c19a17341cb260f660.tar.xz linux-a8f947073f4ae489e8b9f3c19a17341cb260f660.zip |
devlink: restart dump based on devlink instance ids (nested)
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>
Diffstat (limited to '')
-rw-r--r-- | net/devlink/leftover.c | 93 |
1 files changed, 48 insertions, 45 deletions
diff --git a/net/devlink/leftover.c b/net/devlink/leftover.c index db7c095a0d75..358cdfbb1393 100644 --- a/net/devlink/leftover.c +++ b/net/devlink/leftover.c @@ -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; } |