diff options
author | David S. Miller <davem@davemloft.net> | 2020-01-08 15:47:50 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2020-01-08 15:47:50 -0800 |
commit | 8d2ff126536320f7243bd05a69703c9b4cd7e46e (patch) | |
tree | d60dded3ab9c560aa5486b0673a64fd69d7e62ee /net/core/devlink.c | |
parent | 6ea0032f84a49ae208ae9424dec8c41673010a0c (diff) | |
parent | 737d7a6c55964955604b9de398dac3791bab5a64 (diff) | |
download | kernel_replicant_linux-8d2ff126536320f7243bd05a69703c9b4cd7e46e.tar.gz kernel_replicant_linux-8d2ff126536320f7243bd05a69703c9b4cd7e46e.tar.bz2 kernel_replicant_linux-8d2ff126536320f7243bd05a69703c9b4cd7e46e.zip |
Merge branch 'Devlink-notification-after-recovery-complete-by-bnxt_en-driver'
Vikas Gupta says:
====================
Devlink notification after recovery complete by bnxt_en driver
This patchset adds following feature in devlink
1) Recovery complete direct call API to be used by drivers when it
successfully completes. It is required as recovery triggered by
devlink may return with EINPROGRESS and eventually recovery
completes in different context.
2) A notification when health status is updated by reporter.
Patchset also contains required changes in bnxt_en driver to
mark recovery in progress when recovery is triggered from kernel
devlink.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/devlink.c')
-rw-r--r-- | net/core/devlink.c | 62 |
1 files changed, 47 insertions, 15 deletions
diff --git a/net/core/devlink.c b/net/core/devlink.c index 4c63c9a4c09e..d30aa47052aa 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -4844,21 +4844,12 @@ 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) +devlink_health_reporter_recovery_done(struct devlink_health_reporter *reporter) { - 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); + reporter->recovery_count++; + reporter->last_recovery_ts = jiffies; } -EXPORT_SYMBOL_GPL(devlink_health_reporter_state_update); +EXPORT_SYMBOL_GPL(devlink_health_reporter_recovery_done); static int devlink_health_reporter_recover(struct devlink_health_reporter *reporter, @@ -4876,9 +4867,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; } @@ -5090,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) { |