]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
devlink: add support for reporter recovery completion
authorVikas Gupta <vikas.gupta@broadcom.com>
Thu, 2 Jan 2020 15:48:09 +0000 (21:18 +0530)
committerDavid S. Miller <davem@davemloft.net>
Wed, 8 Jan 2020 23:47:50 +0000 (15:47 -0800)
It is possible that a reporter recovery completion do not finish
successfully when recovery is triggered via
devlink_health_reporter_recover as recovery could be processed in
different context. In such scenario an error is returned by driver when
recover hook is invoked and successful recovery completion is
intimated later.
Expose devlink recover done API to update recovery stats.

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

index 47f87b2fcf633b1181263772936882910782e4b2..453f45cc15193783230effca96516457af68d577 100644 (file)
@@ -1000,6 +1000,8 @@ int devlink_health_report(struct devlink_health_reporter *reporter,
 void
 devlink_health_reporter_state_update(struct devlink_health_reporter *reporter,
                                     enum devlink_health_reporter_state state);
+void
+devlink_health_reporter_recovery_done(struct devlink_health_reporter *reporter);
 
 bool devlink_is_reload_failed(const struct devlink *devlink);
 
index 4c63c9a4c09e62fdc8b428ae5a990feb329c47f6..e686ae67cd962df63c35ebb591006a8a94077943 100644 (file)
@@ -4860,6 +4860,14 @@ devlink_health_reporter_state_update(struct devlink_health_reporter *reporter,
 }
 EXPORT_SYMBOL_GPL(devlink_health_reporter_state_update);
 
+void
+devlink_health_reporter_recovery_done(struct devlink_health_reporter *reporter)
+{
+       reporter->recovery_count++;
+       reporter->last_recovery_ts = jiffies;
+}
+EXPORT_SYMBOL_GPL(devlink_health_reporter_recovery_done);
+
 static int
 devlink_health_reporter_recover(struct devlink_health_reporter *reporter,
                                void *priv_ctx, struct netlink_ext_ack *extack)
@@ -4876,9 +4884,8 @@ devlink_health_reporter_recover(struct devlink_health_reporter *reporter,
        if (err)
                return err;
 
-       reporter->recovery_count++;
+       devlink_health_reporter_recovery_done(reporter);
        reporter->health_state = DEVLINK_HEALTH_REPORTER_STATE_HEALTHY;
-       reporter->last_recovery_ts = jiffies;
 
        return 0;
 }