devlink: introduce the health reporter test command
authorJiri Pirko <jiri@nvidia.com>
Tue, 15 Sep 2020 08:40:57 +0000 (11:40 +0300)
committerDavid S. Miller <davem@davemloft.net>
Tue, 15 Sep 2020 22:57:16 +0000 (15:57 -0700)
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>
include/net/devlink.h
include/uapi/linux/devlink.h
net/core/devlink.c

index eaec0a8cc5efafb7d74f12f198f298e575b99e11..48b1c1ef1ebd9631264d3e854414da32f9fedf04 100644 (file)
@@ -566,6 +566,7 @@ enum devlink_health_reporter_state {
  * @dump: callback to dump an object
  *        if priv_ctx is NULL, run a full dump
  * @diagnose: callback to diagnose the current status
+ * @test: callback to trigger a test event
  */
 
 struct devlink_health_reporter_ops {
@@ -578,6 +579,8 @@ struct devlink_health_reporter_ops {
        int (*diagnose)(struct devlink_health_reporter *reporter,
                        struct devlink_fmsg *fmsg,
                        struct netlink_ext_ack *extack);
+       int (*test)(struct devlink_health_reporter *reporter,
+                   struct netlink_ext_ack *extack);
 };
 
 /**
index 40d35145c879c1347876fc314ec2e17702105a2f..631f5bdf1707c60b2591ad297d8c7fc1f0d71c95 100644 (file)
@@ -122,6 +122,8 @@ enum devlink_command {
        DEVLINK_CMD_TRAP_POLICER_NEW,
        DEVLINK_CMD_TRAP_POLICER_DEL,
 
+       DEVLINK_CMD_HEALTH_REPORTER_TEST,
+
        /* add new commands above here */
        __DEVLINK_CMD_MAX,
        DEVLINK_CMD_MAX = __DEVLINK_CMD_MAX - 1
index 19037f11430797deaf192b5d092d04b65ac23c5b..e5b71f3c2d4d80c650baa33845c6aa362e89350a 100644 (file)
@@ -6096,6 +6096,28 @@ devlink_nl_cmd_health_reporter_dump_clear_doit(struct sk_buff *skb,
        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 {
        u64 rx_bytes;
        u64 rx_packets;
@@ -7316,6 +7338,14 @@ static const struct genl_ops devlink_nl_ops[] = {
                .internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK_OR_PORT |
                                  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,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,