Commit f92970c6 authored by Shannon Nelson's avatar Shannon Nelson Committed by David S. Miller

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: default avatarShannon Nelson <snelson@pensando.io>
Reviewed-by: default avatarJakub Kicinski <kuba@kernel.org>
Reviewed-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0e4be9e5
...@@ -1403,6 +1403,10 @@ void devlink_flash_update_status_notify(struct devlink *devlink, ...@@ -1403,6 +1403,10 @@ void devlink_flash_update_status_notify(struct devlink *devlink,
const char *component, const char *component,
unsigned long done, unsigned long done,
unsigned long total); unsigned long total);
void devlink_flash_update_timeout_notify(struct devlink *devlink,
const char *status_msg,
const char *component,
unsigned long timeout);
int devlink_traps_register(struct devlink *devlink, int devlink_traps_register(struct devlink *devlink,
const struct devlink_trap *traps, const struct devlink_trap *traps,
......
...@@ -462,6 +462,9 @@ enum devlink_attr { ...@@ -462,6 +462,9 @@ enum devlink_attr {
DEVLINK_ATTR_PORT_EXTERNAL, /* u8 */ DEVLINK_ATTR_PORT_EXTERNAL, /* u8 */
DEVLINK_ATTR_PORT_CONTROLLER_NUMBER, /* u32 */ DEVLINK_ATTR_PORT_CONTROLLER_NUMBER, /* u32 */
DEVLINK_ATTR_FLASH_UPDATE_STATUS_TIMEOUT, /* u64 */
/* add new attributes above here, update the policy in devlink.c */ /* add new attributes above here, update the policy in devlink.c */
__DEVLINK_ATTR_MAX, __DEVLINK_ATTR_MAX,
......
...@@ -3024,7 +3024,9 @@ static int devlink_nl_flash_update_fill(struct sk_buff *msg, ...@@ -3024,7 +3024,9 @@ static int devlink_nl_flash_update_fill(struct sk_buff *msg,
enum devlink_command cmd, enum devlink_command cmd,
const char *status_msg, const char *status_msg,
const char *component, const char *component,
unsigned long done, unsigned long total) unsigned long done,
unsigned long total,
unsigned long timeout)
{ {
void *hdr; void *hdr;
...@@ -3052,6 +3054,9 @@ static int devlink_nl_flash_update_fill(struct sk_buff *msg, ...@@ -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, if (nla_put_u64_64bit(msg, DEVLINK_ATTR_FLASH_UPDATE_STATUS_TOTAL,
total, DEVLINK_ATTR_PAD)) total, DEVLINK_ATTR_PAD))
goto nla_put_failure; 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: out:
genlmsg_end(msg, hdr); genlmsg_end(msg, hdr);
...@@ -3067,7 +3072,8 @@ static void __devlink_flash_update_notify(struct devlink *devlink, ...@@ -3067,7 +3072,8 @@ static void __devlink_flash_update_notify(struct devlink *devlink,
const char *status_msg, const char *status_msg,
const char *component, const char *component,
unsigned long done, unsigned long done,
unsigned long total) unsigned long total,
unsigned long timeout)
{ {
struct sk_buff *msg; struct sk_buff *msg;
int err; int err;
...@@ -3081,7 +3087,7 @@ static void __devlink_flash_update_notify(struct devlink *devlink, ...@@ -3081,7 +3087,7 @@ static void __devlink_flash_update_notify(struct devlink *devlink,
return; return;
err = devlink_nl_flash_update_fill(msg, devlink, cmd, status_msg, err = devlink_nl_flash_update_fill(msg, devlink, cmd, status_msg,
component, done, total); component, done, total, timeout);
if (err) if (err)
goto out_free_msg; goto out_free_msg;
...@@ -3097,7 +3103,7 @@ void devlink_flash_update_begin_notify(struct devlink *devlink) ...@@ -3097,7 +3103,7 @@ void devlink_flash_update_begin_notify(struct devlink *devlink)
{ {
__devlink_flash_update_notify(devlink, __devlink_flash_update_notify(devlink,
DEVLINK_CMD_FLASH_UPDATE, DEVLINK_CMD_FLASH_UPDATE,
NULL, NULL, 0, 0); NULL, NULL, 0, 0, 0);
} }
EXPORT_SYMBOL_GPL(devlink_flash_update_begin_notify); EXPORT_SYMBOL_GPL(devlink_flash_update_begin_notify);
...@@ -3105,7 +3111,7 @@ void devlink_flash_update_end_notify(struct devlink *devlink) ...@@ -3105,7 +3111,7 @@ void devlink_flash_update_end_notify(struct devlink *devlink)
{ {
__devlink_flash_update_notify(devlink, __devlink_flash_update_notify(devlink,
DEVLINK_CMD_FLASH_UPDATE_END, DEVLINK_CMD_FLASH_UPDATE_END,
NULL, NULL, 0, 0); NULL, NULL, 0, 0, 0);
} }
EXPORT_SYMBOL_GPL(devlink_flash_update_end_notify); EXPORT_SYMBOL_GPL(devlink_flash_update_end_notify);
...@@ -3117,10 +3123,21 @@ void devlink_flash_update_status_notify(struct devlink *devlink, ...@@ -3117,10 +3123,21 @@ void devlink_flash_update_status_notify(struct devlink *devlink,
{ {
__devlink_flash_update_notify(devlink, __devlink_flash_update_notify(devlink,
DEVLINK_CMD_FLASH_UPDATE_STATUS, DEVLINK_CMD_FLASH_UPDATE_STATUS,
status_msg, component, done, total); status_msg, component, done, total, 0);
} }
EXPORT_SYMBOL_GPL(devlink_flash_update_status_notify); 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, static int devlink_nl_cmd_flash_update(struct sk_buff *skb,
struct genl_info *info) struct genl_info *info)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment