devlink: add devink notification when reporter update health state
authorVikas Gupta <vikas.gupta@broadcom.com>
Thu, 2 Jan 2020 15:48:10 +0000 (21:18 +0530)
committerDavid S. Miller <davem@davemloft.net>
Wed, 8 Jan 2020 23:47:50 +0000 (15:47 -0800)
add a devlink notification when reporter update the health
state.

Signed-off-by: Vikas Gupta <vikas.gupta@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/devlink.c

index e686ae67cd962df63c35ebb591006a8a94077943..d30aa47052aaf7eb56d33f8825b8a30cd32695b1 100644 (file)
@@ -4843,23 +4843,6 @@ devlink_health_reporter_destroy(struct devlink_health_reporter *reporter)
 }
 EXPORT_SYMBOL_GPL(devlink_health_reporter_destroy);
 
-void
-devlink_health_reporter_state_update(struct devlink_health_reporter *reporter,
-                                    enum devlink_health_reporter_state state)
-{
-       if (WARN_ON(state != DEVLINK_HEALTH_REPORTER_STATE_HEALTHY &&
-                   state != DEVLINK_HEALTH_REPORTER_STATE_ERROR))
-               return;
-
-       if (reporter->health_state == state)
-               return;
-
-       reporter->health_state = state;
-       trace_devlink_health_reporter_state_update(reporter->devlink,
-                                                  reporter->ops->name, state);
-}
-EXPORT_SYMBOL_GPL(devlink_health_reporter_state_update);
-
 void
 devlink_health_reporter_recovery_done(struct devlink_health_reporter *reporter)
 {
@@ -5097,6 +5080,48 @@ genlmsg_cancel:
        return -EMSGSIZE;
 }
 
+static void devlink_recover_notify(struct devlink_health_reporter *reporter,
+                                  enum devlink_command cmd)
+{
+       struct sk_buff *msg;
+       int err;
+
+       WARN_ON(cmd != DEVLINK_CMD_HEALTH_REPORTER_RECOVER);
+
+       msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
+       if (!msg)
+               return;
+
+       err = devlink_nl_health_reporter_fill(msg, reporter->devlink,
+                                             reporter, cmd, 0, 0, 0);
+       if (err) {
+               nlmsg_free(msg);
+               return;
+       }
+
+       genlmsg_multicast_netns(&devlink_nl_family,
+                               devlink_net(reporter->devlink),
+                               msg, 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL);
+}
+
+void
+devlink_health_reporter_state_update(struct devlink_health_reporter *reporter,
+                                    enum devlink_health_reporter_state state)
+{
+       if (WARN_ON(state != DEVLINK_HEALTH_REPORTER_STATE_HEALTHY &&
+                   state != DEVLINK_HEALTH_REPORTER_STATE_ERROR))
+               return;
+
+       if (reporter->health_state == state)
+               return;
+
+       reporter->health_state = state;
+       trace_devlink_health_reporter_state_update(reporter->devlink,
+                                                  reporter->ops->name, state);
+       devlink_recover_notify(reporter, DEVLINK_CMD_HEALTH_REPORTER_RECOVER);
+}
+EXPORT_SYMBOL_GPL(devlink_health_reporter_state_update);
+
 static int devlink_nl_cmd_health_reporter_get_doit(struct sk_buff *skb,
                                                   struct genl_info *info)
 {