Lines Matching refs:reporter

5844 devlink_health_reporter_priv(struct devlink_health_reporter *reporter)
5846 return reporter->priv;
5855 struct devlink_health_reporter *reporter;
5858 list_for_each_entry(reporter, reporter_list, list)
5859 if (!strcmp(reporter->ops->name, reporter_name))
5860 return reporter;
5887 struct devlink_health_reporter *reporter;
5892 reporter = kzalloc(sizeof(*reporter), GFP_KERNEL);
5893 if (!reporter)
5896 reporter->priv = priv;
5897 reporter->ops = ops;
5898 reporter->devlink = devlink;
5899 reporter->graceful_period = graceful_period;
5900 reporter->auto_recover = !!ops->recover;
5901 reporter->auto_dump = !!ops->dump;
5902 mutex_init(&reporter->dump_lock);
5903 refcount_set(&reporter->refcount, 1);
5904 return reporter;
5908 * devlink_port_health_reporter_create - create devlink health reporter for
5911 * @port: devlink_port which should contain the new reporter
5921 struct devlink_health_reporter *reporter;
5926 reporter = ERR_PTR(-EEXIST);
5930 reporter = __devlink_health_reporter_create(port->devlink, ops,
5932 if (IS_ERR(reporter))
5935 reporter->devlink_port = port;
5936 list_add_tail(&reporter->list, &port->reporter_list);
5939 return reporter;
5944 * devlink_health_reporter_create - create devlink health reporter
5956 struct devlink_health_reporter *reporter;
5960 reporter = ERR_PTR(-EEXIST);
5964 reporter = __devlink_health_reporter_create(devlink, ops,
5966 if (IS_ERR(reporter))
5969 list_add_tail(&reporter->list, &devlink->reporter_list);
5972 return reporter;
5977 devlink_health_reporter_free(struct devlink_health_reporter *reporter)
5979 mutex_destroy(&reporter->dump_lock);
5980 if (reporter->dump_fmsg)
5981 devlink_fmsg_free(reporter->dump_fmsg);
5982 kfree(reporter);
5986 devlink_health_reporter_put(struct devlink_health_reporter *reporter)
5988 if (refcount_dec_and_test(&reporter->refcount))
5989 devlink_health_reporter_free(reporter);
5993 __devlink_health_reporter_destroy(struct devlink_health_reporter *reporter)
5995 list_del(&reporter->list);
5996 devlink_health_reporter_put(reporter);
6000 * devlink_health_reporter_destroy - destroy devlink health reporter
6002 * @reporter: devlink health reporter to destroy
6005 devlink_health_reporter_destroy(struct devlink_health_reporter *reporter)
6007 struct mutex *lock = &reporter->devlink->reporters_lock;
6010 __devlink_health_reporter_destroy(reporter);
6016 * devlink_port_health_reporter_destroy - destroy devlink port health reporter
6018 * @reporter: devlink health reporter to destroy
6021 devlink_port_health_reporter_destroy(struct devlink_health_reporter *reporter)
6023 struct mutex *lock = &reporter->devlink_port->reporters_lock;
6026 __devlink_health_reporter_destroy(reporter);
6034 struct devlink_health_reporter *reporter,
6048 if (reporter->devlink_port) {
6049 if (nla_put_u32(msg, DEVLINK_ATTR_PORT_INDEX, reporter->devlink_port->index))
6057 reporter->ops->name))
6060 reporter->health_state))
6063 reporter->error_count, DEVLINK_ATTR_PAD))
6066 reporter->recovery_count, DEVLINK_ATTR_PAD))
6068 if (reporter->ops->recover &&
6070 reporter->graceful_period,
6073 if (reporter->ops->recover &&
6075 reporter->auto_recover))
6077 if (reporter->dump_fmsg &&
6079 jiffies_to_msecs(reporter->dump_ts),
6082 if (reporter->dump_fmsg &&
6084 reporter->dump_real_ts, DEVLINK_ATTR_PAD))
6086 if (reporter->ops->dump &&
6088 reporter->auto_dump))
6102 static void devlink_recover_notify(struct devlink_health_reporter *reporter,
6114 err = devlink_nl_health_reporter_fill(msg, reporter->devlink,
6115 reporter, cmd, 0, 0, 0);
6122 devlink_net(reporter->devlink),
6127 devlink_health_reporter_recovery_done(struct devlink_health_reporter *reporter)
6129 reporter->recovery_count++;
6130 reporter->last_recovery_ts = jiffies;
6135 devlink_health_reporter_recover(struct devlink_health_reporter *reporter,
6140 if (reporter->health_state == DEVLINK_HEALTH_REPORTER_STATE_HEALTHY)
6143 if (!reporter->ops->recover)
6146 err = reporter->ops->recover(reporter, priv_ctx, extack);
6150 devlink_health_reporter_recovery_done(reporter);
6151 reporter->health_state = DEVLINK_HEALTH_REPORTER_STATE_HEALTHY;
6152 devlink_recover_notify(reporter, DEVLINK_CMD_HEALTH_REPORTER_RECOVER);
6158 devlink_health_dump_clear(struct devlink_health_reporter *reporter)
6160 if (!reporter->dump_fmsg)
6162 devlink_fmsg_free(reporter->dump_fmsg);
6163 reporter->dump_fmsg = NULL;
6166 static int devlink_health_do_dump(struct devlink_health_reporter *reporter,
6172 if (!reporter->ops->dump)
6175 if (reporter->dump_fmsg)
6178 reporter->dump_fmsg = devlink_fmsg_alloc();
6179 if (!reporter->dump_fmsg) {
6184 err = devlink_fmsg_obj_nest_start(reporter->dump_fmsg);
6188 err = reporter->ops->dump(reporter, reporter->dump_fmsg,
6193 err = devlink_fmsg_obj_nest_end(reporter->dump_fmsg);
6197 reporter->dump_ts = jiffies;
6198 reporter->dump_real_ts = ktime_get_real_ns();
6203 devlink_health_dump_clear(reporter);
6207 int devlink_health_report(struct devlink_health_reporter *reporter,
6211 struct devlink *devlink = reporter->devlink;
6216 trace_devlink_health_report(devlink, reporter->ops->name, msg);
6217 reporter->error_count++;
6218 prev_health_state = reporter->health_state;
6219 reporter->health_state = DEVLINK_HEALTH_REPORTER_STATE_ERROR;
6220 devlink_recover_notify(reporter, DEVLINK_CMD_HEALTH_REPORTER_RECOVER);
6223 recover_ts_threshold = reporter->last_recovery_ts +
6224 msecs_to_jiffies(reporter->graceful_period);
6225 if (reporter->auto_recover &&
6227 (reporter->last_recovery_ts && reporter->recovery_count &&
6230 reporter->ops->name,
6231 reporter->health_state,
6233 reporter->last_recovery_ts);
6237 reporter->health_state = DEVLINK_HEALTH_REPORTER_STATE_ERROR;
6239 if (reporter->auto_dump) {
6240 mutex_lock(&reporter->dump_lock);
6242 devlink_health_do_dump(reporter, priv_ctx, NULL);
6243 mutex_unlock(&reporter->dump_lock);
6246 if (reporter->auto_recover)
6247 return devlink_health_reporter_recover(reporter,
6258 struct devlink_health_reporter *reporter;
6269 reporter = devlink_health_reporter_find_by_name(devlink, reporter_name);
6270 if (reporter)
6271 refcount_inc(&reporter->refcount);
6275 reporter = devlink_port_health_reporter_find_by_name(devlink_port, reporter_name);
6276 if (reporter)
6277 refcount_inc(&reporter->refcount);
6281 return reporter;
6295 struct devlink_health_reporter *reporter;
6304 reporter = devlink_health_reporter_get_from_attrs(devlink, attrs);
6306 return reporter;
6313 devlink_health_reporter_state_update(struct devlink_health_reporter *reporter,
6320 if (reporter->health_state == state)
6323 reporter->health_state = state;
6324 trace_devlink_health_reporter_state_update(reporter->devlink,
6325 reporter->ops->name, state);
6326 devlink_recover_notify(reporter, DEVLINK_CMD_HEALTH_REPORTER_RECOVER);
6334 struct devlink_health_reporter *reporter;
6338 reporter = devlink_health_reporter_get_from_info(devlink, info);
6339 if (!reporter)
6348 err = devlink_nl_health_reporter_fill(msg, devlink, reporter,
6359 devlink_health_reporter_put(reporter);
6367 struct devlink_health_reporter *reporter;
6379 list_for_each_entry(reporter, &devlink->reporter_list,
6386 reporter,
6406 list_for_each_entry(reporter, &port->reporter_list, list) {
6411 err = devlink_nl_health_reporter_fill(msg, devlink, reporter,
6439 struct devlink_health_reporter *reporter;
6442 reporter = devlink_health_reporter_get_from_info(devlink, info);
6443 if (!reporter)
6446 if (!reporter->ops->recover &&
6452 if (!reporter->ops->dump &&
6459 reporter->graceful_period =
6463 reporter->auto_recover =
6467 reporter->auto_dump =
6470 devlink_health_reporter_put(reporter);
6473 devlink_health_reporter_put(reporter);
6481 struct devlink_health_reporter *reporter;
6484 reporter = devlink_health_reporter_get_from_info(devlink, info);
6485 if (!reporter)
6488 err = devlink_health_reporter_recover(reporter, NULL, info->extack);
6490 devlink_health_reporter_put(reporter);
6498 struct devlink_health_reporter *reporter;
6502 reporter = devlink_health_reporter_get_from_info(devlink, info);
6503 if (!reporter)
6506 if (!reporter->ops->diagnose) {
6507 devlink_health_reporter_put(reporter);
6513 devlink_health_reporter_put(reporter);
6521 err = reporter->ops->diagnose(reporter, fmsg, info->extack);
6534 devlink_health_reporter_put(reporter);
6542 struct devlink_health_reporter *reporter;
6546 reporter = devlink_health_reporter_get_from_cb(cb);
6547 if (!reporter)
6550 if (!reporter->ops->dump) {
6554 mutex_lock(&reporter->dump_lock);
6556 err = devlink_health_do_dump(reporter, NULL, cb->extack);
6559 cb->args[1] = reporter->dump_ts;
6561 if (!reporter->dump_fmsg || cb->args[1] != reporter->dump_ts) {
6567 err = devlink_fmsg_dumpit(reporter->dump_fmsg, skb, cb,
6570 mutex_unlock(&reporter->dump_lock);
6572 devlink_health_reporter_put(reporter);
6581 struct devlink_health_reporter *reporter;
6583 reporter = devlink_health_reporter_get_from_info(devlink, info);
6584 if (!reporter)
6587 if (!reporter->ops->dump) {
6588 devlink_health_reporter_put(reporter);
6592 mutex_lock(&reporter->dump_lock);
6593 devlink_health_dump_clear(reporter);
6594 mutex_unlock(&reporter->dump_lock);
6595 devlink_health_reporter_put(reporter);
6603 struct devlink_health_reporter *reporter;
6606 reporter = devlink_health_reporter_get_from_info(devlink, info);
6607 if (!reporter)
6610 if (!reporter->ops->test) {
6611 devlink_health_reporter_put(reporter);
6615 err = reporter->ops->test(reporter, info->extack);
6617 devlink_health_reporter_put(reporter);