From: Jacob Keller <jacob.e.keller@intel.com> To: netdev@vger.kernel.org Cc: Jiri Pirko <jiri@resnulli.us>, Jakub Kicinski <kubakici@wp.pl>, Jacob Keller <jacob.e.keller@intel.com> Subject: [net-next 3/4] devlink: add dry run attribute to flash update Date: Fri, 8 Oct 2021 03:41:14 -0700 [thread overview] Message-ID: <20211008104115.1327240-4-jacob.e.keller@intel.com> (raw) In-Reply-To: <20211008104115.1327240-1-jacob.e.keller@intel.com> The devlink flash interface is used to request programming of a device flash chip. In some cases, a user (or script) might want to verify whether or not a device update is supported without actually committing to update the device. For example, a system administrator might want to validate that a given file will be accepted by a device driver, or may want to validate a command before finally committing to it. There currently is no good method to support this use. To do this, add a new DEVLINK_ATTR_DRY_RUN attribute. This attribute shall be used by a command to indicate that the request is just a "dry run" to verify that things will work. Ultimately, a proper dry run must be handled by device drivers, as we want to also validate things such as the flash file. Add a dry_run parameter to the devlink_flash_update_params, and an associated bit to indicate if a driver supports verifying a dry_run. If a driver does not support dry run verification, we will return -EOPNOTSUPP, but with an appropriate extended ACK message that indicates to the user that a flash update is supported. We check for the dry run attribute last in order to allow as much verification of parameters as possible. For example, even if a driver does not support dry_run, we can still validate that all of the other optional parameters such as overwrite_mask and per-component update are valid. Signed-off-by: Jacob Keller <jacob.e.keller@intel.com> --- include/net/devlink.h | 2 ++ include/uapi/linux/devlink.h | 2 ++ net/core/devlink.c | 19 ++++++++++++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/include/net/devlink.h b/include/net/devlink.h index a7852a257bf6..d67183a739cf 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -640,10 +640,12 @@ struct devlink_flash_update_params { const struct firmware *fw; const char *component; u32 overwrite_mask; + bool dry_run; }; #define DEVLINK_SUPPORT_FLASH_UPDATE_COMPONENT BIT(0) #define DEVLINK_SUPPORT_FLASH_UPDATE_OVERWRITE_MASK BIT(1) +#define DEVLINK_SUPPORT_FLASH_UPDATE_DRY_RUN BIT(2) struct devlink_region; struct devlink_info_req; diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h index b897b80770f6..d5faaa942c1b 100644 --- a/include/uapi/linux/devlink.h +++ b/include/uapi/linux/devlink.h @@ -553,6 +553,8 @@ enum devlink_attr { DEVLINK_ATTR_REGION_MAX_SNAPSHOTS, /* u32 */ + DEVLINK_ATTR_DRY_RUN, /* flag */ + /* add new attributes above here, update the policy in devlink.c */ __DEVLINK_ATTR_MAX, diff --git a/net/core/devlink.c b/net/core/devlink.c index 4917112406a0..8d11b0838a0a 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -4232,7 +4232,8 @@ EXPORT_SYMBOL_GPL(devlink_flash_update_timeout_notify); static int devlink_nl_cmd_flash_update(struct sk_buff *skb, struct genl_info *info) { - struct nlattr *nla_component, *nla_overwrite_mask, *nla_file_name; + struct nlattr *nla_component, *nla_overwrite_mask, *nla_file_name, + *nla_dry_run; struct devlink_flash_update_params params = {}; struct devlink *devlink = info->user_ptr[0]; const char *file_name; @@ -4278,6 +4279,21 @@ static int devlink_nl_cmd_flash_update(struct sk_buff *skb, return ret; } + /* Always check dry run last, in order to allow verification of other + * parameter support even if the particular driver does not yet + * support a full dry-run + */ + nla_dry_run = info->attrs[DEVLINK_ATTR_DRY_RUN]; + if (nla_dry_run) { + if (!(supported_params & DEVLINK_SUPPORT_FLASH_UPDATE_DRY_RUN)) { + NL_SET_ERR_MSG_ATTR(info->extack, nla_dry_run, + "flash update is supported, but dry run is not supported for this device"); + release_firmware(params.fw); + return -EOPNOTSUPP; + } + params.dry_run = true; + } + devlink_flash_update_begin_notify(devlink); ret = devlink->ops->flash_update(devlink, ¶ms, info->extack); devlink_flash_update_end_notify(devlink); @@ -8514,6 +8530,7 @@ static const struct nla_policy devlink_nl_policy[DEVLINK_ATTR_MAX + 1] = { [DEVLINK_ATTR_RATE_TX_MAX] = { .type = NLA_U64 }, [DEVLINK_ATTR_RATE_NODE_NAME] = { .type = NLA_NUL_STRING }, [DEVLINK_ATTR_RATE_PARENT_NODE_NAME] = { .type = NLA_NUL_STRING }, + [DEVLINK_ATTR_DRY_RUN] = { .type = NLA_FLAG }, }; static const struct genl_small_ops devlink_nl_ops[] = { -- 2.31.1.331.gb0c09ab8796f
next prev parent reply other threads:[~2021-10-08 10:42 UTC|newest] Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-10-08 10:41 [net-next 0/4] devlink: add dry run support for " Jacob Keller 2021-10-08 10:41 ` [net-next 1/4] ice: move and rename ice_check_for_pending_update Jacob Keller 2021-10-08 10:41 ` [net-next 2/4] ice: move ice_devlink_flash_update and merge with ice_flash_pldm_image Jacob Keller 2021-10-08 10:41 ` Jacob Keller [this message] 2021-10-08 10:41 ` [net-next 4/4] ice: support dry run of a flash update to validate firmware file Jacob Keller 2021-10-08 12:37 ` [net-next 0/4] devlink: add dry run support for flash update Jiri Pirko 2021-10-08 18:21 ` Jakub Kicinski 2021-10-08 21:43 ` Keller, Jacob E 2021-10-08 22:35 ` Jakub Kicinski 2021-10-08 23:58 ` Keller, Jacob E 2021-10-09 0:17 ` Jakub Kicinski 2021-10-09 0:32 ` Keller, Jacob E 2021-10-09 1:29 ` Jakub Kicinski 2022-04-25 23:05 ` Jacob Keller 2021-10-11 8:21 ` Keller, Jacob E 2021-10-11 23:21 ` Keller, Jacob E 2021-10-08 21:42 ` Keller, Jacob E
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20211008104115.1327240-4-jacob.e.keller@intel.com \ --to=jacob.e.keller@intel.com \ --cc=jiri@resnulli.us \ --cc=kubakici@wp.pl \ --cc=netdev@vger.kernel.org \ --subject='Re: [net-next 3/4] devlink: add dry run attribute to flash update' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.