Lines Matching refs:reporter
73 devlink_health_reporter_priv(struct devlink_health_reporter *reporter)
75 return reporter->priv;
83 struct devlink_health_reporter *reporter;
85 list_for_each_entry(reporter, reporter_list, list)
86 if (!strcmp(reporter->ops->name, reporter_name))
87 return reporter;
112 struct devlink_health_reporter *reporter;
117 reporter = kzalloc(sizeof(*reporter), GFP_KERNEL);
118 if (!reporter)
121 reporter->priv = priv;
122 reporter->ops = ops;
123 reporter->devlink = devlink;
124 reporter->graceful_period = graceful_period;
125 reporter->auto_recover = !!ops->recover;
126 reporter->auto_dump = !!ops->dump;
127 return reporter;
131 * devl_port_health_reporter_create() - create devlink health reporter for
135 * @ops: devlink health reporter ops
144 struct devlink_health_reporter *reporter;
152 reporter = __devlink_health_reporter_create(port->devlink, ops,
154 if (IS_ERR(reporter))
155 return reporter;
157 reporter->devlink_port = port;
158 list_add_tail(&reporter->list, &port->reporter_list);
159 return reporter;
168 struct devlink_health_reporter *reporter;
172 reporter = devl_port_health_reporter_create(port, ops,
175 return reporter;
180 * devl_health_reporter_create - create devlink health reporter
183 * @ops: devlink health reporter ops
192 struct devlink_health_reporter *reporter;
199 reporter = __devlink_health_reporter_create(devlink, ops,
201 if (IS_ERR(reporter))
202 return reporter;
204 list_add_tail(&reporter->list, &devlink->reporter_list);
205 return reporter;
214 struct devlink_health_reporter *reporter;
217 reporter = devl_health_reporter_create(devlink, ops,
220 return reporter;
225 devlink_health_reporter_free(struct devlink_health_reporter *reporter)
227 if (reporter->dump_fmsg)
228 devlink_fmsg_free(reporter->dump_fmsg);
229 kfree(reporter);
233 * devl_health_reporter_destroy() - destroy devlink health reporter
235 * @reporter: devlink health reporter to destroy
238 devl_health_reporter_destroy(struct devlink_health_reporter *reporter)
240 devl_assert_locked(reporter->devlink);
242 list_del(&reporter->list);
243 devlink_health_reporter_free(reporter);
248 devlink_health_reporter_destroy(struct devlink_health_reporter *reporter)
250 struct devlink *devlink = reporter->devlink;
253 devl_health_reporter_destroy(reporter);
260 struct devlink_health_reporter *reporter,
264 struct devlink *devlink = reporter->devlink;
275 if (reporter->devlink_port) {
276 if (nla_put_u32(msg, DEVLINK_ATTR_PORT_INDEX, reporter->devlink_port->index))
284 reporter->ops->name))
287 reporter->health_state))
290 reporter->error_count, DEVLINK_ATTR_PAD))
293 reporter->recovery_count, DEVLINK_ATTR_PAD))
295 if (reporter->ops->recover &&
297 reporter->graceful_period,
300 if (reporter->ops->recover &&
302 reporter->auto_recover))
304 if (reporter->dump_fmsg &&
306 jiffies_to_msecs(reporter->dump_ts),
309 if (reporter->dump_fmsg &&
311 reporter->dump_real_ts, DEVLINK_ATTR_PAD))
313 if (reporter->ops->dump &&
315 reporter->auto_dump))
360 struct devlink_health_reporter *reporter;
364 reporter = devlink_health_reporter_get_from_info(devlink, info);
365 if (!reporter)
372 err = devlink_nl_health_reporter_fill(msg, reporter,
391 struct devlink_health_reporter *reporter;
407 list_for_each_entry(reporter, &devlink->reporter_list, list) {
412 err = devlink_nl_health_reporter_fill(msg, reporter,
426 list_for_each_entry(reporter, &port->reporter_list, list) {
431 err = devlink_nl_health_reporter_fill(msg, reporter,
458 struct devlink_health_reporter *reporter;
460 reporter = devlink_health_reporter_get_from_info(devlink, info);
461 if (!reporter)
464 if (!reporter->ops->recover &&
469 if (!reporter->ops->dump &&
474 reporter->graceful_period =
478 reporter->auto_recover =
482 reporter->auto_dump =
488 static void devlink_recover_notify(struct devlink_health_reporter *reporter,
491 struct devlink *devlink = reporter->devlink;
502 err = devlink_nl_health_reporter_fill(msg, reporter, cmd, 0, 0, 0);
513 devlink_health_reporter_recovery_done(struct devlink_health_reporter *reporter)
515 reporter->recovery_count++;
516 reporter->last_recovery_ts = jiffies;
521 devlink_health_reporter_recover(struct devlink_health_reporter *reporter,
526 if (reporter->health_state == DEVLINK_HEALTH_REPORTER_STATE_HEALTHY)
529 if (!reporter->ops->recover)
532 err = reporter->ops->recover(reporter, priv_ctx, extack);
536 devlink_health_reporter_recovery_done(reporter);
537 reporter->health_state = DEVLINK_HEALTH_REPORTER_STATE_HEALTHY;
538 devlink_recover_notify(reporter, DEVLINK_CMD_HEALTH_REPORTER_RECOVER);
544 devlink_health_dump_clear(struct devlink_health_reporter *reporter)
546 if (!reporter->dump_fmsg)
548 devlink_fmsg_free(reporter->dump_fmsg);
549 reporter->dump_fmsg = NULL;
552 static int devlink_health_do_dump(struct devlink_health_reporter *reporter,
558 if (!reporter->ops->dump)
561 if (reporter->dump_fmsg)
564 reporter->dump_fmsg = devlink_fmsg_alloc();
565 if (!reporter->dump_fmsg) {
570 err = devlink_fmsg_obj_nest_start(reporter->dump_fmsg);
574 err = reporter->ops->dump(reporter, reporter->dump_fmsg,
579 err = devlink_fmsg_obj_nest_end(reporter->dump_fmsg);
583 reporter->dump_ts = jiffies;
584 reporter->dump_real_ts = ktime_get_real_ns();
589 devlink_health_dump_clear(reporter);
593 int devlink_health_report(struct devlink_health_reporter *reporter,
597 struct devlink *devlink = reporter->devlink;
603 trace_devlink_health_report(devlink, reporter->ops->name, msg);
604 reporter->error_count++;
605 prev_health_state = reporter->health_state;
606 reporter->health_state = DEVLINK_HEALTH_REPORTER_STATE_ERROR;
607 devlink_recover_notify(reporter, DEVLINK_CMD_HEALTH_REPORTER_RECOVER);
610 recover_ts_threshold = reporter->last_recovery_ts +
611 msecs_to_jiffies(reporter->graceful_period);
612 if (reporter->auto_recover &&
614 (reporter->last_recovery_ts && reporter->recovery_count &&
617 reporter->ops->name,
618 reporter->health_state,
620 reporter->last_recovery_ts);
624 if (reporter->auto_dump) {
627 devlink_health_do_dump(reporter, priv_ctx, NULL);
631 if (!reporter->auto_recover)
635 ret = devlink_health_reporter_recover(reporter, priv_ctx, NULL);
643 devlink_health_reporter_state_update(struct devlink_health_reporter *reporter,
650 if (reporter->health_state == state)
653 reporter->health_state = state;
654 trace_devlink_health_reporter_state_update(reporter->devlink,
655 reporter->ops->name, state);
656 devlink_recover_notify(reporter, DEVLINK_CMD_HEALTH_REPORTER_RECOVER);
664 struct devlink_health_reporter *reporter;
666 reporter = devlink_health_reporter_get_from_info(devlink, info);
667 if (!reporter)
670 return devlink_health_reporter_recover(reporter, NULL, info->extack);
1226 struct devlink_health_reporter *reporter;
1230 reporter = devlink_health_reporter_get_from_info(devlink, info);
1231 if (!reporter)
1234 if (!reporter->ops->diagnose)
1245 err = reporter->ops->diagnose(reporter, fmsg, info->extack);
1265 struct devlink_health_reporter *reporter;
1273 reporter = devlink_health_reporter_get_from_attrs(devlink, attrs);
1274 if (!reporter) {
1278 return reporter;
1285 struct devlink_health_reporter *reporter;
1289 reporter = devlink_health_reporter_get_from_cb_lock(cb);
1290 if (!reporter)
1293 devlink = reporter->devlink;
1294 if (!reporter->ops->dump) {
1301 err = devlink_health_do_dump(reporter, NULL, cb->extack);
1304 state->dump_ts = reporter->dump_ts;
1306 if (!reporter->dump_fmsg || state->dump_ts != reporter->dump_ts) {
1312 err = devlink_fmsg_dumpit(reporter->dump_fmsg, skb, cb,
1324 struct devlink_health_reporter *reporter;
1326 reporter = devlink_health_reporter_get_from_info(devlink, info);
1327 if (!reporter)
1330 if (!reporter->ops->dump)
1333 devlink_health_dump_clear(reporter);
1341 struct devlink_health_reporter *reporter;
1343 reporter = devlink_health_reporter_get_from_info(devlink, info);
1344 if (!reporter)
1347 if (!reporter->ops->test)
1350 return reporter->ops->test(reporter, info->extack);