mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 13:14:07 +08:00
devlink: remove reporter reference counting
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>
This commit is contained in:
parent
9f167327ef
commit
e994a75fb7
@ -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;
|
||||
return err;
|
||||
|
||||
err = devlink_fmsg_snd(fmsg, info,
|
||||
DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE, 0);
|
||||
|
||||
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 {
|
||||
|
Loading…
Reference in New Issue
Block a user