From patchwork Fri Jan 22 09:46:39 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 369244 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.9 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNWANTED_LANGUAGE_BODY, URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8CC19C433DB for ; Fri, 22 Jan 2021 10:35:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 58837239EE for ; Fri, 22 Jan 2021 10:35:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727857AbhAVK23 (ORCPT ); Fri, 22 Jan 2021 05:28:29 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47950 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727725AbhAVJsO (ORCPT ); Fri, 22 Jan 2021 04:48:14 -0500 Received: from mail-wr1-x42d.google.com (mail-wr1-x42d.google.com [IPv6:2a00:1450:4864:20::42d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AA214C061353 for ; Fri, 22 Jan 2021 01:46:52 -0800 (PST) Received: by mail-wr1-x42d.google.com with SMTP id c12so4439775wrc.7 for ; Fri, 22 Jan 2021 01:46:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Acx36WlCbB6aLe/20IKU6G6dYCKa0jkK+44/7VwBEuU=; b=h0l3+oXGpg04WUPXUUiDM6z7Zrx/QEegzK4vC/jcHKRF5NXm0nKYjTK8nGEXevPvLm fYsGQqgHtF9Fl8M0wMaZIEmo+A2SzXjbg+GdS8VzD556h7FxaPipyvLztEDTsboT9lq1 I/MbUSqiQKNc47V5XFxBa9t0tX64M3noMNAx3e9fjesDpX92B1EJ+cgCzXy3MD/0dE+N g/obW1ejvBuMfWjnFKUr9iJt1AOnadrmUn8qOlRTOSHzoODcy0P03P07myJHRwaMQsDP /sKtfDcLCAEno1UzqL+imcZ/dj7XefmARHfqWuhOsQAummrJYarwDwbUI/SZCH5jxmtj smkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Acx36WlCbB6aLe/20IKU6G6dYCKa0jkK+44/7VwBEuU=; b=goSxf/AhvzieVg6BnqUNTwooEwG8nxh6AJtzjxKus08fJHc++bnernz/hh96tg6Dfi UoDd1bN/LgJFDeN9MNbNSnOa3cANZhGa8f7urQsKkaiSGV5Jl1E4wo53F7et5eoDFbyM 57BxDe2lQEpIW4qxN1+jyJoH37ghYrJ+j/IuCi9lgCwKYE6ZPnF10IEBBNGlfB10xdmC oO2VStlIOeczEhUXPzDeAZOWywEXMGUD4c52O6bmm9OywcbXxGoiFedPhQPFHc+3yJez E7yBrpgT1g99x5pPGOFq47iF7yHCPLeutPcxHwFhmmTIBWrtr3tWpVmvHPi7NSFG1KSs 7HTw== X-Gm-Message-State: AOAM533tHs+iTsHYxjhHpD9JHjYH0yN7OVuFqKfoBr6hQ39gx9mglvdb RYo2Afj2j6tSJ8RMIcX+/iA0qT/h/R/aWHEeVso= X-Google-Smtp-Source: ABdhPJyZSfJ8U5oojeEFMFC1qagJfK5BhNq192xh5WmzaUfasCJodhwFMGWoAWStQ8VYsOVSk8IF2g== X-Received: by 2002:a5d:6d06:: with SMTP id e6mr3602844wrq.425.1611308811082; Fri, 22 Jan 2021 01:46:51 -0800 (PST) Received: from localhost ([85.163.43.78]) by smtp.gmail.com with ESMTPSA id n16sm11311116wrj.26.2021.01.22.01.46.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Jan 2021 01:46:50 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: davem@davemloft.net, kuba@kernel.org, jacob.e.keller@intel.com, roopa@nvidia.com, andrew@lunn.ch, dsahern@gmail.com, mlxsw@nvidia.com Subject: [patch net-next RFCv2 01/10] devlink: add support to create line card and expose to user Date: Fri, 22 Jan 2021 10:46:39 +0100 Message-Id: <20210122094648.1631078-2-jiri@resnulli.us> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210122094648.1631078-1-jiri@resnulli.us> References: <20210122094648.1631078-1-jiri@resnulli.us> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jiri Pirko Extend the devlink API so the driver is going to be able to create and destroy linecard instances. There can be multiple line cards per devlink device. Expose this new type of object over devlink netlink API to the userspace, with notifications. Signed-off-by: Jiri Pirko --- RFC->RFCv2: - s/register/create in function comment - s/create/destroy/ for destroy exported symbol --- include/net/devlink.h | 10 ++ include/uapi/linux/devlink.h | 7 ++ net/core/devlink.c | 227 ++++++++++++++++++++++++++++++++++- 3 files changed, 243 insertions(+), 1 deletion(-) diff --git a/include/net/devlink.h b/include/net/devlink.h index dd0c0b8fba6e..67c2547d5ef9 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -45,6 +45,7 @@ struct devlink { struct list_head trap_list; struct list_head trap_group_list; struct list_head trap_policer_list; + struct list_head linecard_list; const struct devlink_ops *ops; struct xarray snapshot_ids; struct devlink_dev_stats stats; @@ -138,6 +139,12 @@ struct devlink_port { struct mutex reporters_lock; /* Protects reporter_list */ }; +struct devlink_linecard { + struct list_head list; + struct devlink *devlink; + unsigned int index; +}; + struct devlink_sb_pool_info { enum devlink_sb_pool_type pool_type; u32 size; @@ -1407,6 +1414,9 @@ void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, u32 contro u16 pf, bool external); void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, u32 controller, u16 pf, u16 vf, bool external); +struct devlink_linecard *devlink_linecard_create(struct devlink *devlink, + unsigned int linecard_index); +void devlink_linecard_destroy(struct devlink_linecard *linecard); int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, u32 size, u16 ingress_pools_count, u16 egress_pools_count, u16 ingress_tc_count, diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h index cf89c318f2ac..e5ed0522591f 100644 --- a/include/uapi/linux/devlink.h +++ b/include/uapi/linux/devlink.h @@ -126,6 +126,11 @@ enum devlink_command { DEVLINK_CMD_HEALTH_REPORTER_TEST, + DEVLINK_CMD_LINECARD_GET, /* can dump */ + DEVLINK_CMD_LINECARD_SET, + DEVLINK_CMD_LINECARD_NEW, + DEVLINK_CMD_LINECARD_DEL, + /* add new commands above here */ __DEVLINK_CMD_MAX, DEVLINK_CMD_MAX = __DEVLINK_CMD_MAX - 1 @@ -529,6 +534,8 @@ enum devlink_attr { DEVLINK_ATTR_RELOAD_ACTION_INFO, /* nested */ DEVLINK_ATTR_RELOAD_ACTION_STATS, /* nested */ + DEVLINK_ATTR_LINECARD_INDEX, /* u32 */ + /* 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 f86688bfad46..70154bed9950 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -187,6 +187,46 @@ static struct devlink_port *devlink_port_get_from_info(struct devlink *devlink, return devlink_port_get_from_attrs(devlink, info->attrs); } +static struct devlink_linecard * +devlink_linecard_get_by_index(struct devlink *devlink, + unsigned int linecard_index) +{ + struct devlink_linecard *devlink_linecard; + + list_for_each_entry(devlink_linecard, &devlink->linecard_list, list) { + if (devlink_linecard->index == linecard_index) + return devlink_linecard; + } + return NULL; +} + +static bool devlink_linecard_index_exists(struct devlink *devlink, + unsigned int linecard_index) +{ + return devlink_linecard_get_by_index(devlink, linecard_index); +} + +static struct devlink_linecard * +devlink_linecard_get_from_attrs(struct devlink *devlink, struct nlattr **attrs) +{ + if (attrs[DEVLINK_ATTR_LINECARD_INDEX]) { + u32 linecard_index = nla_get_u32(attrs[DEVLINK_ATTR_LINECARD_INDEX]); + struct devlink_linecard *linecard; + + linecard = devlink_linecard_get_by_index(devlink, linecard_index); + if (!linecard) + return ERR_PTR(-ENODEV); + return linecard; + } + return ERR_PTR(-EINVAL); +} + +static struct devlink_linecard * +devlink_linecard_get_from_info(struct devlink *devlink, struct genl_info *info) +{ + return devlink_linecard_get_from_attrs(devlink, info->attrs); +} + struct devlink_sb { struct list_head list; unsigned int index; @@ -405,16 +445,18 @@ devlink_region_snapshot_get_by_id(struct devlink_region *region, u32 id) #define DEVLINK_NL_FLAG_NEED_PORT BIT(0) #define DEVLINK_NL_FLAG_NEED_DEVLINK_OR_PORT BIT(1) +#define DEVLINK_NL_FLAG_NEED_LINECARD BIT(2) /* The per devlink instance lock is taken by default in the pre-doit * operation, yet several commands do not require this. The global * devlink lock is taken and protects from disruption by user-calls. */ -#define DEVLINK_NL_FLAG_NO_LOCK BIT(2) +#define DEVLINK_NL_FLAG_NO_LOCK BIT(3) static int devlink_nl_pre_doit(const struct genl_ops *ops, struct sk_buff *skb, struct genl_info *info) { + struct devlink_linecard *linecard; struct devlink_port *devlink_port; struct devlink *devlink; int err; @@ -439,6 +481,13 @@ static int devlink_nl_pre_doit(const struct genl_ops *ops, devlink_port = devlink_port_get_from_info(devlink, info); if (!IS_ERR(devlink_port)) info->user_ptr[1] = devlink_port; + } else if (ops->internal_flags & DEVLINK_NL_FLAG_NEED_LINECARD) { + linecard = devlink_linecard_get_from_info(devlink, info); + if (IS_ERR(linecard)) { + err = PTR_ERR(linecard); + goto unlock; + } + info->user_ptr[1] = linecard; } return 0; @@ -1136,6 +1185,121 @@ static int devlink_nl_cmd_port_unsplit_doit(struct sk_buff *skb, return devlink_port_unsplit(devlink, port_index, info->extack); } +static int devlink_nl_linecard_fill(struct sk_buff *msg, + struct devlink *devlink, + struct devlink_linecard *linecard, + enum devlink_command cmd, u32 portid, + u32 seq, int flags, + struct netlink_ext_ack *extack) +{ + void *hdr; + + hdr = genlmsg_put(msg, portid, seq, &devlink_nl_family, flags, cmd); + if (!hdr) + return -EMSGSIZE; + + if (devlink_nl_put_handle(msg, devlink)) + goto nla_put_failure; + if (nla_put_u32(msg, DEVLINK_ATTR_LINECARD_INDEX, linecard->index)) + goto nla_put_failure; + + genlmsg_end(msg, hdr); + return 0; + +nla_put_failure: + genlmsg_cancel(msg, hdr); + return -EMSGSIZE; +} + +static void devlink_linecard_notify(struct devlink_linecard *linecard, + enum devlink_command cmd) +{ + struct devlink *devlink = linecard->devlink; + struct sk_buff *msg; + int err; + + WARN_ON(cmd != DEVLINK_CMD_LINECARD_NEW && + cmd != DEVLINK_CMD_LINECARD_DEL); + + msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); + if (!msg) + return; + + err = devlink_nl_linecard_fill(msg, devlink, linecard, cmd, 0, 0, 0, + NULL); + if (err) { + nlmsg_free(msg); + return; + } + + genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), + msg, 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL); +} + +static int devlink_nl_cmd_linecard_get_doit(struct sk_buff *skb, + struct genl_info *info) +{ + struct devlink_linecard *linecard = info->user_ptr[1]; + struct devlink *devlink = linecard->devlink; + struct sk_buff *msg; + int err; + + msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); + if (!msg) + return -ENOMEM; + + err = devlink_nl_linecard_fill(msg, devlink, linecard, + DEVLINK_CMD_LINECARD_NEW, + info->snd_portid, info->snd_seq, 0, + info->extack); + if (err) { + nlmsg_free(msg); + return err; + } + + return genlmsg_reply(msg, info); +} + +static int devlink_nl_cmd_linecard_get_dumpit(struct sk_buff *msg, + struct netlink_callback *cb) +{ + struct devlink_linecard *linecard; + struct devlink *devlink; + int start = cb->args[0]; + int idx = 0; + int err; + + mutex_lock(&devlink_mutex); + list_for_each_entry(devlink, &devlink_list, list) { + if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) + continue; + mutex_lock(&devlink->lock); + list_for_each_entry(linecard, &devlink->linecard_list, list) { + if (idx < start) { + idx++; + continue; + } + err = devlink_nl_linecard_fill(msg, devlink, linecard, + DEVLINK_CMD_LINECARD_NEW, + NETLINK_CB(cb->skb).portid, + cb->nlh->nlmsg_seq, + NLM_F_MULTI, + cb->extack); + if (err) { + mutex_unlock(&devlink->lock); + goto out; + } + idx++; + } + mutex_unlock(&devlink->lock); + } +out: + mutex_unlock(&devlink_mutex); + + cb->args[0] = idx; + return msg->len; +} + static int devlink_nl_sb_fill(struct sk_buff *msg, struct devlink *devlink, struct devlink_sb *devlink_sb, enum devlink_command cmd, u32 portid, @@ -7594,6 +7758,7 @@ static const struct nla_policy devlink_nl_policy[DEVLINK_ATTR_MAX + 1] = { [DEVLINK_ATTR_RELOAD_ACTION] = NLA_POLICY_RANGE(NLA_U8, DEVLINK_RELOAD_ACTION_DRIVER_REINIT, DEVLINK_RELOAD_ACTION_MAX), [DEVLINK_ATTR_RELOAD_LIMITS] = NLA_POLICY_BITFIELD32(DEVLINK_RELOAD_LIMITS_VALID_MASK), + [DEVLINK_ATTR_LINECARD_INDEX] = { .type = NLA_U32 }, }; static const struct genl_small_ops devlink_nl_ops[] = { @@ -7633,6 +7798,14 @@ static const struct genl_small_ops devlink_nl_ops[] = { .flags = GENL_ADMIN_PERM, .internal_flags = DEVLINK_NL_FLAG_NO_LOCK, }, + { + .cmd = DEVLINK_CMD_LINECARD_GET, + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, + .doit = devlink_nl_cmd_linecard_get_doit, + .dumpit = devlink_nl_cmd_linecard_get_dumpit, + .internal_flags = DEVLINK_NL_FLAG_NEED_LINECARD, + /* can be retrieved by unprivileged users */ + }, { .cmd = DEVLINK_CMD_SB_GET, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, @@ -7982,6 +8155,7 @@ struct devlink *devlink_alloc(const struct devlink_ops *ops, size_t priv_size) xa_init_flags(&devlink->snapshot_ids, XA_FLAGS_ALLOC); __devlink_net_set(devlink, &init_net); INIT_LIST_HEAD(&devlink->port_list); + INIT_LIST_HEAD(&devlink->linecard_list); INIT_LIST_HEAD(&devlink->sb_list); INIT_LIST_HEAD_RCU(&devlink->dpipe_table_list); INIT_LIST_HEAD(&devlink->resource_list); @@ -8084,6 +8258,7 @@ void devlink_free(struct devlink *devlink) WARN_ON(!list_empty(&devlink->resource_list)); WARN_ON(!list_empty(&devlink->dpipe_table_list)); WARN_ON(!list_empty(&devlink->sb_list)); + WARN_ON(!list_empty(&devlink->linecard_list)); WARN_ON(!list_empty(&devlink->port_list)); xa_destroy(&devlink->snapshot_ids); @@ -8428,6 +8603,56 @@ static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port, return 0; } +/** + * devlink_linecard_create - Create devlink linecard + * + * @devlink: devlink + * @devlink_linecard: devlink linecard + * @linecard_index: driver-specific numerical identifier of the linecard + * + * Create devlink linecard instance with provided linecard index. + * Caller can use any indexing, even hw-related one. + */ +struct devlink_linecard *devlink_linecard_create(struct devlink *devlink, + unsigned int linecard_index) +{ + struct devlink_linecard *linecard; + + mutex_lock(&devlink->lock); + if (devlink_linecard_index_exists(devlink, linecard_index)) { + mutex_unlock(&devlink->lock); + return ERR_PTR(-EEXIST); + } + + linecard = kzalloc(sizeof(*linecard), GFP_KERNEL); + if (!linecard) + return ERR_PTR(-ENOMEM); + + linecard->devlink = devlink; + linecard->index = linecard_index; + list_add_tail(&linecard->list, &devlink->linecard_list); + mutex_unlock(&devlink->lock); + devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); + return linecard; +} +EXPORT_SYMBOL_GPL(devlink_linecard_create); + +/** + * devlink_linecard_destroy - Destroy devlink linecard + * + * @devlink_linecard: devlink linecard + */ +void devlink_linecard_destroy(struct devlink_linecard *linecard) +{ + struct devlink *devlink = linecard->devlink; + + devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_DEL); + mutex_lock(&devlink->lock); + list_del(&linecard->list); + mutex_unlock(&devlink->lock); +} +EXPORT_SYMBOL_GPL(devlink_linecard_destroy); + int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, u32 size, u16 ingress_pools_count, u16 egress_pools_count, u16 ingress_tc_count, From patchwork Fri Jan 22 09:46:41 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 369245 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AA6CCC433DB for ; Fri, 22 Jan 2021 10:30:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 617DA239EF for ; Fri, 22 Jan 2021 10:30:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727886AbhAVK2u (ORCPT ); Fri, 22 Jan 2021 05:28:50 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47958 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727168AbhAVJsP (ORCPT ); Fri, 22 Jan 2021 04:48:15 -0500 Received: from mail-wr1-x42a.google.com (mail-wr1-x42a.google.com [IPv6:2a00:1450:4864:20::42a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B8484C0612F2 for ; Fri, 22 Jan 2021 01:46:54 -0800 (PST) Received: by mail-wr1-x42a.google.com with SMTP id l12so4453255wry.2 for ; Fri, 22 Jan 2021 01:46:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=3CJBWdmmuIVGSAaJQ98fpqfgSJ52GyocxZJKQQiyfPA=; b=tZNFkAvwc+RAx2xah3HLCioBZ4UK5TOVmsipdA4FNObkJUq9HjpifXfEFyp/0nRERp Q8TrnO7MVrdRtpf/eQIHhD7sDm2Y6u4EvGB2RiaIJDXyu1PqogXdhyFQgJk0WGJBYuvT bsUlca2Ch83aVvgKrvXKHz7/xej6cvpGGPXjT+yPkEX1exfpLJqXmzt7UJzcELRb3v1P bH4r23zevgE3c0t+gBPnZPcmMn9mt3qf+f5gOayCLF5MdBRijlXKEcfnm35xXNLsamtP zTx/mvvCI7MPkUGqMFBe1cCUlH3sM+d2ZeKmvbcDPrO7YBVg1G+qiT3fjW79V+ToMTqO Mlrw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=3CJBWdmmuIVGSAaJQ98fpqfgSJ52GyocxZJKQQiyfPA=; b=YsXBxsmLEos8UxBpB7AcFVGUH9Kqtt55ekcmf3nkn002Zug9UZ4bTs80uo6z1RIYFL fy9LRw7kHpOXSNzIFSlJcfVEXmRAcHo0QfQL+XVcIAhMc7jJY4VXX+H+g4LYgDL6cToZ FfpIEOHj/O00PtW3wKxdCXo5AACDAl2AgN8t3aCJ4Jx+zmO3uPgdogvcWND+SYx1b+kE Cw8v2bWlrW5WeMtokhx5fzJfZgAP+cKFngn1XEPzKWIOvzgbF4tndhhi5/6pW86LKEPH +cXgraZntLu58iGnhkEe/3V7o1ls7SSjRbEVTz1cGcztGr9njOsCLBbDaDC4FE5GJFlw 5t1g== X-Gm-Message-State: AOAM530PuLsJmzPu54UeX3oJg0et9muQ5SkK5f7C/3s4J1VpDWlbXVxI dxRdOT9NFpZYHMnUDHb/StaGhm+cfUt+DUkRqKU= X-Google-Smtp-Source: ABdhPJw0XE7ycxCWYbSidwP5Zt+kEIWFqwR2j9SZqJxazBJuMqY048jtxecA/sv299+PzDCFQYntpQ== X-Received: by 2002:a5d:47ce:: with SMTP id o14mr3741925wrc.18.1611308813268; Fri, 22 Jan 2021 01:46:53 -0800 (PST) Received: from localhost ([85.163.43.78]) by smtp.gmail.com with ESMTPSA id s25sm12862897wrs.49.2021.01.22.01.46.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Jan 2021 01:46:52 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: davem@davemloft.net, kuba@kernel.org, jacob.e.keller@intel.com, roopa@nvidia.com, andrew@lunn.ch, dsahern@gmail.com, mlxsw@nvidia.com Subject: [patch net-next RFCv2 03/10] devlink: implement line card active state Date: Fri, 22 Jan 2021 10:46:41 +0100 Message-Id: <20210122094648.1631078-4-jiri@resnulli.us> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210122094648.1631078-1-jiri@resnulli.us> References: <20210122094648.1631078-1-jiri@resnulli.us> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jiri Pirko Allow driver to mark a linecard as active. Expose this state to the userspace over devlink netlink interface with proper notifications. Signed-off-by: Jiri Pirko --- RFC->RFCv2: - s/deactive/inactive in function comment - removed is_active() helper which is no longer needed --- include/net/devlink.h | 3 +++ include/uapi/linux/devlink.h | 1 + net/core/devlink.c | 30 ++++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/include/net/devlink.h b/include/net/devlink.h index bca3b2fc180a..f3b0e88add90 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -149,6 +149,7 @@ struct devlink_linecard { void *priv; enum devlink_linecard_state state; const char *type; + bool active; }; /** @@ -1445,6 +1446,8 @@ void devlink_linecard_provision_set(struct devlink_linecard *linecard, u32 type_index); void devlink_linecard_provision_clear(struct devlink_linecard *linecard); void devlink_linecard_provision_fail(struct devlink_linecard *linecard); +void devlink_linecard_activate(struct devlink_linecard *linecard); +void devlink_linecard_deactivate(struct devlink_linecard *linecard); int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, u32 size, u16 ingress_pools_count, u16 egress_pools_count, u16 ingress_tc_count, diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h index 24091391fa89..a27b20dc38b8 100644 --- a/include/uapi/linux/devlink.h +++ b/include/uapi/linux/devlink.h @@ -336,6 +336,7 @@ enum devlink_linecard_state { DEVLINK_LINECARD_STATE_PROVISIONING, DEVLINK_LINECARD_STATE_PROVISIONING_FAILED, DEVLINK_LINECARD_STATE_PROVISIONED, + DEVLINK_LINECARD_STATE_ACTIVE, __DEVLINK_LINECARD_STATE_MAX, DEVLINK_LINECARD_STATE_MAX = __DEVLINK_LINECARD_STATE_MAX - 1 diff --git a/net/core/devlink.c b/net/core/devlink.c index 2ff950da3417..1725820dd045 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -8826,6 +8826,36 @@ void devlink_linecard_provision_fail(struct devlink_linecard *linecard) } EXPORT_SYMBOL_GPL(devlink_linecard_provision_fail); +/** + * devlink_linecard_activate - Set linecard active + * + * @devlink_linecard: devlink linecard + */ +void devlink_linecard_activate(struct devlink_linecard *linecard) +{ + mutex_lock(&linecard->devlink->lock); + WARN_ON(linecard->state != DEVLINK_LINECARD_STATE_PROVISIONED); + linecard->state = DEVLINK_LINECARD_STATE_ACTIVE; + devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); + mutex_unlock(&linecard->devlink->lock); +} +EXPORT_SYMBOL_GPL(devlink_linecard_activate); + +/** + * devlink_linecard_deactivate - Set linecard inactive + * + * @devlink_linecard: devlink linecard + */ +void devlink_linecard_deactivate(struct devlink_linecard *linecard) +{ + mutex_lock(&linecard->devlink->lock); + WARN_ON(linecard->state != DEVLINK_LINECARD_STATE_ACTIVE); + linecard->state = DEVLINK_LINECARD_STATE_PROVISIONED; + devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); + mutex_unlock(&linecard->devlink->lock); +} +EXPORT_SYMBOL_GPL(devlink_linecard_deactivate); + int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, u32 size, u16 ingress_pools_count, u16 egress_pools_count, u16 ingress_tc_count, From patchwork Fri Jan 22 09:46:42 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 369250 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0843AC433E0 for ; Fri, 22 Jan 2021 09:50:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C5D6A239D4 for ; Fri, 22 Jan 2021 09:50:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727446AbhAVJtm (ORCPT ); Fri, 22 Jan 2021 04:49:42 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47608 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727687AbhAVJrv (ORCPT ); Fri, 22 Jan 2021 04:47:51 -0500 Received: from mail-wr1-x42e.google.com (mail-wr1-x42e.google.com [IPv6:2a00:1450:4864:20::42e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B84C9C06121C for ; Fri, 22 Jan 2021 01:46:55 -0800 (PST) Received: by mail-wr1-x42e.google.com with SMTP id a9so4437029wrt.5 for ; Fri, 22 Jan 2021 01:46:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=o5kBOYeQFHBf+oE2T+wnRwjh+YQp8rBeQBWMpv/8gTU=; b=JRh9RzZ4o2opZIjqkzk/MkXg6rEbotnmE6AJ+xuIpEFz0Q5JkTupwJAEIse/bWUzQx TGnsL+KX4leQvsLVB+gjIB+Zg56R0Rv/EaPFOnHcl8aAwkLDgXR+xUolIAXqithv+ak8 wJhtBeV9vv3U+KoERw52VTmfAIjPaSGqgW+F4Xg14FVkZGJI8dt+mKDEz2AXHV3XGyFQ PikPGB+E5uwxC5PaNRg2psrMervKQfalZ62jNUEoaBKAL90T1kfy4C0qJ25WTfEz/Uho obxd78idFcWDU3Em0FUcruSTO7+M/zpiDnWU31DMIvofrRMvE43NZ/aVp/gQBdxLxcU2 RKkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=o5kBOYeQFHBf+oE2T+wnRwjh+YQp8rBeQBWMpv/8gTU=; b=SeVnSCmcBvyDY70T0/ss8MyyPsN1FRfi4DkVGEDF7DVkE9RpLgpQrebNOLZjFU07pF WAYCcE4nwuBFCIObNHXX+HiPFxO5yiZQkLcB+vAmp07ozYgSO1ChI1SyHWNWjxPgsa1M D59749XCar3UYEq5TjTPq/FEzAYb/AksTLMYdTgsNgSuOmRdg3v5oRWPVpVkR+Jd6k1C K9H1Fy4LLiXXIkAhO1waYc0JkTiHqBfRfJ5p2L3tkteL9dZG/fJ6nb2xJ1i6oLZkYe51 c2IOpOQpLb3pHHAA3yuEXcMxoRaHpQFKdgpmUI7Ign+vkyYbfMstSldfkAdVY8xCRIp9 lhzA== X-Gm-Message-State: AOAM532f2jzoRGgVS8NCa3hVpihy9tT9rDZ5lYYQTHH+fzPsUcsqJiwY rkartO5nQmjZkyvowX61pnleYPaQ9JASbvtuo0c= X-Google-Smtp-Source: ABdhPJzrFmJsJPrkOWwoBjZ/4kFtBO4GS8YoS4lU8lezle9lQvRpoqbWeraYyEtXtaL4YIKldbhwvw== X-Received: by 2002:a5d:640c:: with SMTP id z12mr3591291wru.342.1611308814320; Fri, 22 Jan 2021 01:46:54 -0800 (PST) Received: from localhost ([85.163.43.78]) by smtp.gmail.com with ESMTPSA id a27sm11778515wrc.94.2021.01.22.01.46.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Jan 2021 01:46:53 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: davem@davemloft.net, kuba@kernel.org, jacob.e.keller@intel.com, roopa@nvidia.com, andrew@lunn.ch, dsahern@gmail.com, mlxsw@nvidia.com Subject: [patch net-next RFCv2 04/10] devlink: append split port number to the port name Date: Fri, 22 Jan 2021 10:46:42 +0100 Message-Id: <20210122094648.1631078-5-jiri@resnulli.us> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210122094648.1631078-1-jiri@resnulli.us> References: <20210122094648.1631078-1-jiri@resnulli.us> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jiri Pirko Instead of doing sprintf twice in case the port is split or not, append the split port suffix in case the port is split. Signed-off-by: Jiri Pirko --- net/core/devlink.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/net/core/devlink.c b/net/core/devlink.c index 1725820dd045..80fcfbb27024 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -8673,12 +8673,10 @@ static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port, switch (attrs->flavour) { case DEVLINK_PORT_FLAVOUR_PHYSICAL: case DEVLINK_PORT_FLAVOUR_VIRTUAL: - if (!attrs->split) - n = snprintf(name, len, "p%u", attrs->phys.port_number); - else - n = snprintf(name, len, "p%us%u", - attrs->phys.port_number, - attrs->phys.split_subport_number); + n = snprintf(name, len, "p%u", attrs->phys.port_number); + if (attrs->split) + n += snprintf(name + n, len - n, "s%u", + attrs->phys.split_subport_number); break; case DEVLINK_PORT_FLAVOUR_CPU: case DEVLINK_PORT_FLAVOUR_DSA: From patchwork Fri Jan 22 09:46:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 369246 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2854FC433E0 for ; Fri, 22 Jan 2021 10:29:52 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C8C0A239D4 for ; Fri, 22 Jan 2021 10:29:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727289AbhAVK25 (ORCPT ); Fri, 22 Jan 2021 05:28:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47964 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727343AbhAVJsQ (ORCPT ); Fri, 22 Jan 2021 04:48:16 -0500 Received: from mail-wr1-x42d.google.com (mail-wr1-x42d.google.com [IPv6:2a00:1450:4864:20::42d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EE65BC06121D for ; Fri, 22 Jan 2021 01:46:56 -0800 (PST) Received: by mail-wr1-x42d.google.com with SMTP id a1so4444773wrq.6 for ; Fri, 22 Jan 2021 01:46:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=uGaLH/m4247xtZVtEOxFS/w4e5oCslU42uUKUjQmMV4=; b=z2FU/7djy/8eTtAxO1RFPH5CnHupbmfpNgCP9RenW8pdIiCGj4Mj+S1ueZ53vuUwuM hzb8E4+6xY44A5vzYUpmwnPUALjq0xpopi+IA83WxiidIEabnFg117yR3yF7F4wN5Ol3 ZJN0SaLmFSTDhzQc+ugBgkvymZ5aPrz19D3dzqV9NjYiFal0XUqqpXRjW6/5wv5SrElf 6GWcyvnca5xy9hPIvgzHfyhqxx6H4mECcqWwnLXi3AFuQuZCH2suwwHSKUt/3XC7KZIQ 3Ekn3e2SvBabarB7oKlBbuboK+80g5M9KsXSOcd1jdMRPHHL3KHptv+0EyPXPcqwD3/d TeXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=uGaLH/m4247xtZVtEOxFS/w4e5oCslU42uUKUjQmMV4=; b=km1OlYa8e6XIHic/wxglflIIbcIaC/q0I01Vf03/oCzKLnApiT3I408CE7mwkhA44D e22IQuieVhIR1PTUo3/AYpJ/WzT4n8pA6nGB2C1EDOBuisBYF9vTe4GV0e/BAhMOxOHg 5ZEZGw/sVyaR46IV+t141Ky8oqGlJ1uGBE29MWtUax9hdIHcXWfiskNEnIuXiGIUeWLl LZB00YDzHBo3aAeW7qSnnbwDF9g4DKulD1YP+cQ1PUALk4JzycBnicXIPlIZ4gJtwOAP dFX4nkZRp8HRZEW5gqhluJkU7+o4Q81sjM8Hb+2AKIRuOtxXqehbbdpiTyFIS0JmYEdY 1mbw== X-Gm-Message-State: AOAM533qP/FYFCO8QkYkqAeDGsyLCYcaM/ism6JNXvGm8V/oT+gyH8mB uzEifCXhbL0oqKjc/6WEbGRiagfJstxwDF1mJXc= X-Google-Smtp-Source: ABdhPJz/cgH3SY3rASeSITOqeje/L6v67qTKHuPgOkHQflUul36+5DruVZkpdNELXOj32gH0irlYYA== X-Received: by 2002:a5d:6cb4:: with SMTP id a20mr3618789wra.192.1611308815474; Fri, 22 Jan 2021 01:46:55 -0800 (PST) Received: from localhost ([85.163.43.78]) by smtp.gmail.com with ESMTPSA id u16sm11685417wrn.68.2021.01.22.01.46.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Jan 2021 01:46:55 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: davem@davemloft.net, kuba@kernel.org, jacob.e.keller@intel.com, roopa@nvidia.com, andrew@lunn.ch, dsahern@gmail.com, mlxsw@nvidia.com Subject: [patch net-next RFCv2 05/10] devlink: add port to line card relationship set Date: Fri, 22 Jan 2021 10:46:43 +0100 Message-Id: <20210122094648.1631078-6-jiri@resnulli.us> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210122094648.1631078-1-jiri@resnulli.us> References: <20210122094648.1631078-1-jiri@resnulli.us> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jiri Pirko In order to properly inform user about relationship between port and line card, introduce a driver API to set line card for a port. Use this information to extend port devlink netlink message by line card index and also include the line card index into phys_port_name and by that into a netdevice name. Signed-off-by: Jiri Pirko --- include/net/devlink.h | 3 +++ net/core/devlink.c | 25 ++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/include/net/devlink.h b/include/net/devlink.h index f3b0e88add90..57293a18124a 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -137,6 +137,7 @@ struct devlink_port { struct delayed_work type_warn_dw; struct list_head reporter_list; struct mutex reporters_lock; /* Protects reporter_list */ + struct devlink_linecard *linecard; }; struct devlink_linecard_ops; @@ -1438,6 +1439,8 @@ void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, u32 contro u16 pf, bool external); void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, u32 controller, u16 pf, u16 vf, bool external); +void devlink_port_linecard_set(struct devlink_port *devlink_port, + struct devlink_linecard *linecard); struct devlink_linecard * devlink_linecard_create(struct devlink *devlink, unsigned int linecard_index, const struct devlink_linecard_ops *ops, void *priv); diff --git a/net/core/devlink.c b/net/core/devlink.c index 80fcfbb27024..1ec683383035 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -855,6 +855,10 @@ static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink, goto nla_put_failure; if (devlink_nl_port_function_attrs_put(msg, devlink_port, extack)) goto nla_put_failure; + if (devlink_port->linecard && + nla_put_u32(msg, DEVLINK_ATTR_LINECARD_INDEX, + devlink_port->linecard->index)) + goto nla_put_failure; genlmsg_end(msg, hdr); return 0; @@ -8661,6 +8665,21 @@ void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, u32 contro } EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_vf_set); +/** + * devlink_port_linecard_set - Link port with a linecard + * + * @devlink_port: devlink port + * @devlink_linecard: devlink linecard + */ +void devlink_port_linecard_set(struct devlink_port *devlink_port, + struct devlink_linecard *linecard) +{ + if (WARN_ON(devlink_port->registered)) + return; + devlink_port->linecard = linecard; +} +EXPORT_SYMBOL_GPL(devlink_port_linecard_set); + static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port, char *name, size_t len) { @@ -8673,7 +8692,11 @@ static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port, switch (attrs->flavour) { case DEVLINK_PORT_FLAVOUR_PHYSICAL: case DEVLINK_PORT_FLAVOUR_VIRTUAL: - n = snprintf(name, len, "p%u", attrs->phys.port_number); + if (devlink_port->linecard) + n = snprintf(name, len, "l%u", + devlink_port->linecard->index); + n += snprintf(name + n, len - n, "p%u", + attrs->phys.port_number); if (attrs->split) n += snprintf(name + n, len - n, "s%u", attrs->phys.split_subport_number); From patchwork Fri Jan 22 09:46:44 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 369249 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BF9D3C433E0 for ; Fri, 22 Jan 2021 09:51:57 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6238B239D4 for ; Fri, 22 Jan 2021 09:51:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727722AbhAVJvC (ORCPT ); Fri, 22 Jan 2021 04:51:02 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47610 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727686AbhAVJrw (ORCPT ); Fri, 22 Jan 2021 04:47:52 -0500 Received: from mail-wm1-x32a.google.com (mail-wm1-x32a.google.com [IPv6:2a00:1450:4864:20::32a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 260B3C06121E for ; Fri, 22 Jan 2021 01:46:58 -0800 (PST) Received: by mail-wm1-x32a.google.com with SMTP id v184so3772464wma.1 for ; Fri, 22 Jan 2021 01:46:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=chtmYzDo6YZa3nS5UTeYXFkh5EkhTkZCSDsjSSulFTk=; b=yHTVtlI3w7qfm8S9OCUGAFEVfeTlvBQTNfXbhESrGiJeUgwSks25GvJitKlVrMR/qT 1dHC98I63L53GErxBOVxgioaIIzF3ePhBYVTcNKwrd+2C+ZaJXhnYCYSboblaY9JjcIX WVla7c1I5mmmpUh6UhUmQ+qYVj2qstwxVXl9am2ttK1g7hsqmc9+kME74rvJB3KZT0QF osDaal7R/y4mc97OJfknRdFQx8ML6QpLp9rBZlZhXZaKiRQ5W5uMEUNlomDFc2Yh/9Lr LoIm8bWbPg20LV4zk+MNrxPdacfznNf5btvkA4U2SCAl1QKcvwe/F+nTmlKFdrqi0D0B FR4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=chtmYzDo6YZa3nS5UTeYXFkh5EkhTkZCSDsjSSulFTk=; b=otLP21M6U6/6G+F7LXA87MNxMhdaWzVEj3bthC2JQQ+STzmb7B2ejhf+Uc4S3dgvUj iCz6amzY2w67eRJovTTohAMTHoUpSZCYyCtdnPWyBZ1WWHsorU13lpxijp5p+7+O6b9e v5l+ifMhyvZtIlg1TVT7sVoVnwg6Ws/TOt0bY5pusM6WCDF48j00DPQHMrBZPaK+hnSO MkG342SkLR4aUxua6LUueE/xU1xgcbJXNxsrb6nGkooPFRg/jwl8t/QX5O1GHJw04ca4 mZG1fAsGVKZtitoVDA4e2v5OlAlxmleTbgz6AeZHz7OVCoG7fT7NJskp4jWh6yg4zysl 8ZgQ== X-Gm-Message-State: AOAM5301g7xXg55WRBch0six4cakgzU9EQtzqapz65DfIhVzLKkClalJ OjUL+RfWMfRe3iQJ9MdQev1qtupbOY9VYSeByYA= X-Google-Smtp-Source: ABdhPJz978LAL1E+PPe+J/gkVy5hsS+XLQYQS/4vY3uHZKQqsrdDY0HKN1kC/2YNcWvPtdQhwEnDqg== X-Received: by 2002:a1c:c903:: with SMTP id f3mr3069663wmb.69.1611308816604; Fri, 22 Jan 2021 01:46:56 -0800 (PST) Received: from localhost ([85.163.43.78]) by smtp.gmail.com with ESMTPSA id c11sm11335192wmd.36.2021.01.22.01.46.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Jan 2021 01:46:56 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: davem@davemloft.net, kuba@kernel.org, jacob.e.keller@intel.com, roopa@nvidia.com, andrew@lunn.ch, dsahern@gmail.com, mlxsw@nvidia.com Subject: [patch net-next RFCv2 06/10] netdevsim: introduce line card support Date: Fri, 22 Jan 2021 10:46:44 +0100 Message-Id: <20210122094648.1631078-7-jiri@resnulli.us> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210122094648.1631078-1-jiri@resnulli.us> References: <20210122094648.1631078-1-jiri@resnulli.us> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jiri Pirko Add support for line card objects. Expose them over debugfs and allow user to specify number of line cards to be created for a new device. Similar to ports, the number of line cards is fixed. Extend "new_device" sysfs file write by third number to allow to specify number line cards like this: $ echo "10 4 2" >/sys/bus/netdevsim/new_device This command asks to create two line cards. By default, if this number is not preset, no line card is created. Signed-off-by: Jiri Pirko --- drivers/net/netdevsim/bus.c | 17 +++-- drivers/net/netdevsim/dev.c | 108 +++++++++++++++++++++++++++++- drivers/net/netdevsim/netdevsim.h | 15 +++++ 3 files changed, 133 insertions(+), 7 deletions(-) diff --git a/drivers/net/netdevsim/bus.c b/drivers/net/netdevsim/bus.c index 0e9511661601..ed57c012e660 100644 --- a/drivers/net/netdevsim/bus.c +++ b/drivers/net/netdevsim/bus.c @@ -179,29 +179,34 @@ static struct device_type nsim_bus_dev_type = { }; static struct nsim_bus_dev * -nsim_bus_dev_new(unsigned int id, unsigned int port_count); +nsim_bus_dev_new(unsigned int id, unsigned int port_count, + unsigned int linecard_count); static ssize_t new_device_store(struct bus_type *bus, const char *buf, size_t count) { struct nsim_bus_dev *nsim_bus_dev; + unsigned int linecard_count; unsigned int port_count; unsigned int id; int err; - err = sscanf(buf, "%u %u", &id, &port_count); + err = sscanf(buf, "%u %u %u", &id, &port_count, &linecard_count); switch (err) { case 1: port_count = 1; fallthrough; case 2: + linecard_count = 0; + fallthrough; + case 3: if (id > INT_MAX) { pr_err("Value of \"id\" is too big.\n"); return -EINVAL; } break; default: - pr_err("Format for adding new device is \"id port_count\" (uint uint).\n"); + pr_err("Format for adding new device is \"id port_count linecard_count\" (uint uint uint).\n"); return -EINVAL; } @@ -212,7 +217,7 @@ new_device_store(struct bus_type *bus, const char *buf, size_t count) goto err; } - nsim_bus_dev = nsim_bus_dev_new(id, port_count); + nsim_bus_dev = nsim_bus_dev_new(id, port_count, linecard_count); if (IS_ERR(nsim_bus_dev)) { err = PTR_ERR(nsim_bus_dev); goto err; @@ -312,7 +317,8 @@ static struct bus_type nsim_bus = { }; static struct nsim_bus_dev * -nsim_bus_dev_new(unsigned int id, unsigned int port_count) +nsim_bus_dev_new(unsigned int id, unsigned int port_count, + unsigned int linecard_count) { struct nsim_bus_dev *nsim_bus_dev; int err; @@ -328,6 +334,7 @@ nsim_bus_dev_new(unsigned int id, unsigned int port_count) nsim_bus_dev->dev.bus = &nsim_bus; nsim_bus_dev->dev.type = &nsim_bus_dev_type; nsim_bus_dev->port_count = port_count; + nsim_bus_dev->linecard_count = linecard_count; nsim_bus_dev->initial_net = current->nsproxy->net_ns; mutex_init(&nsim_bus_dev->nsim_bus_reload_lock); /* Disallow using nsim_bus_dev */ diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c index 816af1f55e2c..d81ccfa05a28 100644 --- a/drivers/net/netdevsim/dev.c +++ b/drivers/net/netdevsim/dev.c @@ -203,6 +203,10 @@ static int nsim_dev_debugfs_init(struct nsim_dev *nsim_dev) nsim_dev->ports_ddir = debugfs_create_dir("ports", nsim_dev->ddir); if (IS_ERR(nsim_dev->ports_ddir)) return PTR_ERR(nsim_dev->ports_ddir); + nsim_dev->linecards_ddir = debugfs_create_dir("linecards", + nsim_dev->ddir); + if (IS_ERR(nsim_dev->linecards_ddir)) + return PTR_ERR(nsim_dev->linecards_ddir); debugfs_create_bool("fw_update_status", 0600, nsim_dev->ddir, &nsim_dev->fw_update_status); debugfs_create_u32("fw_update_overwrite_mask", 0600, nsim_dev->ddir, @@ -237,6 +241,7 @@ static int nsim_dev_debugfs_init(struct nsim_dev *nsim_dev) static void nsim_dev_debugfs_exit(struct nsim_dev *nsim_dev) { + debugfs_remove_recursive(nsim_dev->linecards_ddir); debugfs_remove_recursive(nsim_dev->ports_ddir); debugfs_remove_recursive(nsim_dev->ddir); } @@ -265,6 +270,32 @@ static void nsim_dev_port_debugfs_exit(struct nsim_dev_port *nsim_dev_port) debugfs_remove_recursive(nsim_dev_port->ddir); } +static int +nsim_dev_linecard_debugfs_init(struct nsim_dev *nsim_dev, + struct nsim_dev_linecard *nsim_dev_linecard) +{ + char linecard_ddir_name[16]; + char dev_link_name[32]; + + sprintf(linecard_ddir_name, "%u", nsim_dev_linecard->linecard_index); + nsim_dev_linecard->ddir = debugfs_create_dir(linecard_ddir_name, + nsim_dev->linecards_ddir); + if (IS_ERR(nsim_dev_linecard->ddir)) + return PTR_ERR(nsim_dev_linecard->ddir); + + sprintf(dev_link_name, "../../../" DRV_NAME "%u", + nsim_dev->nsim_bus_dev->dev.id); + debugfs_create_symlink("dev", nsim_dev_linecard->ddir, dev_link_name); + + return 0; +} + +static void +nsim_dev_linecard_debugfs_exit(struct nsim_dev_linecard *nsim_dev_linecard) +{ + debugfs_remove_recursive(nsim_dev_linecard->ddir); +} + static int nsim_dev_resources_register(struct devlink *devlink) { struct devlink_resource_size_params params = { @@ -998,6 +1029,64 @@ static int nsim_dev_port_add_all(struct nsim_dev *nsim_dev, return err; } +static int __nsim_dev_linecard_add(struct nsim_dev *nsim_dev, + unsigned int linecard_index) +{ + struct nsim_dev_linecard *nsim_dev_linecard; + int err; + + nsim_dev_linecard = kzalloc(sizeof(*nsim_dev_linecard), GFP_KERNEL); + if (!nsim_dev_linecard) + return -ENOMEM; + nsim_dev_linecard->nsim_dev = nsim_dev; + nsim_dev_linecard->linecard_index = linecard_index; + + err = nsim_dev_linecard_debugfs_init(nsim_dev, nsim_dev_linecard); + if (err) + goto err_linecard_free; + + list_add(&nsim_dev_linecard->list, &nsim_dev->linecard_list); + + return 0; + +err_linecard_free: + kfree(nsim_dev_linecard); + return err; +} + +static void __nsim_dev_linecard_del(struct nsim_dev_linecard *nsim_dev_linecard) +{ + list_del(&nsim_dev_linecard->list); + nsim_dev_linecard_debugfs_exit(nsim_dev_linecard); + kfree(nsim_dev_linecard); +} + +static void nsim_dev_linecard_del_all(struct nsim_dev *nsim_dev) +{ + struct nsim_dev_linecard *nsim_dev_linecard, *tmp; + + list_for_each_entry_safe(nsim_dev_linecard, tmp, + &nsim_dev->linecard_list, list) + __nsim_dev_linecard_del(nsim_dev_linecard); +} + +static int nsim_dev_linecard_add_all(struct nsim_dev *nsim_dev, + unsigned int linecard_count) +{ + int i, err; + + for (i = 0; i < linecard_count; i++) { + err = __nsim_dev_linecard_add(nsim_dev, i); + if (err) + goto err_linecard_del_all; + } + return 0; + +err_linecard_del_all: + nsim_dev_linecard_del_all(nsim_dev); + return err; +} + static int nsim_dev_reload_create(struct nsim_dev *nsim_dev, struct netlink_ext_ack *extack) { @@ -1009,6 +1098,7 @@ static int nsim_dev_reload_create(struct nsim_dev *nsim_dev, nsim_dev = devlink_priv(devlink); INIT_LIST_HEAD(&nsim_dev->port_list); mutex_init(&nsim_dev->port_list_lock); + INIT_LIST_HEAD(&nsim_dev->linecard_list); nsim_dev->fw_update_status = true; nsim_dev->fw_update_overwrite_mask = 0; @@ -1030,10 +1120,14 @@ static int nsim_dev_reload_create(struct nsim_dev *nsim_dev, if (err) goto err_traps_exit; - err = nsim_dev_port_add_all(nsim_dev, nsim_bus_dev->port_count); + err = nsim_dev_linecard_add_all(nsim_dev, nsim_bus_dev->linecard_count); if (err) goto err_health_exit; + err = nsim_dev_port_add_all(nsim_dev, nsim_bus_dev->port_count); + if (err) + goto err_linecard_del_all; + nsim_dev->take_snapshot = debugfs_create_file("take_snapshot", 0200, nsim_dev->ddir, @@ -1041,6 +1135,8 @@ static int nsim_dev_reload_create(struct nsim_dev *nsim_dev, &nsim_dev_take_snapshot_fops); return 0; +err_linecard_del_all: + nsim_dev_linecard_del_all(nsim_dev); err_health_exit: nsim_dev_health_exit(nsim_dev); err_traps_exit: @@ -1068,6 +1164,7 @@ int nsim_dev_probe(struct nsim_bus_dev *nsim_bus_dev) get_random_bytes(nsim_dev->switch_id.id, nsim_dev->switch_id.id_len); INIT_LIST_HEAD(&nsim_dev->port_list); mutex_init(&nsim_dev->port_list_lock); + INIT_LIST_HEAD(&nsim_dev->linecard_list); nsim_dev->fw_update_status = true; nsim_dev->fw_update_overwrite_mask = 0; nsim_dev->max_macs = NSIM_DEV_MAX_MACS_DEFAULT; @@ -1116,14 +1213,20 @@ int nsim_dev_probe(struct nsim_bus_dev *nsim_bus_dev) if (err) goto err_health_exit; - err = nsim_dev_port_add_all(nsim_dev, nsim_bus_dev->port_count); + err = nsim_dev_linecard_add_all(nsim_dev, nsim_bus_dev->linecard_count); if (err) goto err_bpf_dev_exit; + err = nsim_dev_port_add_all(nsim_dev, nsim_bus_dev->port_count); + if (err) + goto err_linecard_del_all; + devlink_params_publish(devlink); devlink_reload_enable(devlink); return 0; +err_linecard_del_all: + nsim_dev_linecard_del_all(nsim_dev); err_bpf_dev_exit: nsim_bpf_dev_exit(nsim_dev); err_health_exit: @@ -1156,6 +1259,7 @@ static void nsim_dev_reload_destroy(struct nsim_dev *nsim_dev) return; debugfs_remove(nsim_dev->take_snapshot); nsim_dev_port_del_all(nsim_dev); + nsim_dev_linecard_del_all(nsim_dev); nsim_dev_health_exit(nsim_dev); nsim_dev_traps_exit(devlink); nsim_dev_dummy_region_exit(nsim_dev); diff --git a/drivers/net/netdevsim/netdevsim.h b/drivers/net/netdevsim/netdevsim.h index 48163c5f2ec9..df10f9d11e9d 100644 --- a/drivers/net/netdevsim/netdevsim.h +++ b/drivers/net/netdevsim/netdevsim.h @@ -180,20 +180,33 @@ struct nsim_dev_health { int nsim_dev_health_init(struct nsim_dev *nsim_dev, struct devlink *devlink); void nsim_dev_health_exit(struct nsim_dev *nsim_dev); +struct nsim_dev_linecard; + struct nsim_dev_port { struct list_head list; struct devlink_port devlink_port; + struct nsim_dev_linecard *linecard; unsigned int port_index; struct dentry *ddir; struct netdevsim *ns; }; +struct nsim_dev; + +struct nsim_dev_linecard { + struct list_head list; + struct nsim_dev *nsim_dev; + unsigned int linecard_index; + struct dentry *ddir; +}; + struct nsim_dev { struct nsim_bus_dev *nsim_bus_dev; struct nsim_fib_data *fib_data; struct nsim_trap_data *trap_data; struct dentry *ddir; struct dentry *ports_ddir; + struct dentry *linecards_ddir; struct dentry *take_snapshot; struct bpf_offload_dev *bpf_dev; bool bpf_bind_accept; @@ -206,6 +219,7 @@ struct nsim_dev { struct netdev_phys_item_id switch_id; struct list_head port_list; struct mutex port_list_lock; /* protects port list */ + struct list_head linecard_list; bool fw_update_status; u32 fw_update_overwrite_mask; u32 max_macs; @@ -287,6 +301,7 @@ struct nsim_bus_dev { struct device dev; struct list_head list; unsigned int port_count; + unsigned int linecard_count; struct net *initial_net; /* Purpose of this is to carry net pointer * during the probe time only. */ From patchwork Fri Jan 22 09:46:46 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 369247 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DAB0CC433DB for ; Fri, 22 Jan 2021 10:28:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 9273E2376F for ; Fri, 22 Jan 2021 10:28:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727716AbhAVK14 (ORCPT ); Fri, 22 Jan 2021 05:27:56 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47696 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727717AbhAVJsN (ORCPT ); Fri, 22 Jan 2021 04:48:13 -0500 Received: from mail-wm1-x32e.google.com (mail-wm1-x32e.google.com [IPv6:2a00:1450:4864:20::32e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 55B35C061220 for ; Fri, 22 Jan 2021 01:47:00 -0800 (PST) Received: by mail-wm1-x32e.google.com with SMTP id m187so3708701wme.2 for ; Fri, 22 Jan 2021 01:47:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=kMnKgT+SQlYckkNyOccoRvPJo1WwKdsOM5DWodNKzXw=; b=uhrg4wFWaXh1ryF/RU4zcY5JJQpq0FpZlFOgeAaVD1BzpM9PBvIYTLkluDKsD1Unxi QZQ3cirHXNTWzZRKwYa0KBBmfXyq06xElzJCUdocM6WICtfJmrVDAKXrCH7QGsfbcHPH cBuuCJdv3oLo5LulSWZVKG5iRt+Pj0Wf327Tr5LlYeZxgxPUFr71vCxy80z57s/y5kx8 IiwhmWo5Lvdg/8fR4Dof4XFnHvTsRqyFqK9wLomgM/urqgWpUei96Krgg+RTq17zIwK3 RCBShfFIKrZs7B3HRRwZotQgLjqRaSKDwPwBdAngEDPBjfJQDNLW8ks28n6j0nkh+5mq wbcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=kMnKgT+SQlYckkNyOccoRvPJo1WwKdsOM5DWodNKzXw=; b=ekJ8EDsnIBe/4qs7zidNyhx++5hokMw0j2RWg/IfdstHaIPhzMTMRqdjuLcr8/1Inr +XgWI4zg45GYK7S+OWEPKMeP5BBGx6CKQd7ldv9jiMfzHWy1AR0XeGIyRp33Y7O6UoZw zgq0WHnO3zW9OzW67pTmSEiCuUsM1JCE+wHNLWQEP1rSlpkJt4A1qbIkMmEvoTr5rm6T 6D+IoKgApoIPLsRXdjq2JniLSWmVjo/wxUjwdYDOBY2e8j4S/ooQF4oTrxrVT9rfw/HL c2Ds+8wx8CqaqS3BClrsKQXeB3Wpwf3bhHDl8jRe0QaJX/ucyUxR9d0gjfsNoKnv9op5 hjfg== X-Gm-Message-State: AOAM531XbrG3+b2vIo12YxkPqWk9o9VPhm/laYMbK5akyoIIGjQs27Vw N1KOo25cbCIhltGen4M4Ery7zp3MXWRvW6/R6gM= X-Google-Smtp-Source: ABdhPJzatbCFinOwDCmMo+7KQNhlnjW4sHlrI9IHP96XLN6snpMQbXuS/1m8+jx/HXOZy4Djh6AZSg== X-Received: by 2002:a1c:e255:: with SMTP id z82mr3152773wmg.60.1611308818780; Fri, 22 Jan 2021 01:46:58 -0800 (PST) Received: from localhost ([85.163.43.78]) by smtp.gmail.com with ESMTPSA id p17sm10850062wmg.46.2021.01.22.01.46.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Jan 2021 01:46:58 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: davem@davemloft.net, kuba@kernel.org, jacob.e.keller@intel.com, roopa@nvidia.com, andrew@lunn.ch, dsahern@gmail.com, mlxsw@nvidia.com Subject: [patch net-next RFCv2 08/10] netdevsim: create devlink line card object and implement provisioning Date: Fri, 22 Jan 2021 10:46:46 +0100 Message-Id: <20210122094648.1631078-9-jiri@resnulli.us> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210122094648.1631078-1-jiri@resnulli.us> References: <20210122094648.1631078-1-jiri@resnulli.us> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jiri Pirko Use devlink_linecard_create/destroy() to register the line card with devlink core. Implement provisioning ops with a list of supported line cards. To avoid deadlock and to mimic actual HW flow, use workqueue to add/del ports during provisioning as the port add/del calls devlink_port_register/unregister() which take devlink mutex. Signed-off-by: Jiri Pirko --- RFC->RFCv2: - cancel work in linecard_del, have separate work for unprovision - call provision_set() without type - use provision_fail() helper in case provisioning was not successful --- drivers/net/netdevsim/dev.c | 135 +++++++++++++++++++++++++++++- drivers/net/netdevsim/netdevsim.h | 5 ++ 2 files changed, 139 insertions(+), 1 deletion(-) diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c index e706317fc0f9..84daef00073b 100644 --- a/drivers/net/netdevsim/dev.c +++ b/drivers/net/netdevsim/dev.c @@ -35,6 +35,20 @@ #include "netdevsim.h" +static const char * const nsim_dev_linecard_supported_types[] = { + "card1port", "card2ports", "card4ports", +}; + +static const unsigned int nsim_dev_linecard_port_counts[] = { + 1, 2, 4, +}; + +static unsigned int +nsim_dev_linecard_port_count(struct nsim_dev_linecard *nsim_dev_linecard) +{ + return nsim_dev_linecard_port_counts[nsim_dev_linecard->type_index]; +} + #define NSIM_DEV_LINECARD_PORT_INDEX_BASE 1000 #define NSIM_DEV_LINECARD_PORT_INDEX_STEP 100 @@ -285,6 +299,25 @@ static void nsim_dev_port_debugfs_exit(struct nsim_dev_port *nsim_dev_port) debugfs_remove_recursive(nsim_dev_port->ddir); } +static ssize_t nsim_dev_linecard_type_read(struct file *file, char __user *data, + size_t count, loff_t *ppos) +{ + struct nsim_dev_linecard *nsim_dev_linecard = file->private_data; + const char *type; + + if (!nsim_dev_linecard->provisioned) + return -EOPNOTSUPP; + + type = nsim_dev_linecard_supported_types[nsim_dev_linecard->type_index]; + return simple_read_from_buffer(data, count, ppos, type, strlen(type)); +} + +static const struct file_operations nsim_dev_linecard_type_fops = { + .open = simple_open, + .read = nsim_dev_linecard_type_read, + .owner = THIS_MODULE, +}; + static int nsim_dev_linecard_debugfs_init(struct nsim_dev *nsim_dev, struct nsim_dev_linecard *nsim_dev_linecard) @@ -301,6 +334,8 @@ nsim_dev_linecard_debugfs_init(struct nsim_dev *nsim_dev, sprintf(dev_link_name, "../../../" DRV_NAME "%u", nsim_dev->nsim_bus_dev->dev.id); debugfs_create_symlink("dev", nsim_dev_linecard->ddir, dev_link_name); + debugfs_create_file("type", 0400, nsim_dev_linecard->ddir, + nsim_dev_linecard, &nsim_dev_linecard_type_fops); return 0; } @@ -977,6 +1012,9 @@ static int __nsim_dev_port_add(struct nsim_dev *nsim_dev, memcpy(attrs.switch_id.id, nsim_dev->switch_id.id, nsim_dev->switch_id.id_len); attrs.switch_id.id_len = nsim_dev->switch_id.id_len; devlink_port_attrs_set(devlink_port, &attrs); + if (nsim_dev_linecard) + devlink_port_linecard_set(devlink_port, + nsim_dev_linecard->devlink_linecard); err = devlink_port_register(priv_to_devlink(nsim_dev), devlink_port, nsim_dev_port->port_index); if (err) @@ -1053,10 +1091,82 @@ static int nsim_dev_port_add_all(struct nsim_dev *nsim_dev, return err; } +static void nsim_dev_linecard_provision_work(struct work_struct *work) +{ + struct nsim_dev_linecard *nsim_dev_linecard; + struct nsim_bus_dev *nsim_bus_dev; + int err; + int i; + + nsim_dev_linecard = container_of(work, struct nsim_dev_linecard, + provision_work); + + nsim_bus_dev = nsim_dev_linecard->nsim_dev->nsim_bus_dev; + for (i = 0; i < nsim_dev_linecard_port_count(nsim_dev_linecard); i++) { + err = nsim_dev_port_add(nsim_bus_dev, nsim_dev_linecard, i); + if (err) + goto err_port_del_all; + } + nsim_dev_linecard->provisioned = true; + devlink_linecard_provision_set(nsim_dev_linecard->devlink_linecard, + nsim_dev_linecard->type_index); + return; + +err_port_del_all: + for (i--; i >= 0; i--) + nsim_dev_port_del(nsim_bus_dev, nsim_dev_linecard, i); + devlink_linecard_provision_fail(nsim_dev_linecard->devlink_linecard); +} + +static int nsim_dev_linecard_provision(struct devlink_linecard *linecard, + void *priv, u32 type_index, + struct netlink_ext_ack *extack) +{ + struct nsim_dev_linecard *nsim_dev_linecard = priv; + + nsim_dev_linecard->type_index = type_index; + schedule_work(&nsim_dev_linecard->provision_work); + return 0; +} + +static void nsim_dev_linecard_unprovision_work(struct work_struct *work) +{ + struct nsim_dev_linecard *nsim_dev_linecard; + struct nsim_bus_dev *nsim_bus_dev; + int i; + + nsim_dev_linecard = container_of(work, struct nsim_dev_linecard, + unprovision_work); + + nsim_bus_dev = nsim_dev_linecard->nsim_dev->nsim_bus_dev; + nsim_dev_linecard->provisioned = false; + devlink_linecard_provision_clear(nsim_dev_linecard->devlink_linecard); + for (i = 0; i < nsim_dev_linecard_port_count(nsim_dev_linecard); i++) + nsim_dev_port_del(nsim_bus_dev, nsim_dev_linecard, i); +} + +static int nsim_dev_linecard_unprovision(struct devlink_linecard *linecard, + void *priv, + struct netlink_ext_ack *extack) +{ + struct nsim_dev_linecard *nsim_dev_linecard = priv; + + schedule_work(&nsim_dev_linecard->unprovision_work); + return 0; +} + +static const struct devlink_linecard_ops nsim_dev_linecard_ops = { + .supported_types = nsim_dev_linecard_supported_types, + .supported_types_count = ARRAY_SIZE(nsim_dev_linecard_supported_types), + .provision = nsim_dev_linecard_provision, + .unprovision = nsim_dev_linecard_unprovision, +}; + static int __nsim_dev_linecard_add(struct nsim_dev *nsim_dev, unsigned int linecard_index) { struct nsim_dev_linecard *nsim_dev_linecard; + struct devlink_linecard *devlink_linecard; int err; nsim_dev_linecard = kzalloc(sizeof(*nsim_dev_linecard), GFP_KERNEL); @@ -1065,15 +1175,32 @@ static int __nsim_dev_linecard_add(struct nsim_dev *nsim_dev, nsim_dev_linecard->nsim_dev = nsim_dev; nsim_dev_linecard->linecard_index = linecard_index; INIT_LIST_HEAD(&nsim_dev_linecard->port_list); + INIT_WORK(&nsim_dev_linecard->provision_work, + nsim_dev_linecard_provision_work); + INIT_WORK(&nsim_dev_linecard->unprovision_work, + nsim_dev_linecard_unprovision_work); + + devlink_linecard = devlink_linecard_create(priv_to_devlink(nsim_dev), + linecard_index, + &nsim_dev_linecard_ops, + nsim_dev_linecard); + if (IS_ERR(devlink_linecard)) { + err = PTR_ERR(devlink_linecard); + goto err_linecard_free; + } + + nsim_dev_linecard->devlink_linecard = devlink_linecard; err = nsim_dev_linecard_debugfs_init(nsim_dev, nsim_dev_linecard); if (err) - goto err_linecard_free; + goto err_dl_linecard_destroy; list_add(&nsim_dev_linecard->list, &nsim_dev->linecard_list); return 0; +err_dl_linecard_destroy: + devlink_linecard_destroy(devlink_linecard); err_linecard_free: kfree(nsim_dev_linecard); return err; @@ -1081,8 +1208,14 @@ static int __nsim_dev_linecard_add(struct nsim_dev *nsim_dev, static void __nsim_dev_linecard_del(struct nsim_dev_linecard *nsim_dev_linecard) { + struct devlink_linecard *devlink_linecard = + nsim_dev_linecard->devlink_linecard; + + cancel_work_sync(&nsim_dev_linecard->provision_work); + cancel_work_sync(&nsim_dev_linecard->unprovision_work); list_del(&nsim_dev_linecard->list); nsim_dev_linecard_debugfs_exit(nsim_dev_linecard); + devlink_linecard_destroy(devlink_linecard); kfree(nsim_dev_linecard); } diff --git a/drivers/net/netdevsim/netdevsim.h b/drivers/net/netdevsim/netdevsim.h index 88b61b9390bf..01edff939c3a 100644 --- a/drivers/net/netdevsim/netdevsim.h +++ b/drivers/net/netdevsim/netdevsim.h @@ -196,10 +196,15 @@ struct nsim_dev; struct nsim_dev_linecard { struct list_head list; + struct devlink_linecard *devlink_linecard; struct nsim_dev *nsim_dev; struct list_head port_list; unsigned int linecard_index; struct dentry *ddir; + bool provisioned; + u32 type_index; + struct work_struct provision_work; + struct work_struct unprovision_work; }; struct nsim_dev {