devlink: introduce the health reporter test command
Introduce a test command for health reporters. User might use this command to trigger test event on a reporter if the reporter supports it. Signed-off-by: Jiri Pirko <jiri@nvidia.com> Signed-off-by: Ido Schimmel <idosch@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
191c0c22b5
commit
e2ce94dc1d
@@ -566,6 +566,7 @@ enum devlink_health_reporter_state {
|
|||||||
* @dump: callback to dump an object
|
* @dump: callback to dump an object
|
||||||
* if priv_ctx is NULL, run a full dump
|
* if priv_ctx is NULL, run a full dump
|
||||||
* @diagnose: callback to diagnose the current status
|
* @diagnose: callback to diagnose the current status
|
||||||
|
* @test: callback to trigger a test event
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct devlink_health_reporter_ops {
|
struct devlink_health_reporter_ops {
|
||||||
@@ -578,6 +579,8 @@ struct devlink_health_reporter_ops {
|
|||||||
int (*diagnose)(struct devlink_health_reporter *reporter,
|
int (*diagnose)(struct devlink_health_reporter *reporter,
|
||||||
struct devlink_fmsg *fmsg,
|
struct devlink_fmsg *fmsg,
|
||||||
struct netlink_ext_ack *extack);
|
struct netlink_ext_ack *extack);
|
||||||
|
int (*test)(struct devlink_health_reporter *reporter,
|
||||||
|
struct netlink_ext_ack *extack);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -122,6 +122,8 @@ enum devlink_command {
|
|||||||
DEVLINK_CMD_TRAP_POLICER_NEW,
|
DEVLINK_CMD_TRAP_POLICER_NEW,
|
||||||
DEVLINK_CMD_TRAP_POLICER_DEL,
|
DEVLINK_CMD_TRAP_POLICER_DEL,
|
||||||
|
|
||||||
|
DEVLINK_CMD_HEALTH_REPORTER_TEST,
|
||||||
|
|
||||||
/* add new commands above here */
|
/* add new commands above here */
|
||||||
__DEVLINK_CMD_MAX,
|
__DEVLINK_CMD_MAX,
|
||||||
DEVLINK_CMD_MAX = __DEVLINK_CMD_MAX - 1
|
DEVLINK_CMD_MAX = __DEVLINK_CMD_MAX - 1
|
||||||
|
@@ -6096,6 +6096,28 @@ devlink_nl_cmd_health_reporter_dump_clear_doit(struct sk_buff *skb,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int devlink_nl_cmd_health_reporter_test_doit(struct sk_buff *skb,
|
||||||
|
struct genl_info *info)
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = reporter->ops->test(reporter, info->extack);
|
||||||
|
|
||||||
|
devlink_health_reporter_put(reporter);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
struct devlink_stats {
|
struct devlink_stats {
|
||||||
u64 rx_bytes;
|
u64 rx_bytes;
|
||||||
u64 rx_packets;
|
u64 rx_packets;
|
||||||
@@ -7316,6 +7338,14 @@ static const struct genl_ops devlink_nl_ops[] = {
|
|||||||
.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK_OR_PORT |
|
.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK_OR_PORT |
|
||||||
DEVLINK_NL_FLAG_NO_LOCK,
|
DEVLINK_NL_FLAG_NO_LOCK,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.cmd = DEVLINK_CMD_HEALTH_REPORTER_TEST,
|
||||||
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||||
|
.doit = devlink_nl_cmd_health_reporter_test_doit,
|
||||||
|
.flags = GENL_ADMIN_PERM,
|
||||||
|
.internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK_OR_PORT |
|
||||||
|
DEVLINK_NL_FLAG_NO_LOCK,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.cmd = DEVLINK_CMD_FLASH_UPDATE,
|
.cmd = DEVLINK_CMD_FLASH_UPDATE,
|
||||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||||
|
Reference in New Issue
Block a user