Lines Matching defs:reporter
74 devlink_health_reporter_priv(struct devlink_health_reporter *reporter)
76 return reporter->priv;
84 struct devlink_health_reporter *reporter;
86 list_for_each_entry(reporter, reporter_list, list)
87 if (!strcmp(reporter->ops->name, reporter_name))
88 return reporter;
113 struct devlink_health_reporter *reporter;
118 reporter = kzalloc(sizeof(*reporter), GFP_KERNEL);
119 if (!reporter)
122 reporter->priv = priv;
123 reporter->ops = ops;
124 reporter->devlink = devlink;
125 reporter->graceful_period = graceful_period;
126 reporter->auto_recover = !!ops->recover;
127 reporter->auto_dump = !!ops->dump;
128 return reporter;
132 * devl_port_health_reporter_create() - create devlink health reporter for
136 * @ops: devlink health reporter ops
145 struct devlink_health_reporter *reporter;
153 reporter = __devlink_health_reporter_create(port->devlink, ops,
155 if (IS_ERR(reporter))
156 return reporter;
158 reporter->devlink_port = port;
159 list_add_tail(&reporter->list, &port->reporter_list);
160 return reporter;
169 struct devlink_health_reporter *reporter;
173 reporter = devl_port_health_reporter_create(port, ops,
176 return reporter;
181 * devl_health_reporter_create - create devlink health reporter
184 * @ops: devlink health reporter ops
193 struct devlink_health_reporter *reporter;
200 reporter = __devlink_health_reporter_create(devlink, ops,
202 if (IS_ERR(reporter))
203 return reporter;
205 list_add_tail(&reporter->list, &devlink->reporter_list);
206 return reporter;
215 struct devlink_health_reporter *reporter;
218 reporter = devl_health_reporter_create(devlink, ops,
221 return reporter;
226 devlink_health_reporter_free(struct devlink_health_reporter *reporter)
228 if (reporter->dump_fmsg)
229 devlink_fmsg_free(reporter->dump_fmsg);
230 kfree(reporter);
234 * devl_health_reporter_destroy() - destroy devlink health reporter
236 * @reporter: devlink health reporter to destroy
239 devl_health_reporter_destroy(struct devlink_health_reporter *reporter)
241 devl_assert_locked(reporter->devlink);
243 list_del(&reporter->list);
244 devlink_health_reporter_free(reporter);
249 devlink_health_reporter_destroy(struct devlink_health_reporter *reporter)
251 struct devlink *devlink = reporter->devlink;
254 devl_health_reporter_destroy(reporter);
261 struct devlink_health_reporter *reporter,
265 struct devlink *devlink = reporter->devlink;
276 if (reporter->devlink_port) {
277 if (nla_put_u32(msg, DEVLINK_ATTR_PORT_INDEX, reporter->devlink_port->index))
285 reporter->ops->name))
288 reporter->health_state))
291 reporter->error_count))
294 reporter->recovery_count))
296 if (reporter->ops->recover &&
298 reporter->graceful_period))
300 if (reporter->ops->recover &&
302 reporter->auto_recover))
304 if (reporter->dump_fmsg &&
306 jiffies_to_msecs(reporter->dump_ts)))
308 if (reporter->dump_fmsg &&
310 reporter->dump_real_ts))
312 if (reporter->ops->dump &&
314 reporter->auto_dump))
359 struct devlink_health_reporter *reporter;
363 reporter = devlink_health_reporter_get_from_info(devlink, info);
364 if (!reporter)
371 err = devlink_nl_health_reporter_fill(msg, reporter,
390 struct devlink_health_reporter *reporter;
406 list_for_each_entry(reporter, &devlink->reporter_list, list) {
411 err = devlink_nl_health_reporter_fill(msg, reporter,
425 list_for_each_entry(reporter, &port->reporter_list, list) {
430 err = devlink_nl_health_reporter_fill(msg, reporter,
457 struct devlink_health_reporter *reporter;
459 reporter = devlink_health_reporter_get_from_info(devlink, info);
460 if (!reporter)
463 if (!reporter->ops->recover &&
468 if (!reporter->ops->dump &&
473 reporter->graceful_period =
477 reporter->auto_recover =
481 reporter->auto_dump =
487 static void devlink_recover_notify(struct devlink_health_reporter *reporter,
490 struct devlink *devlink = reporter->devlink;
505 err = devlink_nl_health_reporter_fill(msg, reporter, cmd, 0, 0, 0);
512 if (reporter->devlink_port)
513 devlink_nl_obj_desc_port_set(&desc, reporter->devlink_port);
518 devlink_health_reporter_recovery_done(struct devlink_health_reporter *reporter)
520 reporter->recovery_count++;
521 reporter->last_recovery_ts = jiffies;
526 devlink_health_reporter_recover(struct devlink_health_reporter *reporter,
531 if (reporter->health_state == DEVLINK_HEALTH_REPORTER_STATE_HEALTHY)
534 if (!reporter->ops->recover)
537 err = reporter->ops->recover(reporter, priv_ctx, extack);
541 devlink_health_reporter_recovery_done(reporter);
542 reporter->health_state = DEVLINK_HEALTH_REPORTER_STATE_HEALTHY;
543 devlink_recover_notify(reporter, DEVLINK_CMD_HEALTH_REPORTER_RECOVER);
549 devlink_health_dump_clear(struct devlink_health_reporter *reporter)
551 if (!reporter->dump_fmsg)
553 devlink_fmsg_free(reporter->dump_fmsg);
554 reporter->dump_fmsg = NULL;
557 static int devlink_health_do_dump(struct devlink_health_reporter *reporter,
563 if (!reporter->ops->dump)
566 if (reporter->dump_fmsg)
569 reporter->dump_fmsg = devlink_fmsg_alloc();
570 if (!reporter->dump_fmsg)
573 devlink_fmsg_obj_nest_start(reporter->dump_fmsg);
575 err = reporter->ops->dump(reporter, reporter->dump_fmsg,
580 devlink_fmsg_obj_nest_end(reporter->dump_fmsg);
581 err = reporter->dump_fmsg->err;
585 reporter->dump_ts = jiffies;
586 reporter->dump_real_ts = ktime_get_real_ns();
591 devlink_health_dump_clear(reporter);
595 int devlink_health_report(struct devlink_health_reporter *reporter,
599 struct devlink *devlink = reporter->devlink;
605 trace_devlink_health_report(devlink, reporter->ops->name, msg);
606 reporter->error_count++;
607 prev_health_state = reporter->health_state;
608 reporter->health_state = DEVLINK_HEALTH_REPORTER_STATE_ERROR;
609 devlink_recover_notify(reporter, DEVLINK_CMD_HEALTH_REPORTER_RECOVER);
612 recover_ts_threshold = reporter->last_recovery_ts +
613 msecs_to_jiffies(reporter->graceful_period);
614 if (reporter->auto_recover &&
616 (reporter->last_recovery_ts && reporter->recovery_count &&
619 reporter->ops->name,
620 reporter->health_state,
622 reporter->last_recovery_ts);
626 if (reporter->auto_dump) {
629 devlink_health_do_dump(reporter, priv_ctx, NULL);
633 if (!reporter->auto_recover)
637 ret = devlink_health_reporter_recover(reporter, priv_ctx, NULL);
645 devlink_health_reporter_state_update(struct devlink_health_reporter *reporter,
652 if (reporter->health_state == state)
655 reporter->health_state = state;
656 trace_devlink_health_reporter_state_update(reporter->devlink,
657 reporter->ops->name, state);
658 devlink_recover_notify(reporter, DEVLINK_CMD_HEALTH_REPORTER_RECOVER);
666 struct devlink_health_reporter *reporter;
668 reporter = devlink_health_reporter_get_from_info(devlink, info);
669 if (!reporter)
672 return devlink_health_reporter_recover(reporter, NULL, info->extack);
1108 struct devlink_health_reporter *reporter;
1112 reporter = devlink_health_reporter_get_from_info(devlink, info);
1113 if (!reporter)
1116 if (!reporter->ops->diagnose)
1125 err = reporter->ops->diagnose(reporter, fmsg, info->extack);
1143 struct devlink_health_reporter *reporter;
1152 reporter = devlink_health_reporter_get_from_attrs(devlink, attrs);
1153 if (!reporter) {
1157 return reporter;
1164 struct devlink_health_reporter *reporter;
1168 reporter = devlink_health_reporter_get_from_cb_lock(cb);
1169 if (!reporter)
1172 devlink = reporter->devlink;
1173 if (!reporter->ops->dump) {
1180 err = devlink_health_do_dump(reporter, NULL, cb->extack);
1183 state->dump_ts = reporter->dump_ts;
1185 if (!reporter->dump_fmsg || state->dump_ts != reporter->dump_ts) {
1191 err = devlink_fmsg_dumpit(reporter->dump_fmsg, skb, cb,
1203 struct devlink_health_reporter *reporter;
1205 reporter = devlink_health_reporter_get_from_info(devlink, info);
1206 if (!reporter)
1209 if (!reporter->ops->dump)
1212 devlink_health_dump_clear(reporter);
1220 struct devlink_health_reporter *reporter;
1222 reporter = devlink_health_reporter_get_from_info(devlink, info);
1223 if (!reporter)
1226 if (!reporter->ops->test)
1229 return reporter->ops->test(reporter, info->extack);