devlink: add timeout information to status_notify
authorShannon Nelson <snelson@pensando.io>
Fri, 18 Sep 2020 01:13:23 +0000 (18:13 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 18 Sep 2020 20:54:22 +0000 (13:54 -0700)
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>
include/net/devlink.h
include/uapi/linux/devlink.h
net/core/devlink.c

index 48b1c1e..be132c1 100644 (file)
@@ -1403,6 +1403,10 @@ void devlink_flash_update_status_notify(struct devlink *devlink,
                                        const char *component,
                                        unsigned long done,
                                        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,
                           const struct devlink_trap *traps,
index 631f5bd..a2ecc8b 100644 (file)
@@ -462,6 +462,9 @@ enum devlink_attr {
 
        DEVLINK_ATTR_PORT_EXTERNAL,             /* u8 */
        DEVLINK_ATTR_PORT_CONTROLLER_NUMBER,    /* u32 */
+
+       DEVLINK_ATTR_FLASH_UPDATE_STATUS_TIMEOUT,       /* u64 */
+
        /* add new attributes above here, update the policy in devlink.c */
 
        __DEVLINK_ATTR_MAX,
index e5b71f3..a32e158 100644 (file)
@@ -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)
 {