From nobody Sat Jun 13 16:18:04 2026 Received: from BN1PR04CU002.outbound.protection.outlook.com (mail-eastus2azon11010041.outbound.protection.outlook.com [52.101.56.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 22B9444CAEA; Wed, 6 May 2026 12:38:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.56.41 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778071103; cv=fail; b=tFCjGUjtysmcE+uXZU0ETs+3XsF7tUSGePQTCVKUep8R8fPARx5ZhvfX3Og2b6EnyfV6Y++A8TUldtwZKKhkAAHytlxIMdaSstuCHJGj0XHuDN/uxig9QAEphtDKGYubK8dH0t39Ranl93oSHIAmnf800SjZ/8eIl5IFifqLtak= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778071103; c=relaxed/simple; bh=jp3dwMf6lSr5WmW7GBvzVTX06EQKAgTwrXGIAFOqYRc=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=NCrMLDZWHurpsHFj2zSBPmnv+/TLDTb283/y3pqqyJEHAWHgw/ti6qHiyaqCEPZQGuWOTLmlJSbwrRYcIW7mGF7ZI78AG3m/9I+Ts2uyEy+ME+HQ4q7yrIT0Ty5eogNkWCf6LSLSZhv7rjIgShpslZJ+TzxPvh/ikGo6l7+HYRo= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=oC0B5Cq6; arc=fail smtp.client-ip=52.101.56.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="oC0B5Cq6" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=UG5N+eWec44sOt6Po1tDmuOB7A2T3366Dyd57jJBh1P8VRrRFI/Y+af3cq4HdOU1OTFEirqthBWUFs3mIGm0oU2PhKZNbmZF9RIro2l65kVefDhzf13JfHcAasttRD+jm7SPBNw+TlZMb+YqlJsprkuNnjZyp9SioQHXAM9i2KeEPr1RMbdP8k25PDWXaietIimjs0m9H6JH8iI51GZAgC/DTnkbJqEZYxoXfEexWBQ6hDJTBWLiylROw4xE1L/d74+ZmUp0KexHkJTFSFXn5FJ73AURrZLnTYsuWwnh7PJPu4txOows7ZFYkU37jmEWCRgS+jxfwSrPXvazIYInaQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=wCFjqirzR/MVwFdeN3qYegdm+mHUEGji9uAHiU6AaRw=; b=qsOrZtkrmUEvhSQin+M4c4Ql8nKJB2gS1DSsTpeufK1HdKXluLlDbIvNbLC4AoVOQgwyTi3jP3ixuYLgVP00DWEk/lUU9hARp5LhDZwbKZmmC6VQ2xOCihTTuAEQOID9DugBt/ESkE2vf5FUOvJSRXUol8hOPL2C4G4vshh2x6K2jyNHd+DQRMLQJ5UE5Ka7FCUIHACWndB1xAsdw/lV+SKCd0GyxIc2XTFPa9EQfFdDb4ayS0NBpHfYorkrJKYey5T/oDwf6ro4cas+LOzRnxHR5KOQ4Od2CRKgp7zMmrXST/2gCwX4TKaoViIAJt+2n29mxW53+3wC7RZEwQ7cVg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.118.233) smtp.rcpttodomain=google.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=wCFjqirzR/MVwFdeN3qYegdm+mHUEGji9uAHiU6AaRw=; b=oC0B5Cq60dcrLapUYCUKo/gNlE4oxu6rWTsJhPoQ3lZ7cFlr9MMNcfHf5nhm/xF9kBHlh0gcZCN9IaGe2Vc9lK4pHvm8d4NxCIudwQdMVtX9OG9rN9Zfs0qYSX8oF1B3J3rozaCM2JHl/Q4zvvhA5tynwAXKIaC8jr9JVTIWpqTHnXa1uOGJP5fznH/MuAUZAYmv33fOyJfQOSq2ANDut3Y1g+73K0MFuo0rbXYMqlZK+XkZxekrPxr+OZVMqmKsNpAS1fwSYMhtXBOcx44B+ghXOIzQBOHaIRK7f2KtqUSNAQ/gsUpFXAkjmckuWp/kkMFTej5VvkxnvVpsHt59PA== Received: from SJ0PR03CA0275.namprd03.prod.outlook.com (2603:10b6:a03:39e::10) by SA0PR12MB4350.namprd12.prod.outlook.com (2603:10b6:806:92::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.15; Wed, 6 May 2026 12:38:11 +0000 Received: from CO1PEPF000075F2.namprd03.prod.outlook.com (2603:10b6:a03:39e:cafe::18) by SJ0PR03CA0275.outlook.office365.com (2603:10b6:a03:39e::10) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9891.15 via Frontend Transport; Wed, 6 May 2026 12:38:10 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.118.233) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.118.233 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.118.233; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.118.233) by CO1PEPF000075F2.mail.protection.outlook.com (10.167.249.41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.9 via Frontend Transport; Wed, 6 May 2026 12:38:10 +0000 Received: from drhqmail201.nvidia.com (10.126.190.180) by mail.nvidia.com (10.127.129.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 6 May 2026 05:37:58 -0700 Received: from drhqmail201.nvidia.com (10.126.190.180) by drhqmail201.nvidia.com (10.126.190.180) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 6 May 2026 05:37:58 -0700 Received: from vdi.nvidia.com (10.127.8.10) by mail.nvidia.com (10.126.190.180) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 6 May 2026 05:37:50 -0700 From: Mark Bloch To: Eric Dumazet , Jakub Kicinski , Paolo Abeni , Andrew Lunn , "David S. Miller" CC: Jonathan Corbet , Shuah Khan , Jiri Pirko , Simon Horman , "Saeed Mahameed" , Leon Romanovsky , Tariq Toukan , Mark Bloch , Andrew Morton , "Borislav Petkov (AMD)" , "Randy Dunlap" , Dave Hansen , Christian Brauner , Petr Mladek , "Peter Zijlstra (Intel)" , Thomas Gleixner , Pawan Gupta , Dapeng Mi , Kees Cook , Marco Elver , Eric Biggers , Li RongQing , "Paul E. McKenney" , , , , Subject: [RFC net-next 1/4] devlink: Add infrastructure for boot-time defaults Date: Wed, 6 May 2026 15:37:36 +0300 Message-ID: <20260506123739.1959770-2-mbloch@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260506123739.1959770-1-mbloch@nvidia.com> References: <20260506123739.1959770-1-mbloch@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1PEPF000075F2:EE_|SA0PR12MB4350:EE_ X-MS-Office365-Filtering-Correlation-Id: 94108739-7db3-4fff-5ab2-08deab6c553f X-LD-Processed: 43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|82310400026|36860700016|1800799024|18002099003|22082099003|56012099003; X-Microsoft-Antispam-Message-Info: 5fIa3Pu30YSNurz7Sk8t67S623EWmTBWmcoZAIpm8NTgRP/R2tqUbLkM6n+mWydy00z2lTMHUDFVlWaZHkNFZ2kMi64DCrARbecAQcEIoDYssS2XInCOalpBZp5niD1EU/b1Ns8zIAFBYB14LKqKGEALuzXwXq0vAxA3Iw2Vfsmlqlc85K3/6M9n1u471rmUp947vXTx7DTQmfdroBnikRwMLr9Ara0pJBtdk5uLTje7oGaqiNn2XY1JlWceDhh4z+6pSwh6HTFx2e6YgJnqDza6bruvb155n7XTs0M7USeW+ogDWZ0nli5wq8dkX2sRnT7vc3v1llRoT2RrY1PGyeEVZ5RjlH+6rx9TiftMER3vhvRGe7vINVWlJ1gOINIsTP4rg8XaeRfnHGB7tO9+MVc7mq2TSKVPLhv/T5W9R+sUE+/kPCEv0beR8r96gruKNKB01nI46SGWjUG8Q8AK9ECQm0J5bkrD1kprHtQvFTMKhM+OISq3QOXINa1c83PZkzb1Xq5Gym3Ty6UY33WWYcCjdL2bkw8Z+g4U4kjQWo/tAXSKlCeVpdgVSRrfV4YyXV8oybIEvGo+woyzDTpCXF8ImpvXaBcM4Aqpse805ue2o8w2IG8ZkdrshGNLykJV3DQRwFGzJ1/tx/IWdztzLtSh/swIiwgjqPzWJQtzmj1Yt0JU2T+2oWM2bj0TY43kQpkNN203wniOgkmGrvnRcH8d84aoCc1DnsofjYuUGcw= X-Forefront-Antispam-Report: CIP:216.228.118.233;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc7edge2.nvidia.com;CAT:NONE;SFS:(13230040)(376014)(7416014)(82310400026)(36860700016)(1800799024)(18002099003)(22082099003)(56012099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 89GB8LUm0gLten7MUEJSp8PxfDHznspb0tmgvF131n7BQRd0g/JmSnq2cJd8ztZdL6cCNp6fQ4edRZ1aSkZpaWt1tUKVQaJuCk83/pgrOIRFbwqXZrL0eBYT4CPwHKlSiwtdW0QV3Hazh4gvrr4kx0KmPwYUdBllFE0Wd/uj94MuL2jS1PgPe7ooV6tnCerqpLbTH9ReptznWSkCJqFaKGdHgGo5BQZd+OcsMEqgIY6RGDXBQgv77a6m7/NZHM11AU34W2lXp+h109Id7LFi4WDbNHjZ8cEbSMZ4TVE9ZpdmhCMOubJUeDc7w26nqxCRQfrDY6Q0w4cj2lN06ec7E2UViBcwKUe2DaCnvGu3p4MRzYmBMk+aQZ/IVxa5DOYjwruap7mkT2ALur9Pnsukn3MLf9Q/hli2T7wxd9drdLxT+1o9S6PAZznhpvP/ClAG X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 May 2026 12:38:10.7639 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 94108739-7db3-4fff-5ab2-08deab6c553f X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.118.233];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CO1PEPF000075F2.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA0PR12MB4350 Content-Type: text/plain; charset="utf-8" Add generic devlink boot-default infrastructure driven by the devlink=3D kernel command line parameter. The parser stores defaults per devlink handle using the same bus/device handle format exposed by devlink. Each handle keeps an ordered list of parsed commands so that defaults can later be applied in command-line order when the matching devlink instance is initialized. This commit only adds the generic parsing, storage, duplicate handling and devl_apply_defaults() API. Concrete default commands are added in later commits. Signed-off-by: Mark Bloch --- include/net/devlink.h | 1 + net/devlink/core.c | 441 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 442 insertions(+) diff --git a/include/net/devlink.h b/include/net/devlink.h index bcd31de1f890..058654d6800f 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -1622,6 +1622,7 @@ int devl_trylock(struct devlink *devlink); void devl_unlock(struct devlink *devlink); void devl_assert_locked(struct devlink *devlink); bool devl_lock_is_held(struct devlink *devlink); +int devl_apply_defaults(struct devlink *devlink); DEFINE_GUARD(devl, struct devlink *, devl_lock(_T), devl_unlock(_T)); =20 struct ib_device; diff --git a/net/devlink/core.c b/net/devlink/core.c index eeb6a71f5f56..2421a1f8dbb7 100644 --- a/net/devlink/core.c +++ b/net/devlink/core.c @@ -4,6 +4,11 @@ * Copyright (c) 2016 Jiri Pirko */ =20 +#include +#include +#include +#include +#include #include #define CREATE_TRACE_POINTS #include @@ -16,6 +21,418 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(devlink_trap_report); =20 DEFINE_XARRAY_FLAGS(devlinks, XA_FLAGS_ALLOC); =20 +static char *devlink_default; +static LIST_HEAD(devlink_default_nodes); + +struct devlink_default_attr_item { + enum devlink_attr attr; + union { + enum devlink_eswitch_mode eswitch_mode; + struct { + char *name; + char *value; + } param; + } value; +}; + +struct devlink_default_cmd_item { + struct list_head list; + enum devlink_command cmd; + int (*run)(struct devlink *devlink, + const struct devlink_default_attr_item *attr); + struct devlink_default_attr_item attr; +}; + +struct devlink_default_node { + struct list_head list; + char *bus_name; + char *dev_name; + struct list_head cmd_list; +}; + +struct devlink_default_cmd_spec { + const char *name; + enum devlink_command cmd; + int (*run)(struct devlink *devlink, + const struct devlink_default_attr_item *attr); + int (*attr_parse)(char *str, + struct devlink_default_attr_item *attr_item); +}; + +static int __init +devlink_default_node_add(const char *bus_name, const char *dev_name, + const char *cmd); + +static void __init +devlink_default_attr_free(struct devlink_default_attr_item *attr) +{ + if (attr->attr !=3D DEVLINK_ATTR_PARAM) + return; + + kfree(attr->value.param.name); + kfree(attr->value.param.value); +} + +static const struct devlink_default_cmd_spec *__init +devlink_default_cmd_spec_find(const char *name) +{ + return NULL; +} + +static int __init +devlink_default_cmd_parse(char *str, + struct devlink_default_cmd_item *cmd_item) +{ + const struct devlink_default_cmd_spec *spec; + struct devlink_default_attr_item attr_item =3D {}; + char *cmd_name; + int err; + + cmd_name =3D strsep(&str, ":"); + if (!cmd_name || !*cmd_name || !str || !*str) + return -EINVAL; + + spec =3D devlink_default_cmd_spec_find(cmd_name); + if (!spec) + return -EINVAL; + + err =3D spec->attr_parse(str, &attr_item); + if (err) { + devlink_default_attr_free(&attr_item); + return err; + } + if (cmd_item) { + cmd_item->cmd =3D spec->cmd; + cmd_item->run =3D spec->run; + cmd_item->attr =3D attr_item; + } else { + devlink_default_attr_free(&attr_item); + } + + return 0; +} + +static int __init +devlink_default_cmd_parse_copy(const char *str, + struct devlink_default_cmd_item *cmd_item) +{ + char *cmd; + int err; + + cmd =3D kstrdup(str, GFP_KERNEL); + if (!cmd) + return -ENOMEM; + + err =3D devlink_default_cmd_parse(cmd, cmd_item); + kfree(cmd); + return err; +} + +static int __init +devlink_default_handle_parse(char *handle, char **bus_name, char **dev_nam= e) +{ + char *slash; + char *p; + + if (!handle || !*handle) + return -EINVAL; + + for (p =3D handle; *p; p++) { + if (isspace(*p)) + return -EINVAL; + if (*p =3D=3D '[' || *p =3D=3D ']') + return -EINVAL; + } + + slash =3D strchr(handle, '/'); + if (!slash || slash =3D=3D handle || !slash[1]) + return -EINVAL; + if (strchr(slash + 1, '/')) + return -EINVAL; + + *slash =3D '\0'; + if (strchr(handle, ':')) + return -EINVAL; + + *bus_name =3D handle; + *dev_name =3D slash + 1; + return 0; +} + +static int __init +devlink_default_entry_parse(char *entry, bool store) +{ + char *handles_end; + char *handles; + char *handle; + char *cmd; + int err; + + if (!entry || *entry !=3D '[') + return -EINVAL; + + handles =3D entry + 1; + handles_end =3D strchr(handles, ']'); + if (!handles_end || handles_end[1] !=3D ':' || !handles_end[2]) + return -EINVAL; + + *handles_end =3D '\0'; + cmd =3D handles_end + 2; + if (!*handles) + return -EINVAL; + + while ((handle =3D strsep(&handles, ",")) !=3D NULL) { + char *bus_name; + char *dev_name; + + err =3D devlink_default_handle_parse(handle, &bus_name, + &dev_name); + if (err) + return err; + + if (!store) + continue; + + err =3D devlink_default_node_add(bus_name, dev_name, cmd); + if (err) + return err; + } + + return 0; +} + +static void __init +devlink_default_cmd_item_free(struct devlink_default_cmd_item *cmd) +{ + devlink_default_attr_free(&cmd->attr); + kfree(cmd); +} + +static void __init devlink_default_node_free(struct devlink_default_node *= node) +{ + struct devlink_default_cmd_item *cmd; + struct devlink_default_cmd_item *cmd_tmp; + + list_for_each_entry_safe(cmd, cmd_tmp, &node->cmd_list, list) { + list_del(&cmd->list); + devlink_default_cmd_item_free(cmd); + } + + kfree(node->bus_name); + kfree(node->dev_name); + kfree(node); +} + +static void __init devlink_default_nodes_clear(void) +{ + struct devlink_default_node *node; + struct devlink_default_node *node_tmp; + + list_for_each_entry_safe(node, node_tmp, &devlink_default_nodes, list) { + list_del(&node->list); + devlink_default_node_free(node); + } +} + +static struct devlink_default_node *__init +devlink_default_node_find(const char *bus_name, const char *dev_name) +{ + struct devlink_default_node *node; + + list_for_each_entry(node, &devlink_default_nodes, list) { + if (!strcmp(node->bus_name, bus_name) && + !strcmp(node->dev_name, dev_name)) + return node; + } + + return NULL; +} + +static bool __init +devlink_default_cmd_equal(const struct devlink_default_cmd_item *a, + const struct devlink_default_cmd_item *b) +{ + if (a->cmd !=3D b->cmd || a->attr.attr !=3D b->attr.attr) + return false; + + return true; +} + +static bool __init +devlink_default_cmd_exists(struct devlink_default_node *node, + const struct devlink_default_cmd_item *cmd) +{ + struct devlink_default_cmd_item *cmd_item; + + list_for_each_entry(cmd_item, &node->cmd_list, list) { + if (devlink_default_cmd_equal(cmd_item, cmd)) + return true; + } + + return false; +} + +static int __init +devlink_default_cmd_item_add(struct devlink_default_node *node, + const char *cmd_str) +{ + struct devlink_default_cmd_item *cmd; + int err; + + cmd =3D kzalloc_obj(*cmd); + if (!cmd) + return -ENOMEM; + + INIT_LIST_HEAD(&cmd->list); + err =3D devlink_default_cmd_parse_copy(cmd_str, cmd); + if (err) { + devlink_default_cmd_item_free(cmd); + return err; + } + + if (devlink_default_cmd_exists(node, cmd)) { + devlink_default_cmd_item_free(cmd); + return -EEXIST; + } + + list_add_tail(&cmd->list, &node->cmd_list); + return 0; +} + +static int __init +devlink_default_node_add(const char *bus_name, const char *dev_name, + const char *cmd_str) +{ + struct devlink_default_node *node; + int err; + + node =3D devlink_default_node_find(bus_name, dev_name); + if (node) + return devlink_default_cmd_item_add(node, cmd_str); + + node =3D kzalloc_obj(*node); + if (!node) + return -ENOMEM; + + INIT_LIST_HEAD(&node->list); + INIT_LIST_HEAD(&node->cmd_list); + node->bus_name =3D kstrdup(bus_name, GFP_KERNEL); + node->dev_name =3D kstrdup(dev_name, GFP_KERNEL); + if (!node->bus_name || !node->dev_name) { + err =3D -ENOMEM; + goto err_free_node; + } + + err =3D devlink_default_cmd_item_add(node, cmd_str); + if (err) + goto err_free_node; + + list_add_tail(&node->list, &devlink_default_nodes); + return 0; + +err_free_node: + devlink_default_node_free(node); + return err; +} + +static int __init devlink_default_parse(char *str, bool store) +{ + char *entry =3D str; + int err; + + if (!str || !*str) + return -EINVAL; + + while (entry) { + char *handles_end; + char *cmd_start; + char *entry_end; + + if (*entry !=3D '[') { + err =3D -EINVAL; + goto err_clear; + } + + handles_end =3D strchr(entry + 1, ']'); + if (!handles_end || handles_end[1] !=3D ':') { + err =3D -EINVAL; + goto err_clear; + } + + cmd_start =3D handles_end + 2; + entry_end =3D strchr(cmd_start, ','); + if (entry_end) + *entry_end =3D '\0'; + + err =3D devlink_default_entry_parse(entry, store); + if (err) + goto err_clear; + if (!entry_end) + return 0; + + entry =3D entry_end + 1; + if (!*entry) { + err =3D -EINVAL; + goto err_clear; + } + } + + return 0; + +err_clear: + if (store) + devlink_default_nodes_clear(); + return err; +} + +static int devlink_default_node_apply(struct devlink *devlink, + const struct devlink_default_node *node) +{ + const struct devlink_default_cmd_item *cmd; + int err; + + list_for_each_entry(cmd, &node->cmd_list, list) { + err =3D cmd->run(devlink, &cmd->attr); + if (err) + return err; + } + + return 0; +} + +/** + * devl_apply_defaults - Apply defaults matching the devlink instance + * @devlink: devlink + * + * The caller must hold the devlink instance lock. + */ +int devl_apply_defaults(struct devlink *devlink) +{ + const char *bus_name =3D devlink_bus_name(devlink); + const char *dev_name =3D devlink_dev_name(devlink); + struct devlink_default_node *node; + + devl_assert_locked(devlink); + + list_for_each_entry(node, &devlink_default_nodes, list) { + if (strcmp(node->bus_name, bus_name) || + strcmp(node->dev_name, dev_name)) + continue; + + return devlink_default_node_apply(devlink, node); + } + + return 0; +} +EXPORT_SYMBOL_GPL(devl_apply_defaults); + +static int __init devlink_default_setup(char *str) +{ + devlink_default =3D str; + return 1; +} +__setup("devlink=3D", devlink_default_setup); + static struct devlink *devlinks_xa_get(unsigned long index) { struct devlink *devlink; @@ -578,6 +995,27 @@ static int __init devlink_init(void) { int err; =20 + if (devlink_default) { + char *def; + + def =3D kstrdup(devlink_default, GFP_KERNEL); + if (!def) { + err =3D -ENOMEM; + goto out; + } + err =3D devlink_default_parse(def, true); + kfree(def); + if (err =3D=3D -EEXIST) { + devlink_default =3D NULL; + pr_warn("devlink: duplicate defaults ignored\n"); + } else if (err =3D=3D -EINVAL) { + devlink_default =3D NULL; + pr_warn("devlink: invalid command line parameter ignored\n"); + } else if (err) { + goto out; + } + } + err =3D register_pernet_subsys(&devlink_pernet_ops); if (err) goto out; @@ -593,7 +1031,10 @@ static int __init devlink_init(void) out_unreg_pernet_subsys: unregister_pernet_subsys(&devlink_pernet_ops); out: + if (err) + devlink_default_nodes_clear(); WARN_ON(err); + return err; } =20 --=20 2.34.1 From nobody Sat Jun 13 16:18:04 2026 Received: from SN4PR2101CU001.outbound.protection.outlook.com (mail-southcentralusazon11012020.outbound.protection.outlook.com [40.93.195.20]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 83BE542188E; Wed, 6 May 2026 12:38:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.195.20 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778071117; cv=fail; b=o4sUXvC9qGG1y6l5ILayz1zUrrdNqg11KPV401jFyooLMKzqkXdwwps0ep17VWYwfPYM+usb6DKv+k3V7Hrbr5m7RbYf5gzlepb2sl/MpRnOfAI+LyPXrEMAIFPobyCzUiTfbQXAKGCSt2W3pKZddw2WPH8AHCJnNSKEcti41ew= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778071117; c=relaxed/simple; bh=0PndnJKL62sdoY3Zj5OmkE6eI7pqD0OeEGjSEyjrD7A=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=HB8aE8DG0XO2OwlGfojaPcMRBv9kyayNNzkB7ARGhnAYHORShVeG2syFTE/tq4OVNi6d/rc0nUxZ1G1raI4km/gHEVaLFct/xcYeOFP9PqYHt8wbu/SxjV+SymjcpQoVq5eAfxQZbRPumGE/kPrZjlEleFM9yhbQy1F9cVfJHLM= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=TlsboGQ4; arc=fail smtp.client-ip=40.93.195.20 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="TlsboGQ4" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=G8WQwH51Kfc0LNTZX8zNpCMoT3R9zFWepLgQiF9zQRgtXH6Ak1GOABYtpdh5z4T6IXTnmylodn7R+dl8FI5RvjA9nZMaL4nRzrhz4KvqHUe7FVo0iP4ukZ/YK5Ihl9ORpoiyN7BuXkBCwd0I7uRwAHUOx+z8mbrZ4Luo2/Q2mG9aGsl0Yq8USKKFjmO+ctiZHH9mpYqDbFWoIBxRLi1IYbBiU2qWK0AGR4DFI88lBoDH/ISHDP2kBrL0zNqyN8eKRSNie0EFCGceMUgBjrK55wG3VOQnFOE1cFiDCD4EbBfW0pBwjIPzeU2zibqAr2rSNe4OXbOM5yULrmU1Acaubg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=c5/XPFBoilXxXUItF51S0MTXsvTro8BRqOTHCc8eu08=; b=hpzGyy67TaTywZl4+/Bd/jKtH1A6EQRn5soboKm6HqOChiHoOjhHPzbpkzVNhNsM+ZWUgxVJQyXOJhiltRVhvyhE4S5zRCts5sYckjOqbjA61ZHLbxXUljK2N3kg/Bs916n7QN9qzPgknV7jrj/xPJK7PtS/vLp8LsLePnYF4WZg9fa20LQKCdESmwZKCkPzc5+zOBNsCvovapGf+g9rAOc7cV1rMiCq3EP8Tvidtvl7S2E5k5sboy3dhs2WKPM3oIRmBnlyBvkwfhoMeSbsUeD5dp11UB1JKgiwGV7jW3NQNBkZsesCWtXB+K6dfYlDoYq9BA8RZEaCSvCFRk54jQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.118.232) smtp.rcpttodomain=google.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=c5/XPFBoilXxXUItF51S0MTXsvTro8BRqOTHCc8eu08=; b=TlsboGQ4ug1J8cr+i1hqk/RCaoR3gV2ji4AOnaLzmHLNEGiGA/nlTA+jImfWLAJl+LhsVA4gZUhsTIaH6NR4b5rFLRHLrcXzreQgn3QA7yv+ID6jp46VOure70phoBlW0dLtAaaxV/9ypDDKErpfUcGvwJVTsGU3/cXm46ReqXPrpkYbSpuHf0Av6LWqIjegf9KAi4eXQHq2zvwJACifyFE92dAmJU5aUlWOmJXJ0bUQfapp0NMGzVppNSsObV1PhI1VBCy8cwVIEdPekgFI0bm87aVgu11blDJr0AIHoYaQT87fAYL2VuAx4cEgF2QqjtOTQRu4kU8lzsux5dQNBg== Received: from SJ0PR03CA0096.namprd03.prod.outlook.com (2603:10b6:a03:333::11) by BL3PR12MB6644.namprd12.prod.outlook.com (2603:10b6:208:3b1::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.15; Wed, 6 May 2026 12:38:23 +0000 Received: from CO1PEPF00012E60.namprd05.prod.outlook.com (2603:10b6:a03:333:cafe::df) by SJ0PR03CA0096.outlook.office365.com (2603:10b6:a03:333::11) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9870.27 via Frontend Transport; Wed, 6 May 2026 12:38:23 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.118.232) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.118.232 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.118.232; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.118.232) by CO1PEPF00012E60.mail.protection.outlook.com (10.167.249.69) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.9 via Frontend Transport; Wed, 6 May 2026 12:38:22 +0000 Received: from drhqmail203.nvidia.com (10.126.190.182) by mail.nvidia.com (10.127.129.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 6 May 2026 05:38:06 -0700 Received: from drhqmail201.nvidia.com (10.126.190.180) by drhqmail203.nvidia.com (10.126.190.182) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 6 May 2026 05:38:06 -0700 Received: from vdi.nvidia.com (10.127.8.10) by mail.nvidia.com (10.126.190.180) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 6 May 2026 05:37:58 -0700 From: Mark Bloch To: Eric Dumazet , Jakub Kicinski , Paolo Abeni , Andrew Lunn , "David S. Miller" CC: Jonathan Corbet , Shuah Khan , Jiri Pirko , Simon Horman , "Saeed Mahameed" , Leon Romanovsky , Tariq Toukan , Mark Bloch , Andrew Morton , "Borislav Petkov (AMD)" , "Randy Dunlap" , Dave Hansen , Christian Brauner , Petr Mladek , "Peter Zijlstra (Intel)" , Thomas Gleixner , Pawan Gupta , Dapeng Mi , Kees Cook , Marco Elver , Eric Biggers , Li RongQing , "Paul E. McKenney" , , , , Subject: [RFC net-next 2/4] devlink: Add eswitch mode boot default Date: Wed, 6 May 2026 15:37:37 +0300 Message-ID: <20260506123739.1959770-3-mbloch@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260506123739.1959770-1-mbloch@nvidia.com> References: <20260506123739.1959770-1-mbloch@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1PEPF00012E60:EE_|BL3PR12MB6644:EE_ X-MS-Office365-Filtering-Correlation-Id: a8b23a8e-a182-433f-c974-08deab6c5c87 X-LD-Processed: 43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|1800799024|82310400026|7416014|36860700016|18002099003|56012099003|22082099003; X-Microsoft-Antispam-Message-Info: uF4Ve2se+7MqESP672fndbJqco/yWbBnl6JjFIgKbXXRV06MrnP0gJV+gSOGQQiWibAJQ8FoOasw6PBejbwc5/waTd6SSDsZwm7uQU7+xHM4HzL1/LN3sFomGTx9uxo1OmQX6beTR1W7V3Ammj14/1shC+KMwIQrMI8YYqEHCXTEiX9kDkHNK9KLF4gO7NceTcaEqvZFpXDMXtVy4eibJ0EEs2tBl4g80LwdKMz+YUmksfzeoOYKKMCiqefjigK/8WwO7LXvavGynxprwYF3wmCbHixzDURf3vl71lIAZEplpL3lUWY+8e5ejZiXL1HSqLKz9v6tBEI7MlWcPuNrOa3tRvzZ785O+B4UY1/pP+4JCbPrEW9Ki7XHYKk+cdkEXELvUvLwoMaSRNkgxLWAnkI07/M69tV5084r0VXc0uKVbMjQB1C+lcqvrvvyAaWw2GYeY+6/cYrccB08C0nnuKyGRR3aRGFQGn0DP7l49VSu5atqTkqpD/mlm/BMKwv2Uj0zzY+2Gx7bLuqQbxEtmOx7SRSLtaCH1c/MWiIzOJyidkKyFedGOmAQEvwbmTvCezGFtTwL2b8JeGzPRf0AzB2xU0WzeOcl488N4+b1WTiL6n97IkxbbF8+EexHQfhSh2qDU4IknPhsbhK766090E/DQnYitKeDldHN46yAj1ym4QeyrWUL/bYBmfKxX0CMSIkkIEkmJJ/NUYS5hJLkm/PymFuzfWERM3kbXh3qZFU= X-Forefront-Antispam-Report: CIP:216.228.118.232;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc7edge1.nvidia.com;CAT:NONE;SFS:(13230040)(376014)(1800799024)(82310400026)(7416014)(36860700016)(18002099003)(56012099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: mH8zhyWqHGd6jPcpwlBYGeSpIQAvfe7xRaul08m0r0QmnHt945yrSVtGAgrOUJuOE5WvR9qsndctO37NMpkoC/i0vnim2Bcfp23f0pI39hbQ9j+HYYacadxFuIRU/VoSUg4DSelFtSrO5kPWt2ji1W+RuigpesMqlHz7R4NUm5lp8mdiYa/b6fscov+ian4UqN9S5sLvphoWRooJ/KnYCq1EegFcFVJwsAOswLZ+C9UebH+N+G1hWCIER3X0vYGaS7OsqxSt+blY1LRNfZsBax4oJb6+v+bsGaDP3qkGYpM4SSg0vP2Rg5AU82nQQL9nSo+aIFBrP+THgK1UoamfcQRQc7zGhtNq6wnKOET0QLyUeod7sJA3TV3ycmTW5aQw2yQ9KXr9kcnbfgkubREosKPASkncWimfoJPSS2hguAxEJn1CboQx+b+RoMPqV+qs X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 May 2026 12:38:22.9928 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a8b23a8e-a182-433f-c974-08deab6c5c87 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.118.232];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CO1PEPF00012E60.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL3PR12MB6644 Content-Type: text/plain; charset="utf-8" Add support for configuring the devlink eswitch mode from the devlink=3D kernel command line parameter. The supported syntax is: devlink=3D[]:esw:mode: where is one of legacy, switchdev or switchdev_inactive. The default is applied through the existing eswitch_mode_set() devlink operation, matching the userspace devlink eswitch set command. Document the devlink=3D syntax and the eswitch mode default. Signed-off-by: Mark Bloch --- .../admin-guide/kernel-parameters.txt | 24 ++++ .../networking/devlink/devlink-defaults.rst | 99 +++++++++++++++ Documentation/networking/devlink/index.rst | 1 + net/devlink/core.c | 114 ++++++++++++++++++ 4 files changed, 238 insertions(+) create mode 100644 Documentation/networking/devlink/devlink-defaults.rst diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentatio= n/admin-guide/kernel-parameters.txt index 7834ee927310..150202882870 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -1278,6 +1278,30 @@ Kernel parameters dell_smm_hwmon.fan_max=3D [HW] Maximum configurable fan speed. =20 + devlink=3D [NET] + Format: + [,...] + + : + [[,...]]:: + + : + / + + Configure default devlink settings for matching + devlink instances during device initialization. + + Currently supported settings: + esw:mode:{ legacy | switchdev | switchdev_inactive } + + Examples: + devlink=3D[pci/0000:08:00.0]:esw:mode:switchdev + devlink=3D[pci/0000:08:00.0,pci/0000:08:00.1]:esw:mode:legacy + devlink=3D[pci/0000:08:00.0]:esw:mode:switchdev,[pci/0000:08:00.1]:esw:= mode:switchdev_inactive + + See Documentation/networking/devlink/devlink-defaults.rst + for the full syntax and duplicate handling rules. + dfltcc=3D [HW,S390] Format: { on | off | def_only | inf_only | always } on: s390 zlib hardware support for compression on diff --git a/Documentation/networking/devlink/devlink-defaults.rst b/Docume= ntation/networking/devlink/devlink-defaults.rst new file mode 100644 index 000000000000..7d6ccaddca86 --- /dev/null +++ b/Documentation/networking/devlink/devlink-defaults.rst @@ -0,0 +1,99 @@ +.. SPDX-License-Identifier: GPL-2.0 + +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +Devlink Defaults +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Devlink defaults allow selected devlink settings to be provided on the +kernel command line and applied to matching devlink instances during device +initialization. + +The devlink device is selected by its devlink handle. For PCI devices this= is +the same handle shown by ``devlink dev show``, for example +``pci/0000:08:00.0``. + +Kernel command line syntax +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D + +Defaults are specified with the ``devlink=3D`` kernel command line paramet= er. + +The general syntax is:: + + devlink=3D[,...] + +Each default has the following form:: + + []:: + +```` is one or more devlink handles:: + + /[,/...] + +All handles in the same ``[]`` list receive the same command setting. + +Multiple defaults may be specified by separating complete defaults with a +comma after the value:: + + devlink=3D[pci/0000:08:00.0]:esw:mode:switchdev,[pci/0000:08:00.1]:esw:m= ode:legacy + +Syntax rules +------------ + +The following syntax rules apply: + +* Specify all defaults in one ``devlink=3D`` parameter. Repeated ``devlink= =3D`` + parameters are not accumulated. +* The ``devlink=3D`` value is limited by the kernel command line size. +* Whitespace is not allowed within the parameter value. +* ```` and ```` must not be empty. +* ```` must not contain ``:``. +* ```` may contain ``:``. This allows PCI names such as + ``0000:08:00.0``. +* Handles must not contain whitespace, ``[``, ``]`` or more than one ``/``. +* A comma inside ``[]`` separates handles. +* A comma after the ```` separates defaults. +* Defaults for the same handle are applied in command-line order. +* The same ``esw`` attribute may be specified only once for a given devlink + handle. +* Duplicate entries for the same handle are rejected and all devlink defau= lts + are ignored. + +Supported defaults +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +The supported command is ``esw``: + +.. list-table:: + :widths: 10 25 35 + :header-rows: 1 + + * - Command + - Options + - Values + * - ``esw`` + - ``mode:`` + - ``legacy``, ``switchdev``, ``switchdev_inactive`` + +The ``esw:mode`` default corresponds to the userspace command:: + + devlink dev eswitch set mode + + +Examples +=3D=3D=3D=3D=3D=3D=3D=3D + +Set one PCI devlink instance to switchdev mode:: + + devlink=3D[pci/0000:08:00.0]:esw:mode:switchdev + +Set two PCI devlink instances to legacy mode:: + + devlink=3D[pci/0000:08:00.0,pci/0000:08:00.1]:esw:mode:legacy + +Set different modes for different PCI devlink instances:: + + devlink=3D[pci/0000:08:00.0]:esw:mode:switchdev,[pci/0000:08:00.1]:esw:m= ode:switchdev_inactive + +The following is invalid because the same handle receives ``esw:mode`` twi= ce:: + + devlink=3D[pci/0000:08:00.0]:esw:mode:legacy,[pci/0000:08:00.0]:esw:mode= :switchdev diff --git a/Documentation/networking/devlink/index.rst b/Documentation/net= working/devlink/index.rst index f7ba7dcf477d..0d27a7008b14 100644 --- a/Documentation/networking/devlink/index.rst +++ b/Documentation/networking/devlink/index.rst @@ -56,6 +56,7 @@ general. :maxdepth: 1 =20 devlink-dpipe + devlink-defaults devlink-eswitch-attr devlink-flash devlink-health diff --git a/net/devlink/core.c b/net/devlink/core.c index 2421a1f8dbb7..4b404135181c 100644 --- a/net/devlink/core.c +++ b/net/devlink/core.c @@ -73,9 +73,123 @@ devlink_default_attr_free(struct devlink_default_attr_i= tem *attr) kfree(attr->value.param.value); } =20 +struct devlink_default_attr_spec { + const char *name; + enum devlink_attr attr; + int (*value_parse)(const char *value, + struct devlink_default_attr_item *attr_item); +}; + +static int __init +devlink_default_attr_parse(char *str, + const struct devlink_default_attr_spec *attrs, + size_t attrs_count, + struct devlink_default_attr_item *attr_item) +{ + char *attr_name; + char *value; + size_t i; + + attr_name =3D strsep(&str, ":"); + if (!attr_name || !*attr_name || !str || !*str) + return -EINVAL; + + value =3D str; + for (i =3D 0; i < attrs_count; i++) { + if (!strcmp(attr_name, attrs[i].name)) { + attr_item->attr =3D attrs[i].attr; + return attrs[i].value_parse(value, attr_item); + } + } + + return -EINVAL; +} + +static int __init +devlink_default_esw_mode_to_value(const char *str, + enum devlink_eswitch_mode *mode) +{ + if (!strcmp(str, "legacy")) { + *mode =3D DEVLINK_ESWITCH_MODE_LEGACY; + return 0; + } + if (!strcmp(str, "switchdev")) { + *mode =3D DEVLINK_ESWITCH_MODE_SWITCHDEV; + return 0; + } + if (!strcmp(str, "switchdev_inactive")) { + *mode =3D DEVLINK_ESWITCH_MODE_SWITCHDEV_INACTIVE; + return 0; + } + + return -EINVAL; +} + +static int __init +devlink_default_esw_mode_parse(const char *str, + struct devlink_default_attr_item *attr_item) +{ + enum devlink_eswitch_mode mode; + int err; + + err =3D devlink_default_esw_mode_to_value(str, &mode); + if (err) + return err; + + attr_item->value.eswitch_mode =3D mode; + return 0; +} + +static const struct devlink_default_attr_spec devlink_default_esw_attrs[] = __initconst =3D { + { "mode", DEVLINK_ATTR_ESWITCH_MODE, devlink_default_esw_mode_parse }, +}; + +static int __init +devlink_default_esw_attr_parse(char *str, + struct devlink_default_attr_item *attr_item) +{ + return devlink_default_attr_parse(str, devlink_default_esw_attrs, + ARRAY_SIZE(devlink_default_esw_attrs), + attr_item); +} + +static int +devlink_default_eswitch_apply(struct devlink *devlink, + const struct devlink_default_attr_item *attr) +{ + const struct devlink_ops *ops =3D devlink->ops; + + switch (attr->attr) { + case DEVLINK_ATTR_ESWITCH_MODE: + if (!ops->eswitch_mode_set) + return -EOPNOTSUPP; + + return ops->eswitch_mode_set(devlink, attr->value.eswitch_mode, + NULL); + default: + return -EOPNOTSUPP; + } +} + +static const struct devlink_default_cmd_spec devlink_default_cmds[] __init= const =3D { + { + .name =3D "esw", + .cmd =3D DEVLINK_CMD_ESWITCH_SET, + .run =3D devlink_default_eswitch_apply, + .attr_parse =3D devlink_default_esw_attr_parse, + }, +}; + static const struct devlink_default_cmd_spec *__init devlink_default_cmd_spec_find(const char *name) { + size_t i; + + for (i =3D 0; i < ARRAY_SIZE(devlink_default_cmds); i++) { + if (!strcmp(name, devlink_default_cmds[i].name)) + return &devlink_default_cmds[i]; + } + return NULL; } =20 --=20 2.34.1 From nobody Sat Jun 13 16:18:04 2026 Received: from MW6PR02CU001.outbound.protection.outlook.com (mail-westus2azon11012043.outbound.protection.outlook.com [52.101.48.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DCC3044CF39; Wed, 6 May 2026 12:38:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.48.43 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778071122; cv=fail; b=CDIPLed5pVf67U8JzR/nnH81v6X9NI/C/YFDOaZ2kVHNQ0IveMWGZwVOWiZhojOXin0ZeSZVp/5ThuXgMaQ8Yg6oIcqx6HSsge9n8cCzJpg4X6GB2OWUHv5Sc2JPeI8tzyYZ0YlHNE9VKvY7YQHRdZCgy+UEVR3As5isUsXuZt8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778071122; c=relaxed/simple; bh=LorUiXDYKxcgsmY93kG1kknJXxWPWGGZWyFhqgyK+7A=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=q8cH7j6SkdZB98wY4J3nJyDu5/kSBcSmtJW8+DqifHk6EQj98vZuKNDrtBsVBbbUxBsaMNW+Hq+DSVM9gbf9u3hZ+T7SKilCYUtsM01jPjkQkNaZVZxLhk+kwTne/3JXTG2iwR7gEBikMonc9zg0gHBW1u6W+wqWSf5pAal25pE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=qiQxXx4k; arc=fail smtp.client-ip=52.101.48.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="qiQxXx4k" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=pWPBPRwZglTAUAnth2K6de7pqwat/B5LGhhqNXHfxShQFNTEBcDmVPrTTjbRoPN4cI1lgnQsBhP41hNWkl198QC45O7rcUbdGL2XReEbPm4JV0t+mM9OweV6rrra3YpAmYiPURF6AL8txJJv/TAWA9V3VfnEY0tbJYCzxpXYzyDD2rfsRKP3w8VR6/E3jwLM3hBVpyg1rTxw93vGqrxsqjMxOVlNQJcn+ItkYr3g/UNdI9D9kNpVV9mf3rs27u5fwdCCFBu1ZPxrS8XRy2TrBJo3cBgCGOlTbW1kN62kvQrWsr+C44D1N1mIkfWvWFeCyJdJ/T4WHc6ZRiduQ3KeWw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=l9fcvnLst3Ln2PmNzyZ94pxTNym78iMxD0VkpoYUgDM=; b=pkoB7N1bRbbfGVL2wkM6Wlwjkto4twTuh8WZOhnHqXu0HEaO4hNmAuRowayUbDbfHheB6Ti6iCDGP8DruHC8dp2ehto5j71pu7nSb287y2Ij7X1crfVGpRKqo9PuomaDQpnxXJStJUJrR52nUDpSA5dE0btkJREgJN1At2u6no9At+JQmERl0HvJJ700SlVv8qNlHncNfqjszochWDs2GB9og15AoZBlw9ZMf97XPwwvsSHE8sgGnHBsLutHztxnTTZVFowkYB3Dr7b+U+jzq+M4PECEfWhFBKsI+x4tocZ2xanj28jwOyeESjtSE+8AwPWvJGY6y4exQAT0X5EXFw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.118.232) smtp.rcpttodomain=google.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=l9fcvnLst3Ln2PmNzyZ94pxTNym78iMxD0VkpoYUgDM=; b=qiQxXx4kSCx4yz4jXJ4u1PJFAyfsS5xzvx7skPdlhwc8LsDm33lvjEZ1j0XkB/Bcr2a3aVMRzwYlPCTjO9Km5grkK1XDozTZ+GSATmpwhApwlLAic2d9SjkYa6DkJ0Ft58IKnTZWNF631Nw1Y/+46bCALmsSa/EC3ChroL+A42TM2gF+UiWYbwnMcRvha70fmeJGoioEoAWK+ErbQiFoonRRf6jRr+CNmZioyx4n83eR47BHajnhpfqd5RJHFIQyG+xkz+nXN6uJbcgGUC7QCrq/czTrpByMtrv/aXGi43I9bTv3eMSWnPHNeWF8zI70TVMLF+q8nVoGmejuqpL4Og== Received: from BY3PR05CA0019.namprd05.prod.outlook.com (2603:10b6:a03:254::24) by CY1PR12MB9559.namprd12.prod.outlook.com (2603:10b6:930:fd::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.17; Wed, 6 May 2026 12:38:29 +0000 Received: from CO1PEPF00012E66.namprd05.prod.outlook.com (2603:10b6:a03:254:cafe::25) by BY3PR05CA0019.outlook.office365.com (2603:10b6:a03:254::24) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9913.6 via Frontend Transport; Wed, 6 May 2026 12:38:29 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.118.232) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.118.232 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.118.232; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.118.232) by CO1PEPF00012E66.mail.protection.outlook.com (10.167.249.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.9 via Frontend Transport; Wed, 6 May 2026 12:38:29 +0000 Received: from drhqmail201.nvidia.com (10.126.190.180) by mail.nvidia.com (10.127.129.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 6 May 2026 05:38:15 -0700 Received: from drhqmail201.nvidia.com (10.126.190.180) by drhqmail201.nvidia.com (10.126.190.180) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 6 May 2026 05:38:14 -0700 Received: from vdi.nvidia.com (10.127.8.10) by mail.nvidia.com (10.126.190.180) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 6 May 2026 05:38:07 -0700 From: Mark Bloch To: Eric Dumazet , Jakub Kicinski , Paolo Abeni , Andrew Lunn , "David S. Miller" CC: Jonathan Corbet , Shuah Khan , Jiri Pirko , Simon Horman , "Saeed Mahameed" , Leon Romanovsky , Tariq Toukan , Mark Bloch , Andrew Morton , "Borislav Petkov (AMD)" , "Randy Dunlap" , Dave Hansen , Christian Brauner , Petr Mladek , "Peter Zijlstra (Intel)" , Thomas Gleixner , Pawan Gupta , Dapeng Mi , Kees Cook , Marco Elver , Eric Biggers , Li RongQing , "Paul E. McKenney" , , , , Subject: [RFC net-next 3/4] devlink: Add runtime parameter boot defaults Date: Wed, 6 May 2026 15:37:38 +0300 Message-ID: <20260506123739.1959770-4-mbloch@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260506123739.1959770-1-mbloch@nvidia.com> References: <20260506123739.1959770-1-mbloch@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1PEPF00012E66:EE_|CY1PR12MB9559:EE_ X-MS-Office365-Filtering-Correlation-Id: 6189f9b4-52a4-4fe4-0903-08deab6c606b X-LD-Processed: 43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|1800799024|7416014|376014|36860700016|18002099003|56012099003|22082099003; X-Microsoft-Antispam-Message-Info: eoKnxLinW78DOGzn9pbNhPI886OC/er6qUUhULk1+/9Gdys3DUTM3TWuMxambBdIJ2DtQRf+4mweIFCxQmtHdKdlCg3wXCVD7Tdo/nf34J3MX53H2UZm44BAXlQgw7YXy9Ck3vQfTYTt5wo3qRVfvHAguyFJCDrEQMXacCClr2PPMgPgiciVjwcoN+lXq/+embDPhfeuify00UIg8cq/D5FOHRwlXEFMGMjSOiY4hva8uVvjNKQwvhFGNV9jMbLJUD5OEYD/XtitzVuaE2HOnjzz/RNYsq4fKbTy3rcNTR3XjpZ1ngF5eNUiSum/ZfOWSNm3aOKOfE+FoMNQX2Hjc5sCBCNfPkvBMy1pirtEwnO7O/gVcxPrZZ+7Z0W11iBTjnRUBiXo1dHKNO1+VHzaxJ1hoFMtLKAD/JDBPazG48KypHyelDXRYWGcOOyya52S9NGsIbUmBDa/b9IxjhBWOeaCGgzhxe7BjXdLTfZCQmv4oLNQ7B4RMUyG4UXMXqQQjQCwDtBCPiBJfc/NDsLA5tFjWMqiFZc9QI5KtPpJHSdDwJLw55ZK3bA8LkSgmU46pTRduoAaLMqctE+S/V5JMh25nHc3QaFMeqRvC88UuYY3e67KCdNQ9H2TDIEIo1GPC6FdEI5siyXKT8FDhdvL7/OYOwrDQit88zwK3UeSpYiGMXzKFlHwBleoFuHj4L8uhjVICyVpoUYNjuCyeQPWaA/PES6uNd18H5WDgNP4Vbc= X-Forefront-Antispam-Report: CIP:216.228.118.232;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc7edge1.nvidia.com;CAT:NONE;SFS:(13230040)(82310400026)(1800799024)(7416014)(376014)(36860700016)(18002099003)(56012099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: lCa2lC8xzngnUqX1jlhKJ8IZOXcGbXqv+Rq5KHf/YW7oiKPP6OI0nyGXso6vq/75l9QYREAmrq7ain4mm4ScQz/U7XKGFDfiiEZ4xtyEUWp+bE3SS5VKwi2ba+adfbLbe/Ol22Qu0v8IErPiQicweK5AE0j3AhgQCLFS7uV9kESwmm1gqijeTaLazOS8dtETsCe35oNkaob0GRxckDtkguY3asJOB79Jrjlp2U4skM0IEb1t3aP6hUWFyF+xorUGpSHnrQ+DgrjDnurhUVW6k5vUTnfJqucrQlv8mWKLdFkYfmsQJBP3VJhqFdHub/6YJtsEQMWvnovTvNbkTUgG4zCmLk5QkVyuc94qmjmj/G0R5FLYR4FDamrtOM9Ns7y6KdDOKvpEpVq2a78ObchHHLxhrLQh04ili/UNea7bfTovi+ZM8ZgWfab3uHbe/jFR X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 May 2026 12:38:29.4941 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6189f9b4-52a4-4fe4-0903-08deab6c606b X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.118.232];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CO1PEPF00012E66.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR12MB9559 Content-Type: text/plain; charset="utf-8" Add support for setting devlink device parameters from the devlink=3D kernel command line parameter. The supported syntax is: devlink=3D[]:param:: Parameter values are parsed according to the registered devlink parameter type and are applied in runtime configuration mode. Driverinit and permanent configuration modes are intentionally not part of the boot-default syntax. Add a helper that finds a parameter by name, verifies runtime mode support, converts the string value, runs the parameter validator and invokes the existing set callback. Signed-off-by: Mark Bloch --- .../admin-guide/kernel-parameters.txt | 2 + .../networking/devlink/devlink-defaults.rst | 18 ++- net/devlink/core.c | 110 ++++++++++++------ net/devlink/devl_internal.h | 3 + net/devlink/param.c | 70 +++++++++++ 5 files changed, 165 insertions(+), 38 deletions(-) diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentatio= n/admin-guide/kernel-parameters.txt index 150202882870..761ae45b8607 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -1293,9 +1293,11 @@ Kernel parameters =20 Currently supported settings: esw:mode:{ legacy | switchdev | switchdev_inactive } + param:: =20 Examples: devlink=3D[pci/0000:08:00.0]:esw:mode:switchdev + devlink=3D[pci/0000:08:00.0]:param:flow_steering_mode:smfs devlink=3D[pci/0000:08:00.0,pci/0000:08:00.1]:esw:mode:legacy devlink=3D[pci/0000:08:00.0]:esw:mode:switchdev,[pci/0000:08:00.1]:esw:= mode:switchdev_inactive =20 diff --git a/Documentation/networking/devlink/devlink-defaults.rst b/Docume= ntation/networking/devlink/devlink-defaults.rst index 7d6ccaddca86..0d4036e59e88 100644 --- a/Documentation/networking/devlink/devlink-defaults.rst +++ b/Documentation/networking/devlink/devlink-defaults.rst @@ -55,13 +55,16 @@ The following syntax rules apply: * Defaults for the same handle are applied in command-line order. * The same ``esw`` attribute may be specified only once for a given devlink handle. +* The same ``param`` name may be specified only once for a given devlink + handle. * Duplicate entries for the same handle are rejected and all devlink defau= lts are ignored. +* Parameter names and values must not contain ``:`` or ``,``. =20 Supported defaults =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 -The supported command is ``esw``: +The supported commands are ``esw`` and ``param``: =20 .. list-table:: :widths: 10 25 35 @@ -73,11 +76,16 @@ The supported command is ``esw``: * - ``esw`` - ``mode:`` - ``legacy``, ``switchdev``, ``switchdev_inactive`` + * - ``param`` + - ``:`` + - ```` is parsed according to the registered devlink parameter + type. Only runtime devlink parameters are supported. =20 The ``esw:mode`` default corresponds to the userspace command:: =20 devlink dev eswitch set mode =20 +The ``param`` default applies the named devlink parameter in runtime mode. =20 Examples =3D=3D=3D=3D=3D=3D=3D=3D @@ -90,6 +98,10 @@ Set two PCI devlink instances to legacy mode:: =20 devlink=3D[pci/0000:08:00.0,pci/0000:08:00.1]:esw:mode:legacy =20 +Set a runtime devlink device parameter:: + + devlink=3D[pci/0000:08:00.0]:param:flow_steering_mode:smfs + Set different modes for different PCI devlink instances:: =20 devlink=3D[pci/0000:08:00.0]:esw:mode:switchdev,[pci/0000:08:00.1]:esw:m= ode:switchdev_inactive @@ -97,3 +109,7 @@ Set different modes for different PCI devlink instances:: The following is invalid because the same handle receives ``esw:mode`` twi= ce:: =20 devlink=3D[pci/0000:08:00.0]:esw:mode:legacy,[pci/0000:08:00.0]:esw:mode= :switchdev + +The following is invalid because the same handle receives ``param:x`` twic= e:: + + devlink=3D[pci/0]:param:x:1,[pci/0]:param:x:2 diff --git a/net/devlink/core.c b/net/devlink/core.c index 4b404135181c..22990793ab8c 100644 --- a/net/devlink/core.c +++ b/net/devlink/core.c @@ -50,6 +50,13 @@ struct devlink_default_node { struct list_head cmd_list; }; =20 +struct devlink_default_attr_spec { + const char *name; + enum devlink_attr attr; + int (*value_parse)(const char *value, + struct devlink_default_attr_item *attr_item); +}; + struct devlink_default_cmd_spec { const char *name; enum devlink_command cmd; @@ -73,13 +80,6 @@ devlink_default_attr_free(struct devlink_default_attr_it= em *attr) kfree(attr->value.param.value); } =20 -struct devlink_default_attr_spec { - const char *name; - enum devlink_attr attr; - int (*value_parse)(const char *value, - struct devlink_default_attr_item *attr_item); -}; - static int __init devlink_default_attr_parse(char *str, const struct devlink_default_attr_spec *attrs, @@ -153,6 +153,33 @@ devlink_default_esw_attr_parse(char *str, attr_item); } =20 +static int __init +devlink_default_param_attr_parse(char *str, + struct devlink_default_attr_item *attr_item) +{ + char *name; + char *value; + + attr_item->attr =3D DEVLINK_ATTR_PARAM; + + name =3D strsep(&str, ":"); + value =3D strsep(&str, ":"); + if (!name || !*name || !value || !*value || str) + return -EINVAL; + + attr_item->value.param.name =3D kstrdup(name, GFP_KERNEL); + if (!attr_item->value.param.name) + return -ENOMEM; + attr_item->value.param.value =3D kstrdup(value, GFP_KERNEL); + if (!attr_item->value.param.value) { + kfree(attr_item->value.param.name); + attr_item->value.param.name =3D NULL; + return -ENOMEM; + } + + return 0; +} + static int devlink_default_eswitch_apply(struct devlink *devlink, const struct devlink_default_attr_item *attr) @@ -171,6 +198,17 @@ devlink_default_eswitch_apply(struct devlink *devlink, } } =20 +static int +devlink_default_param_apply(struct devlink *devlink, + const struct devlink_default_attr_item *attr) +{ + if (attr->attr !=3D DEVLINK_ATTR_PARAM) + return -EOPNOTSUPP; + + return devlink_param_set_from_string(devlink, attr->value.param.name, + attr->value.param.value); +} + static const struct devlink_default_cmd_spec devlink_default_cmds[] __init= const =3D { { .name =3D "esw", @@ -178,52 +216,46 @@ static const struct devlink_default_cmd_spec devlink_= default_cmds[] __initconst .run =3D devlink_default_eswitch_apply, .attr_parse =3D devlink_default_esw_attr_parse, }, + { + .name =3D "param", + .cmd =3D DEVLINK_CMD_PARAM_SET, + .run =3D devlink_default_param_apply, + .attr_parse =3D devlink_default_param_attr_parse, + }, }; =20 -static const struct devlink_default_cmd_spec *__init -devlink_default_cmd_spec_find(const char *name) -{ - size_t i; - - for (i =3D 0; i < ARRAY_SIZE(devlink_default_cmds); i++) { - if (!strcmp(name, devlink_default_cmds[i].name)) - return &devlink_default_cmds[i]; - } - - return NULL; -} - static int __init devlink_default_cmd_parse(char *str, struct devlink_default_cmd_item *cmd_item) { - const struct devlink_default_cmd_spec *spec; struct devlink_default_attr_item attr_item =3D {}; char *cmd_name; int err; + size_t i; =20 cmd_name =3D strsep(&str, ":"); if (!cmd_name || !*cmd_name || !str || !*str) return -EINVAL; =20 - spec =3D devlink_default_cmd_spec_find(cmd_name); - if (!spec) - return -EINVAL; - - err =3D spec->attr_parse(str, &attr_item); - if (err) { - devlink_default_attr_free(&attr_item); - return err; - } - if (cmd_item) { - cmd_item->cmd =3D spec->cmd; - cmd_item->run =3D spec->run; - cmd_item->attr =3D attr_item; - } else { - devlink_default_attr_free(&attr_item); + for (i =3D 0; i < ARRAY_SIZE(devlink_default_cmds); i++) { + if (!strcmp(cmd_name, devlink_default_cmds[i].name)) { + err =3D devlink_default_cmds[i].attr_parse(str, &attr_item); + if (err) { + devlink_default_attr_free(&attr_item); + return err; + } + if (cmd_item) { + cmd_item->cmd =3D devlink_default_cmds[i].cmd; + cmd_item->run =3D devlink_default_cmds[i].run; + cmd_item->attr =3D attr_item; + } else { + devlink_default_attr_free(&attr_item); + } + return 0; + } } =20 - return 0; + return -EINVAL; } =20 static int __init @@ -369,6 +401,10 @@ devlink_default_cmd_equal(const struct devlink_default= _cmd_item *a, if (a->cmd !=3D b->cmd || a->attr.attr !=3D b->attr.attr) return false; =20 + if (a->cmd =3D=3D DEVLINK_CMD_PARAM_SET) + return !strcmp(a->attr.value.param.name, + b->attr.value.param.name); + return true; } =20 diff --git a/net/devlink/devl_internal.h b/net/devlink/devl_internal.h index e4e48ee2da5a..bde333c22f18 100644 --- a/net/devlink/devl_internal.h +++ b/net/devlink/devl_internal.h @@ -212,6 +212,9 @@ static inline int devlink_nl_put_u64(struct sk_buff *ms= g, int attrtype, u64 val) int devlink_nl_put_nested_handle(struct sk_buff *msg, struct net *net, struct devlink *devlink, int attrtype); int devlink_nl_msg_reply_and_new(struct sk_buff **msg, struct genl_info *i= nfo); +int devlink_param_set_from_string(struct devlink *devlink, + const char *param_name, + const char *value_str); =20 static inline bool devlink_nl_notify_need(struct devlink *devlink) { diff --git a/net/devlink/param.c b/net/devlink/param.c index cf95268da5b0..d2604fe2eee5 100644 --- a/net/devlink/param.c +++ b/net/devlink/param.c @@ -4,6 +4,8 @@ * Copyright (c) 2016 Jiri Pirko */ =20 +#include + #include "devl_internal.h" =20 static const struct devlink_param devlink_param_generic[] =3D { @@ -551,6 +553,74 @@ devlink_param_value_get_from_info(const struct devlink= _param *param, return 0; } =20 +static int +devlink_param_value_get_from_str(const struct devlink_param *param, + const char *value_str, + union devlink_param_value *value) +{ + switch (param->type) { + case DEVLINK_PARAM_TYPE_U8: + return kstrtou8(value_str, 0, &value->vu8); + case DEVLINK_PARAM_TYPE_U16: + return kstrtou16(value_str, 0, &value->vu16); + case DEVLINK_PARAM_TYPE_U32: + return kstrtou32(value_str, 0, &value->vu32); + case DEVLINK_PARAM_TYPE_U64: + return kstrtou64(value_str, 0, &value->vu64); + case DEVLINK_PARAM_TYPE_STRING: + if (strscpy(value->vstr, value_str, sizeof(value->vstr)) < 0) + return -EINVAL; + return 0; + case DEVLINK_PARAM_TYPE_BOOL: + return kstrtobool(value_str, &value->vbool); + } + + return -EINVAL; +} + +int devlink_param_set_from_string(struct devlink *devlink, + const char *param_name, + const char *value_str) +{ + struct devlink_param_gset_ctx ctx; + struct devlink_param_item *param_item; + const struct devlink_param *param; + union devlink_param_value value; + int err; + + devl_assert_locked(devlink); + + param_item =3D devlink_param_find_by_name(&devlink->params, param_name); + if (!param_item) + return -EINVAL; + param =3D param_item->param; + + if (!devlink_param_cmode_is_supported(param, + DEVLINK_PARAM_CMODE_RUNTIME)) + return -EOPNOTSUPP; + if (!param->set) + return -EOPNOTSUPP; + + err =3D devlink_param_value_get_from_str(param, value_str, &value); + if (err) + return err; + + if (param->validate) { + err =3D param->validate(devlink, param->id, value, NULL); + if (err) + return err; + } + + ctx.val =3D value; + ctx.cmode =3D DEVLINK_PARAM_CMODE_RUNTIME; + err =3D devlink_param_set(devlink, param, &ctx, NULL); + if (err) + return err; + + devlink_param_notify(devlink, 0, param_item, DEVLINK_CMD_PARAM_NEW); + return 0; +} + static struct devlink_param_item * devlink_param_get_from_info(struct xarray *params, struct genl_info *info) { --=20 2.34.1 From nobody Sat Jun 13 16:18:04 2026 Received: from CY7PR03CU001.outbound.protection.outlook.com (mail-westcentralusazon11010031.outbound.protection.outlook.com [40.93.198.31]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5558E44DB64; Wed, 6 May 2026 12:38:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.198.31 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778071124; cv=fail; b=YD7Y22+iQJgO7oqQx0J/irUfnmUN2CDJpZrKboKjM2i14zkp43kYWOTCU1fzsBbczV68OAaJiIbArpDphZRxeoDdSCdyMvHS2jfTzD/7alZo/DNoywgJpDL4aWyyX9ElZ15kqOk6dClmz0llUMjBf4+nXrSgonk1wGmVMxn+rVQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778071124; c=relaxed/simple; bh=MDB2XFcIx+873yxRG3eKHVrN3g+SCkMvmxl5iYO+XHU=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Ev7sRqkG6EAYSQeH7ES15k+oiYc4tmkk+NjpvkedPM0pYNnwrlMGIu7cV/cdiOQXMGFp4BuUxCv3OTzokzj0OiNEB214wmJ46C5/d8RktzBQ3r9wRyxMLXC8dMre34iViWAh/jH3BmDlJ2a/RLX8xsNr8MVeDZDqUPTH0gj+EX0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=RZWZZPxr; arc=fail smtp.client-ip=40.93.198.31 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="RZWZZPxr" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=TA/JXT3AdtUydL/99ZMXNPZDXuUqaIdQFchMHGd6Pz47CkobtRY5pL/phcHI0wmj4e8Hq4jhine4RDn1o81OOTb74YnDs0dxypUHkIibj6R1AnsL1ddx/dgpJamOPtZOU+ODbgBxo6CM00EDFY/45tVJOXyXrYgR/tujJsa9PBxifY8p9QtUmhMD3xnwr+uVMWKrZPr0+yQP6KofQPlCLFlaNVp0ZRkrp3U8cDpb2qdwbethjURBMcdcoNGi0/PW6LZRhYv8xIvaOEIAuailPfbAn7rrn6FiXDTmSvIWo0h4D1NgDIHF1Q7Bkrx3VocxImKKNs7KdjeuuM3CYWe/MQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=xHDs1B36ARWF4XzkZaPwt9tSITIn2DLz8wU3G9SHMSM=; b=yAH+eH+8XNj4pR2H/1yEPbhBTWwTsLl4NtjPFU3TJfvBMU8kNQ7Gns19P9jztr5/v30h7p7BQcRkctUrUx1IPe2Whi4Ft7Ix4LBlwfYa5WPljKISjSecJ6994JAf4QIy3NnTNCeAR0Y1qJxoQTX/J3UKjyn7ldQ9CjvHXeXFyyB2gxbU3WVMfnw7LHFuEZDSI8RGS1NwNdMVa/hlryX5Y0zd0q99LLWdyTbt06uoWddY4f7y5V4b701zpJr2O8GVPrEl3pKwEUjyvENmldCdGSSbcwXHDD07dByn0M4bppJdlFThxb4HCsoW7Dh2hWIe3OuAd2h2RYpSXv1iYdHxWA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.118.233) smtp.rcpttodomain=google.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=xHDs1B36ARWF4XzkZaPwt9tSITIn2DLz8wU3G9SHMSM=; b=RZWZZPxrU6+VOXPtmNeASOgVJQDf3nHJV+kVTRR9tiP6YhtLGYldjZHOiqDiGUAT+zOzLlVtTZFUx4yzGxavAZ4odCYDFhvTarxSlOoyLlbs01xYUqjad74PJMCNjv4fXMGJr6IPRU3D5WvCNb5eJ+E8ouLsaWsQNjGkKll/nFgO4foVFHviJCOUnsy4Zbc1CeQw3aL+qtUTzUmfoh39T2s6g7gsbWSNVb+allqL3fLlXnk+d192vkOGOpiXwH6tbxb/bFtTd3oo18b8xeeJhP9rISCgvzGGmUetIc4EA4Fib99+2zxZH6VqPz9gdggh1p5PQiPA2EliHGCnN0VAwA== Received: from MW3PR05CA0020.namprd05.prod.outlook.com (2603:10b6:303:2b::25) by BN5PR12MB9540.namprd12.prod.outlook.com (2603:10b6:408:2a8::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.15; Wed, 6 May 2026 12:38:37 +0000 Received: from CO1PEPF000075F4.namprd03.prod.outlook.com (2603:10b6:303:2b:cafe::ce) by MW3PR05CA0020.outlook.office365.com (2603:10b6:303:2b::25) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9913.5 via Frontend Transport; Wed, 6 May 2026 12:38:37 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.118.233) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.118.233 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.118.233; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.118.233) by CO1PEPF000075F4.mail.protection.outlook.com (10.167.249.43) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.9 via Frontend Transport; Wed, 6 May 2026 12:38:36 +0000 Received: from drhqmail201.nvidia.com (10.126.190.180) by mail.nvidia.com (10.127.129.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 6 May 2026 05:38:23 -0700 Received: from drhqmail201.nvidia.com (10.126.190.180) by drhqmail201.nvidia.com (10.126.190.180) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 6 May 2026 05:38:22 -0700 Received: from vdi.nvidia.com (10.127.8.10) by mail.nvidia.com (10.126.190.180) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 6 May 2026 05:38:15 -0700 From: Mark Bloch To: Eric Dumazet , Jakub Kicinski , Paolo Abeni , Andrew Lunn , "David S. Miller" CC: Jonathan Corbet , Shuah Khan , Jiri Pirko , Simon Horman , "Saeed Mahameed" , Leon Romanovsky , Tariq Toukan , Mark Bloch , Andrew Morton , "Borislav Petkov (AMD)" , "Randy Dunlap" , Dave Hansen , Christian Brauner , Petr Mladek , "Peter Zijlstra (Intel)" , Thomas Gleixner , Pawan Gupta , Dapeng Mi , Kees Cook , Marco Elver , Eric Biggers , Li RongQing , "Paul E. McKenney" , , , , Subject: [RFC net-next 4/4] net/mlx5: Apply devlink boot defaults during init Date: Wed, 6 May 2026 15:37:39 +0300 Message-ID: <20260506123739.1959770-5-mbloch@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260506123739.1959770-1-mbloch@nvidia.com> References: <20260506123739.1959770-1-mbloch@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1PEPF000075F4:EE_|BN5PR12MB9540:EE_ X-MS-Office365-Filtering-Correlation-Id: c755fb0f-f826-4523-9cc6-08deab6c64d9 X-LD-Processed: 43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|1800799024|82310400026|7416014|36860700016|18002099003|56012099003|22082099003; X-Microsoft-Antispam-Message-Info: sIvBKBdqqna2dL9kkHxTiTEIWcMDtOstFTSDsKPpR35b70mjXdulG8/OXGBinPL28F685Z36w41t5vLx1Ngbq6s4G/gMDuvyce+OxHuc3vSasl8CDT6pRAD00iCqO/LoHP60ATSvHSvN1ebVCRPJb4glF6ioSBwUuqsyMauZhIEZedpwQbfLeumS7ct7rU/MLpy6ln2DjIKc2sBGAZaOdaKdbxvSGKIcRAZbPpiUZFy5sHOzaZFfRTWAFGwMplA983bLxXGZrllJFk/aoYqyUkgi7GWNtKH/DSORHK9cE8wQ48WPtvKh+1TZG2Glo1iKdVIl/TspDkKat5ekCiNPY6HaqA614n7IIUR8buZhXaFMwyK0MWm59xkH8ngX07Wnyrj6m5YFswNYLyTN7/WW3M/RkF4Pt+IrhnZOcr/ed5k+Hjfv+OCVm1JxPzyaGaHD77/v+gn5niZjbRD81UwaSRf16B1m45s13sNyXdhjs4LdE9nLROnnmCQpkmwN+vcSbotwvOZzsVitH+ttWvBPdsNiLPStdvCTm04fLEEUzIBLsWujhaKD/3LRKKqXWp7uMlqlfATMzwLnIpNb91EH5jqAHaKkeXJDeK5C4r7UnSuLOrb9VuaecdifcXNfz8zOOCcFwGJMXQihF3wCxbgE4Cx29mWftS6UeuUm4Q1zCmEARxWHUF7nEkOrvyL+LgsXhpV9un7089QgtS47puIx59HU7nYUh3tWKgxn6zaXfwY= X-Forefront-Antispam-Report: CIP:216.228.118.233;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc7edge2.nvidia.com;CAT:NONE;SFS:(13230040)(376014)(1800799024)(82310400026)(7416014)(36860700016)(18002099003)(56012099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: RUfGzAZCEY13gnTBIFn1dLnSKgWG9syaobj0YkixehaGQCe6kBfHXfjTzzEyjy7F9N8jQbCSl01hhDgP+jjpO/EsQdG6gNA+jXJwz83iZrxy+QesMGGJesAqkImWipGi3dBVSvTuWPpwiZgNWPNmu7nGPCbqcHf5mYBWhom8Tv+o4kiEc13xYYyESjgWqx/QNtKMrh1mLY5PFFgskk+8nrAdDE3BAQgTIHzrQR5ltDUwT0dFRioWY/nhpiRsdHe4V/w2NoFEVYuen/YFkn0UjCUTwJ9f3wG/yxNS1YmSoUCd9HjgLjWAFAmaUkwSikBQwdh2Gi6QEcqXESqJHH3lavBOLXMzk+qFhqwo4K/j9OqFSNX3ARJv1yiM6WzvsZqTtHunlD5cJCupC3eJGJJCDPIVgd5LfjGKfkiGFL5NEV5IIGo4NT0bqAAho+2uHfiG X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 May 2026 12:38:36.9295 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c755fb0f-f826-4523-9cc6-08deab6c64d9 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.118.233];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CO1PEPF000075F4.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN5PR12MB9540 Content-Type: text/plain; charset="utf-8" Apply devlink boot defaults for mlx5 devices after successful device initialization, while holding the devlink instance lock. At this point the devlink instance is registered and the mlx5 devlink operations and parameters have been registered, so generic devlink defaults such as eswitch mode and runtime parameters can be applied to the matching PCI devlink handle. Signed-off-by: Mark Bloch --- drivers/net/ethernet/mellanox/mlx5/core/main.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/e= thernet/mellanox/mlx5/core/main.c index b1b9ebfd3866..a119d199f9a5 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c @@ -1464,6 +1464,8 @@ int mlx5_init_one(struct mlx5_core_dev *dev) err =3D mlx5_init_one_devl_locked(dev); if (err) devl_unregister(devlink); + else + devl_apply_defaults(devlink); unlock: devl_unlock(devlink); return err; --=20 2.34.1