devlink: uniformly take the devlink instance lock in the dump loop
authorJakub Kicinski <kuba@kernel.org>
Thu, 5 Jan 2023 04:05:29 +0000 (20:05 -0800)
committerJakub Kicinski <kuba@kernel.org>
Fri, 6 Jan 2023 06:13:39 +0000 (22:13 -0800)
Move the lock taking out of devlink_nl_cmd_region_get_devlink_dumpit().
This way all dumps will take the instance lock in the main iteration
loop directly, making refactoring and reading the code easier.

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/leftover.c

index 091f881..4c91143 100644 (file)
@@ -6050,9 +6050,8 @@ static int devlink_nl_cmd_region_get_devlink_dumpit(struct sk_buff *msg,
        struct devlink_region *region;
        struct devlink_port *port;
        unsigned long port_index;
-       int err = 0;
+       int err;
 
-       devl_lock(devlink);
        list_for_each_entry(region, &devlink->region_list, list) {
                if (*idx < start) {
                        (*idx)++;
@@ -6064,7 +6063,7 @@ static int devlink_nl_cmd_region_get_devlink_dumpit(struct sk_buff *msg,
                                             cb->nlh->nlmsg_seq,
                                             NLM_F_MULTI, region);
                if (err)
-                       goto out;
+                       return err;
                (*idx)++;
        }
 
@@ -6072,12 +6071,10 @@ static int devlink_nl_cmd_region_get_devlink_dumpit(struct sk_buff *msg,
                err = devlink_nl_cmd_region_get_port_dumpit(msg, cb, port, idx,
                                                            start);
                if (err)
-                       goto out;
+                       return err;
        }
 
-out:
-       devl_unlock(devlink);
-       return err;
+       return 0;
 }
 
 static int devlink_nl_cmd_region_get_dumpit(struct sk_buff *msg,
@@ -6090,8 +6087,10 @@ static int devlink_nl_cmd_region_get_dumpit(struct sk_buff *msg,
        devlink_dump_for_each_instance_get(msg, state, devlink) {
                int idx = 0;
 
+               devl_lock(devlink);
                err = devlink_nl_cmd_region_get_devlink_dumpit(msg, cb, devlink,
                                                               &idx, state->idx);
+               devl_unlock(devlink);
                devlink_put(devlink);
                if (err) {
                        state->idx = idx;