devlink: remove reporter reference counting
authorJiri Pirko <jiri@nvidia.com>
Wed, 18 Jan 2023 15:21:11 +0000 (16:21 +0100)
committerJakub Kicinski <kuba@kernel.org>
Fri, 20 Jan 2023 03:08:38 +0000 (19:08 -0800)
As long as the reporter life time is protected by devlink instance
lock, the reference counting is no longer needed. Remove it.

Signed-off-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 d4e8c285b255e6f696bb3b7e801e2dbe56690b19..114baecebaeb182477cd867163ca7c13992a1719 100644 (file)
@@ -7269,7 +7269,6 @@ struct devlink_health_reporter {
        u64 error_count;
        u64 recovery_count;
        u64 last_recovery_ts;
-       refcount_t refcount;
 };
 
 void *
@@ -7328,7 +7327,6 @@ __devlink_health_reporter_create(struct devlink *devlink,
        reporter->auto_recover = !!ops->recover;
        reporter->auto_dump = !!ops->dump;
        mutex_init(&reporter->dump_lock);
-       refcount_set(&reporter->refcount, 1);
        return reporter;
 }
 
@@ -7435,13 +7433,6 @@ devlink_health_reporter_free(struct devlink_health_reporter *reporter)
        kfree(reporter);
 }
 
-static void
-devlink_health_reporter_put(struct devlink_health_reporter *reporter)
-{
-       if (refcount_dec_and_test(&reporter->refcount))
-               devlink_health_reporter_free(reporter);
-}
-
 /**
  *     devl_health_reporter_destroy - destroy devlink health reporter
  *
@@ -7453,7 +7444,7 @@ devl_health_reporter_destroy(struct devlink_health_reporter *reporter)
        devl_assert_locked(reporter->devlink);
 
        list_del(&reporter->list);
-       devlink_health_reporter_put(reporter);
+       devlink_health_reporter_free(reporter);
 }
 EXPORT_SYMBOL_GPL(devl_health_reporter_destroy);
 
@@ -7697,7 +7688,6 @@ static struct devlink_health_reporter *
 devlink_health_reporter_get_from_attrs(struct devlink *devlink,
                                       struct nlattr **attrs)
 {
-       struct devlink_health_reporter *reporter;
        struct devlink_port *devlink_port;
        char *reporter_name;
 
@@ -7706,17 +7696,12 @@ devlink_health_reporter_get_from_attrs(struct devlink *devlink,
 
        reporter_name = nla_data(attrs[DEVLINK_ATTR_HEALTH_REPORTER_NAME]);
        devlink_port = devlink_port_get_from_attrs(devlink, attrs);
-       if (IS_ERR(devlink_port)) {
-               reporter = devlink_health_reporter_find_by_name(devlink, reporter_name);
-               if (reporter)
-                       refcount_inc(&reporter->refcount);
-       } else {
-               reporter = devlink_port_health_reporter_find_by_name(devlink_port, reporter_name);
-               if (reporter)
-                       refcount_inc(&reporter->refcount);
-       }
-
-       return reporter;
+       if (IS_ERR(devlink_port))
+               return devlink_health_reporter_find_by_name(devlink,
+                                                           reporter_name);
+       else
+               return devlink_port_health_reporter_find_by_name(devlink_port,
+                                                                reporter_name);
 }
 
 static struct devlink_health_reporter *
@@ -7775,10 +7760,8 @@ static int devlink_nl_cmd_health_reporter_get_doit(struct sk_buff *skb,
                return -EINVAL;
 
        msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
-       if (!msg) {
-               err = -ENOMEM;
-               goto out;
-       }
+       if (!msg)
+               return -ENOMEM;
 
        err = devlink_nl_health_reporter_fill(msg, reporter,
                                              DEVLINK_CMD_HEALTH_REPORTER_GET,
@@ -7786,13 +7769,10 @@ static int devlink_nl_cmd_health_reporter_get_doit(struct sk_buff *skb,
                                              0);
        if (err) {
                nlmsg_free(msg);
-               goto out;
+               return err;
        }
 
-       err = genlmsg_reply(msg, info);
-out:
-       devlink_health_reporter_put(reporter);
-       return err;
+       return genlmsg_reply(msg, info);
 }
 
 static int
@@ -7866,7 +7846,6 @@ devlink_nl_cmd_health_reporter_set_doit(struct sk_buff *skb,
 {
        struct devlink *devlink = info->user_ptr[0];
        struct devlink_health_reporter *reporter;
-       int err;
 
        reporter = devlink_health_reporter_get_from_info(devlink, info);
        if (!reporter)
@@ -7874,15 +7853,12 @@ devlink_nl_cmd_health_reporter_set_doit(struct sk_buff *skb,
 
        if (!reporter->ops->recover &&
            (info->attrs[DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD] ||
-            info->attrs[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER])) {
-               err = -EOPNOTSUPP;
-               goto out;
-       }
+            info->attrs[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER]))
+               return -EOPNOTSUPP;
+
        if (!reporter->ops->dump &&
-           info->attrs[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP]) {
-               err = -EOPNOTSUPP;
-               goto out;
-       }
+           info->attrs[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP])
+               return -EOPNOTSUPP;
 
        if (info->attrs[DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD])
                reporter->graceful_period =
@@ -7896,11 +7872,7 @@ devlink_nl_cmd_health_reporter_set_doit(struct sk_buff *skb,
                reporter->auto_dump =
                nla_get_u8(info->attrs[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP]);
 
-       devlink_health_reporter_put(reporter);
        return 0;
-out:
-       devlink_health_reporter_put(reporter);
-       return err;
 }
 
 static int devlink_nl_cmd_health_reporter_recover_doit(struct sk_buff *skb,
@@ -7908,16 +7880,12 @@ static int devlink_nl_cmd_health_reporter_recover_doit(struct sk_buff *skb,
 {
        struct devlink *devlink = info->user_ptr[0];
        struct devlink_health_reporter *reporter;
-       int err;
 
        reporter = devlink_health_reporter_get_from_info(devlink, info);
        if (!reporter)
                return -EINVAL;
 
-       err = devlink_health_reporter_recover(reporter, NULL, info->extack);
-
-       devlink_health_reporter_put(reporter);
-       return err;
+       return devlink_health_reporter_recover(reporter, NULL, info->extack);
 }
 
 static int devlink_nl_cmd_health_reporter_diagnose_doit(struct sk_buff *skb,
@@ -7932,36 +7900,27 @@ static int devlink_nl_cmd_health_reporter_diagnose_doit(struct sk_buff *skb,
        if (!reporter)
                return -EINVAL;
 
-       if (!reporter->ops->diagnose) {
-               devlink_health_reporter_put(reporter);
+       if (!reporter->ops->diagnose)
                return -EOPNOTSUPP;
-       }
 
        fmsg = devlink_fmsg_alloc();
-       if (!fmsg) {
-               devlink_health_reporter_put(reporter);
+       if (!fmsg)
                return -ENOMEM;
-       }
 
        err = devlink_fmsg_obj_nest_start(fmsg);
        if (err)
-               goto out;
+               return err;
 
        err = reporter->ops->diagnose(reporter, fmsg, info->extack);
        if (err)
-               goto out;
+               return err;
 
        err = devlink_fmsg_obj_nest_end(fmsg);
        if (err)
-               goto out;
-
-       err = devlink_fmsg_snd(fmsg, info,
-                              DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE, 0);
+               return err;
 
-out:
-       devlink_fmsg_free(fmsg);
-       devlink_health_reporter_put(reporter);
-       return err;
+       return devlink_fmsg_snd(fmsg, info,
+                               DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE, 0);
 }
 
 static int
@@ -7976,10 +7935,9 @@ devlink_nl_cmd_health_reporter_dump_get_dumpit(struct sk_buff *skb,
        if (!reporter)
                return -EINVAL;
 
-       if (!reporter->ops->dump) {
-               err = -EOPNOTSUPP;
-               goto out;
-       }
+       if (!reporter->ops->dump)
+               return -EOPNOTSUPP;
+
        mutex_lock(&reporter->dump_lock);
        if (!state->idx) {
                err = devlink_health_do_dump(reporter, NULL, cb->extack);
@@ -7997,8 +7955,6 @@ devlink_nl_cmd_health_reporter_dump_get_dumpit(struct sk_buff *skb,
                                  DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET);
 unlock:
        mutex_unlock(&reporter->dump_lock);
-out:
-       devlink_health_reporter_put(reporter);
        return err;
 }
 
@@ -8013,15 +7969,12 @@ devlink_nl_cmd_health_reporter_dump_clear_doit(struct sk_buff *skb,
        if (!reporter)
                return -EINVAL;
 
-       if (!reporter->ops->dump) {
-               devlink_health_reporter_put(reporter);
+       if (!reporter->ops->dump)
                return -EOPNOTSUPP;
-       }
 
        mutex_lock(&reporter->dump_lock);
        devlink_health_dump_clear(reporter);
        mutex_unlock(&reporter->dump_lock);
-       devlink_health_reporter_put(reporter);
        return 0;
 }
 
@@ -8030,21 +7983,15 @@ static int devlink_nl_cmd_health_reporter_test_doit(struct sk_buff *skb,
 {
        struct devlink *devlink = info->user_ptr[0];
        struct devlink_health_reporter *reporter;
-       int err;
 
        reporter = devlink_health_reporter_get_from_info(devlink, info);
        if (!reporter)
                return -EINVAL;
 
-       if (!reporter->ops->test) {
-               devlink_health_reporter_put(reporter);
+       if (!reporter->ops->test)
                return -EOPNOTSUPP;
-       }
-
-       err = reporter->ops->test(reporter, info->extack);
 
-       devlink_health_reporter_put(reporter);
-       return err;
+       return reporter->ops->test(reporter, info->extack);
 }
 
 struct devlink_stats {