summaryrefslogtreecommitdiffstats
path: root/net/core/devlink.c
diff options
context:
space:
mode:
authorShannon Nelson <snelson@pensando.io>2020-09-17 18:13:23 -0700
committerDavid S. Miller <davem@davemloft.net>2020-09-18 13:54:22 -0700
commitf92970c694b36a4dbac2b650b173c78c0f0954cc (patch)
tree2b7f579740d10f8bfd17a83ea839e7bcc17c2205 /net/core/devlink.c
parent0e4be9e57e8cb8f2130280c26a2d6de9c06a8500 (diff)
downloadlinux-f92970c694b36a4dbac2b650b173c78c0f0954cc.tar.gz
linux-f92970c694b36a4dbac2b650b173c78c0f0954cc.tar.bz2
linux-f92970c694b36a4dbac2b650b173c78c0f0954cc.zip
devlink: add timeout information to status_notify
Add a timeout element to the DEVLINK_CMD_FLASH_UPDATE_STATUS netlink message for use by a userland utility to show that a particular firmware flash activity may take a long but bounded time to finish. Also add a handy helper for drivers to make use of the new timeout value. UI usage hints: - if non-zero, add timeout display to the end of the status line [component] status_msg ( Xm Ys : Am Bs ) using the timeout value for Am Bs and updating the Xm Ys every second - if the timeout expires while awaiting the next update, display something like [component] status_msg ( timeout reached : Am Bs ) - if new status notify messages are received, remove the timeout and start over Signed-off-by: Shannon Nelson <snelson@pensando.io> Reviewed-by: Jakub Kicinski <kuba@kernel.org> Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/devlink.c')
-rw-r--r--net/core/devlink.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/net/core/devlink.c b/net/core/devlink.c
index e5b71f3c2d4d..a32e15851119 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -3024,7 +3024,9 @@ static int devlink_nl_flash_update_fill(struct sk_buff *msg,
enum devlink_command cmd,
const char *status_msg,
const char *component,
- unsigned long done, unsigned long total)
+ unsigned long done,
+ unsigned long total,
+ unsigned long timeout)
{
void *hdr;
@@ -3052,6 +3054,9 @@ static int devlink_nl_flash_update_fill(struct sk_buff *msg,
if (nla_put_u64_64bit(msg, DEVLINK_ATTR_FLASH_UPDATE_STATUS_TOTAL,
total, DEVLINK_ATTR_PAD))
goto nla_put_failure;
+ if (nla_put_u64_64bit(msg, DEVLINK_ATTR_FLASH_UPDATE_STATUS_TIMEOUT,
+ timeout, DEVLINK_ATTR_PAD))
+ goto nla_put_failure;
out:
genlmsg_end(msg, hdr);
@@ -3067,7 +3072,8 @@ static void __devlink_flash_update_notify(struct devlink *devlink,
const char *status_msg,
const char *component,
unsigned long done,
- unsigned long total)
+ unsigned long total,
+ unsigned long timeout)
{
struct sk_buff *msg;
int err;
@@ -3081,7 +3087,7 @@ static void __devlink_flash_update_notify(struct devlink *devlink,
return;
err = devlink_nl_flash_update_fill(msg, devlink, cmd, status_msg,
- component, done, total);
+ component, done, total, timeout);
if (err)
goto out_free_msg;
@@ -3097,7 +3103,7 @@ void devlink_flash_update_begin_notify(struct devlink *devlink)
{
__devlink_flash_update_notify(devlink,
DEVLINK_CMD_FLASH_UPDATE,
- NULL, NULL, 0, 0);
+ NULL, NULL, 0, 0, 0);
}
EXPORT_SYMBOL_GPL(devlink_flash_update_begin_notify);
@@ -3105,7 +3111,7 @@ void devlink_flash_update_end_notify(struct devlink *devlink)
{
__devlink_flash_update_notify(devlink,
DEVLINK_CMD_FLASH_UPDATE_END,
- NULL, NULL, 0, 0);
+ NULL, NULL, 0, 0, 0);
}
EXPORT_SYMBOL_GPL(devlink_flash_update_end_notify);
@@ -3117,10 +3123,21 @@ void devlink_flash_update_status_notify(struct devlink *devlink,
{
__devlink_flash_update_notify(devlink,
DEVLINK_CMD_FLASH_UPDATE_STATUS,
- status_msg, component, done, total);
+ status_msg, component, done, total, 0);
}
EXPORT_SYMBOL_GPL(devlink_flash_update_status_notify);
+void devlink_flash_update_timeout_notify(struct devlink *devlink,
+ const char *status_msg,
+ const char *component,
+ unsigned long timeout)
+{
+ __devlink_flash_update_notify(devlink,
+ DEVLINK_CMD_FLASH_UPDATE_STATUS,
+ status_msg, component, 0, 0, timeout);
+}
+EXPORT_SYMBOL_GPL(devlink_flash_update_timeout_notify);
+
static int devlink_nl_cmd_flash_update(struct sk_buff *skb,
struct genl_info *info)
{