From patchwork Mon Jul 25 20:56:48 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacob Keller X-Patchwork-Id: 12928416 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 097EBC433EF for ; Mon, 25 Jul 2022 20:57:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237245AbiGYU5I (ORCPT ); Mon, 25 Jul 2022 16:57:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56052 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237162AbiGYU5B (ORCPT ); Mon, 25 Jul 2022 16:57:01 -0400 Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 93BBC237CC; Mon, 25 Jul 2022 13:57:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1658782620; x=1690318620; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=0kXqfUNi/jgGvAXXtFXYbOie9+AqkuIqUlmkWyVE6ko=; b=fFrh/3Jwx8CXohulI86k5jPawm931k8fj9E3fGaIK5jPcxiy9BTp0tTM wJFAmAheu8WUUwV+d2XU7C18AqGdJJEet+0SdXIy07vATPST+l3KX/+hq 6FmHdgYyu5DolvyMfbPpTq5kQJ9FP6DFGwqAU9DLPKXeMGyT2O+O9r3/O KRwetQMw+6F0lFdODeoDzyeGa2BVZLHJX9R5vW5QwCrxADfAjMl0lvxf4 kD014Z5AzTEkuZ2hVv7pexOI/eVAsBkVcnQjwFswd9TpkYKC2yopxjj6I ZrAXLITCUPGxJOlRTWunbzRnrEEMC4hOvWxZdXj7DMnfBV+XYHpkJI3jh A==; X-IronPort-AV: E=McAfee;i="6400,9594,10419"; a="313548922" X-IronPort-AV: E=Sophos;i="5.93,193,1654585200"; d="scan'208";a="313548922" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jul 2022 13:56:58 -0700 X-IronPort-AV: E=Sophos;i="5.93,193,1654585200"; d="scan'208";a="550135508" Received: from jekeller-desk.amr.corp.intel.com ([10.166.241.7]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jul 2022 13:56:58 -0700 From: Jacob Keller To: netdev@vger.kernel.org Cc: Jacob Keller , Jonathan Corbet , Jiri Pirko , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Tony Nguyen , David Ahern , Stephen Hemminger , linux-doc@vger.kernel.org Subject: [iproute2-next v3 1/3] update UAPI header Date: Mon, 25 Jul 2022 13:56:48 -0700 Message-Id: <20220725205650.4018731-2-jacob.e.keller@intel.com> X-Mailer: git-send-email 2.37.1.208.ge72d93e88cb2 In-Reply-To: <20220725205650.4018731-1-jacob.e.keller@intel.com> References: <20220725205650.4018731-1-jacob.e.keller@intel.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: dsahern@gmail.com Signed-off-by: Jacob Keller --- include/uapi/linux/devlink.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h index da0f1ba8f7a0..90f6cf97d308 100644 --- a/include/uapi/linux/devlink.h +++ b/include/uapi/linux/devlink.h @@ -576,6 +576,14 @@ enum devlink_attr { DEVLINK_ATTR_LINECARD_TYPE, /* string */ DEVLINK_ATTR_LINECARD_SUPPORTED_TYPES, /* nested */ + /* Before adding this attribute to a command, user space should check + * the policy dump and verify the kernel recognizes the attribute. + * Otherwise older kernels which do not recognize the attribute may + * silently accept the unknown attribute while not actually performing + * a dry run. + */ + DEVLINK_ATTR_DRY_RUN, /* flag */ + /* add new attributes above here, update the policy in devlink.c */ __DEVLINK_ATTR_MAX, From patchwork Mon Jul 25 20:56:49 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacob Keller X-Patchwork-Id: 12928414 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C5AC7CCA48E for ; Mon, 25 Jul 2022 20:57:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237244AbiGYU5H (ORCPT ); Mon, 25 Jul 2022 16:57:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55706 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237172AbiGYU5B (ORCPT ); Mon, 25 Jul 2022 16:57:01 -0400 Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 93C49237D0; Mon, 25 Jul 2022 13:57:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1658782620; x=1690318620; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Ae0ouGpldVh0PyYA83lImpi7ifRfx3EPElSvc/Hfbzc=; b=VMrKaGu1dQZqEBsSufCg9ZJzQYZe+/19kuVhM002Ubdya2W4nHJgnmJi TtnwVBmBiy2WxXKfMrg6Ttv4ShkQMzjwe8O5M+fiwYuQMctREFk78tqqk jhvsrdyEYei6Y6N89Pjx3iJ6xA7lowcsj+YubYhE2peOLxcy6aZqcPXFM /n9n5eqG0OlpS/gZDK0cj9SA/rUgWQtESTiXZlWUbEc4gcE4yc7h3Rdz2 B/mVMCN1rTxBoq8kTZNze2Wqv7Oe+D01PL8HcV+Fu+5LECqAWScBVZnc5 ir9aFDUMLWNnH9eCquNy45Hwy+hz7gx5iiUFnSA+Wm1NyT1EPrRXSmFN3 g==; X-IronPort-AV: E=McAfee;i="6400,9594,10419"; a="313548923" X-IronPort-AV: E=Sophos;i="5.93,193,1654585200"; d="scan'208";a="313548923" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jul 2022 13:56:58 -0700 X-IronPort-AV: E=Sophos;i="5.93,193,1654585200"; d="scan'208";a="550135511" Received: from jekeller-desk.amr.corp.intel.com ([10.166.241.7]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jul 2022 13:56:58 -0700 From: Jacob Keller To: netdev@vger.kernel.org Cc: Jacob Keller , Jonathan Corbet , Jiri Pirko , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Tony Nguyen , David Ahern , Stephen Hemminger , linux-doc@vger.kernel.org Subject: [iproute2-next v3 2/3] mnlg: add function to get CTRL_ATTR_MAXATTR value Date: Mon, 25 Jul 2022 13:56:49 -0700 Message-Id: <20220725205650.4018731-3-jacob.e.keller@intel.com> X-Mailer: git-send-email 2.37.1.208.ge72d93e88cb2 In-Reply-To: <20220725205650.4018731-1-jacob.e.keller@intel.com> References: <20220725205650.4018731-1-jacob.e.keller@intel.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: dsahern@gmail.com Add a new function to extract the CTRL_ATTR_MAXATTR attribute of the CTRL_CMD_GETFAMILY request. This will be used to allow reading the maximum supported devlink attribute of the running kernel in an upcoming change. Signed-off-by: Jacob Keller Reviewed-by: Jiri Pirko --- devlink/mnlg.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ devlink/mnlg.h | 1 + 2 files changed, 57 insertions(+) diff --git a/devlink/mnlg.c b/devlink/mnlg.c index e6d92742c150..348c3ff5c959 100644 --- a/devlink/mnlg.c +++ b/devlink/mnlg.c @@ -41,6 +41,10 @@ struct group_info { const char *name; }; +struct family_info { + uint32_t max_attr; +}; + static int parse_mc_grps_cb(const struct nlattr *attr, void *data) { const struct nlattr **tb = data; @@ -149,6 +153,58 @@ int mnlg_socket_group_add(struct mnlu_gen_socket *nlg, const char *group_name) return 0; } +static int get_family_attr_cb(const struct nlattr *attr, void *data) +{ + const struct nlattr **tb = data; + int type = mnl_attr_get_type(attr); + + if (mnl_attr_type_valid(attr, CTRL_ATTR_MAX) < 0) + return MNL_CB_ERROR; + + tb[type] = attr; + return MNL_CB_OK; +} + +static int get_family_cb(const struct nlmsghdr *nlh, void *data) +{ + struct family_info *family = data; + struct nlattr *tb[CTRL_ATTR_MAX + 1] = {}; + struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh); + + mnl_attr_parse(nlh, sizeof(*genl), get_family_attr_cb, tb); + if (!tb[CTRL_ATTR_MAXATTR]) + return MNL_CB_ERROR; + + family->max_attr = mnl_attr_get_u32(tb[CTRL_ATTR_MAXATTR]); + + return MNL_CB_OK; +} + +int mnlg_socket_get_max_attr(struct mnlu_gen_socket *nlg, uint32_t *max_attr) +{ + struct nlmsghdr *nlh; + struct family_info family; + int err; + + nlh = _mnlu_gen_socket_cmd_prepare(nlg, CTRL_CMD_GETFAMILY, + NLM_F_REQUEST | NLM_F_ACK, + GENL_ID_CTRL, 1); + + mnl_attr_put_u16(nlh, CTRL_ATTR_FAMILY_ID, nlg->family); + + err = mnlg_socket_send(nlg, nlh); + if (err < 0) + return err; + + err = mnlu_gen_socket_recv_run(nlg, get_family_cb, &family); + if (err < 0) + return err; + + *max_attr = family.max_attr; + + return 0; +} + int mnlg_socket_get_fd(struct mnlu_gen_socket *nlg) { return mnl_socket_get_fd(nlg->nl); diff --git a/devlink/mnlg.h b/devlink/mnlg.h index 24aa17566a9b..6348ad45ed26 100644 --- a/devlink/mnlg.h +++ b/devlink/mnlg.h @@ -18,6 +18,7 @@ struct mnlu_gen_socket; int mnlg_socket_send(struct mnlu_gen_socket *nlg, const struct nlmsghdr *nlh); int mnlg_socket_group_add(struct mnlu_gen_socket *nlg, const char *group_name); +int mnlg_socket_get_max_attr(struct mnlu_gen_socket *nlg, uint32_t *max_attr); int mnlg_socket_get_fd(struct mnlu_gen_socket *nlg); #endif /* _MNLG_H_ */ From patchwork Mon Jul 25 20:56:50 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacob Keller X-Patchwork-Id: 12928417 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6F133C43334 for ; Mon, 25 Jul 2022 20:57:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236618AbiGYU5J (ORCPT ); Mon, 25 Jul 2022 16:57:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56000 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237213AbiGYU5B (ORCPT ); Mon, 25 Jul 2022 16:57:01 -0400 Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 306CE237D3; Mon, 25 Jul 2022 13:57:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1658782621; x=1690318621; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=2wfPuB58UVORdxobP+NM5sdKPHrgFABFNUa10KcLh5Y=; b=UZt4WQzA+lUVXVuT0aZTxMI7gMdGi6M8aLyx0IU1dpxbLFsYbzG74m8A Ilj4Q6iXgoL9rkMcPWVn0oG1B/IqWHc9fZTGNSALmfxzTXD1kEsgRsX8Z fPr+nQcqWlyZorEMMRL6mypWaSNCXCDvlO2WkQZSu9+AlB6uGSgCCEoFk njW8CzOVRDmIH2qdPHzoUogom4E/tiYWlNFHgZ4XTsDhGilpa9mh/z6Q3 DNhtmJO5hDxTGJQXAMgT8Ub6jrjIVJbxoo7HcNPsw8skj1lNUq4Mr7WYQ 40EXq+Tf5a0evotYgaiJHeiRaTfQvkFKTkwTs3BqLOmqQmyQ1urxZuS+v g==; X-IronPort-AV: E=McAfee;i="6400,9594,10419"; a="313548924" X-IronPort-AV: E=Sophos;i="5.93,193,1654585200"; d="scan'208";a="313548924" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jul 2022 13:56:59 -0700 X-IronPort-AV: E=Sophos;i="5.93,193,1654585200"; d="scan'208";a="550135514" Received: from jekeller-desk.amr.corp.intel.com ([10.166.241.7]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jul 2022 13:56:58 -0700 From: Jacob Keller To: netdev@vger.kernel.org Cc: Jacob Keller , Jonathan Corbet , Jiri Pirko , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Tony Nguyen , David Ahern , Stephen Hemminger , linux-doc@vger.kernel.org Subject: [iproute2-next v3 3/3] devlink: add dry run attribute support to devlink flash Date: Mon, 25 Jul 2022 13:56:50 -0700 Message-Id: <20220725205650.4018731-4-jacob.e.keller@intel.com> X-Mailer: git-send-email 2.37.1.208.ge72d93e88cb2 In-Reply-To: <20220725205650.4018731-1-jacob.e.keller@intel.com> References: <20220725205650.4018731-1-jacob.e.keller@intel.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: dsahern@gmail.com Recent versions of the kernel support the DEVLINK_ATTR_DRY_RUN attribute which allows requesting a dry run of a command. A dry run is simply a request to validate that a command would work, without performing any destructive changes. The attribute is supported by the devlink flash update as a way to validate an update, including potentially the binary image, without modifying the device. Add a "dry_run" option to the command line parsing which will enable this attribute when requested. To avoid potential issues, only allow the attribute to be added to commands when the kernel recognizes it. This is important because some commands do not perform strict validation. If we were to add the attribute without this check, an old kernel may silently accept the command and perform an update even when dry_run was requested. Before adding the attribute, check the maximum attribute from the CTRL_CMD_GETFAMILY and make sure that the kernel recognizes the DEVLINK_ATTR_DRY_RUN attribute. Signed-off-by: Jacob Keller Reviewed-by: Jiri Pirko --- Changes since v2 * Remove unnecessary () with return * Reduce indentation of dl_get_max_attr devlink/devlink.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/devlink/devlink.c b/devlink/devlink.c index 1e2cfc3d4285..343ad98d9c7f 100644 --- a/devlink/devlink.c +++ b/devlink/devlink.c @@ -296,6 +296,7 @@ static void ifname_map_free(struct ifname_map *ifname_map) #define DL_OPT_PORT_FN_RATE_PARENT BIT(51) #define DL_OPT_LINECARD BIT(52) #define DL_OPT_LINECARD_TYPE BIT(53) +#define DL_OPT_DRY_RUN BIT(54) struct dl_opts { uint64_t present; /* flags of present items */ @@ -372,6 +373,8 @@ struct dl { bool verbose; bool stats; bool hex; + bool max_attr_valid; + uint32_t max_attr; struct { bool present; char *bus_name; @@ -701,6 +704,7 @@ static const enum mnl_attr_data_type devlink_policy[DEVLINK_ATTR_MAX + 1] = { [DEVLINK_ATTR_LINECARD_STATE] = MNL_TYPE_U8, [DEVLINK_ATTR_LINECARD_TYPE] = MNL_TYPE_STRING, [DEVLINK_ATTR_LINECARD_SUPPORTED_TYPES] = MNL_TYPE_NESTED, + [DEVLINK_ATTR_DRY_RUN] = MNL_TYPE_FLAG, }; static const enum mnl_attr_data_type @@ -1522,6 +1526,31 @@ static int dl_args_finding_required_validate(uint64_t o_required, return 0; } +static void dl_get_max_attr(struct dl *dl) +{ + uint32_t max_attr; + int err; + + if (dl->max_attr_valid) + return; + + err = mnlg_socket_get_max_attr(&dl->nlg, &max_attr); + if (err) { + pr_err("Unable to determine maximum supported devlink attribute\n"); + return; + } + + dl->max_attr = max_attr; + dl->max_attr_valid = true; +} + +static bool dl_kernel_supports_attr(struct dl *dl, enum devlink_attr attr) +{ + dl_get_max_attr(dl); + + return dl->max_attr_valid && dl->max_attr >= attr; +} + static int dl_argv_parse(struct dl *dl, uint64_t o_required, uint64_t o_optional) { @@ -2037,6 +2066,16 @@ static int dl_argv_parse(struct dl *dl, uint64_t o_required, dl_arg_inc(dl); opts->linecard_type = ""; o_found |= DL_OPT_LINECARD_TYPE; + } else if (dl_argv_match(dl, "dry_run") && + (o_all & DL_OPT_DRY_RUN)) { + + if (!dl_kernel_supports_attr(dl, DEVLINK_ATTR_DRY_RUN)) { + pr_err("Kernel does not support dry_run attribute\n"); + return -EOPNOTSUPP; + } + + dl_arg_inc(dl); + o_found |= DL_OPT_DRY_RUN; } else { pr_err("Unknown option \"%s\"\n", dl_argv(dl)); return -EINVAL; @@ -2115,6 +2154,8 @@ static void dl_opts_put(struct nlmsghdr *nlh, struct dl *dl) mnl_attr_put_strz(nlh, DEVLINK_ATTR_RATE_NODE_NAME, opts->rate_node_name); } + if (opts->present & DL_OPT_DRY_RUN) + mnl_attr_put(nlh, DEVLINK_ATTR_DRY_RUN, 0, NULL); if (opts->present & DL_OPT_PORT_TYPE) mnl_attr_put_u16(nlh, DEVLINK_ATTR_PORT_TYPE, opts->port_type); @@ -2326,7 +2367,7 @@ static void cmd_dev_help(void) pr_err(" devlink dev reload DEV [ netns { PID | NAME | ID } ]\n"); pr_err(" [ action { driver_reinit | fw_activate } ] [ limit no_reset ]\n"); pr_err(" devlink dev info [ DEV ]\n"); - pr_err(" devlink dev flash DEV file PATH [ component NAME ] [ overwrite SECTION ]\n"); + pr_err(" devlink dev flash DEV file PATH [ component NAME ] [ overwrite SECTION ] [ dry_run ]\n"); } static bool cmp_arr_last_handle(struct dl *dl, const char *bus_name, @@ -3886,7 +3927,8 @@ static int cmd_dev_flash(struct dl *dl) NLM_F_REQUEST | NLM_F_ACK); err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE | DL_OPT_FLASH_FILE_NAME, - DL_OPT_FLASH_COMPONENT | DL_OPT_FLASH_OVERWRITE); + DL_OPT_FLASH_COMPONENT | DL_OPT_FLASH_OVERWRITE | + DL_OPT_DRY_RUN); if (err) return err;