From mboxrd@z Thu Jan 1 00:00:00 1970 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=-9.0 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,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 6F684C43381 for ; Fri, 1 Mar 2019 18:05:14 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 339FB20842 for ; Fri, 1 Mar 2019 18:05:14 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="sdiY2NLl" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387687AbfCASFN (ORCPT ); Fri, 1 Mar 2019 13:05:13 -0500 Received: from mail-qt1-f193.google.com ([209.85.160.193]:46411 "EHLO mail-qt1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728361AbfCASFL (ORCPT ); Fri, 1 Mar 2019 13:05:11 -0500 Received: by mail-qt1-f193.google.com with SMTP id z25so28732996qti.13 for ; Fri, 01 Mar 2019 10:05:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=kNikvpNuPpAdhRVCjclJWp/mkjggP251w4pIBjIW2yw=; b=sdiY2NLlatzE6Y0qdMDnfZtqGFTG79NXdhJR9cvzSDaA8JELX+9KvLxgEttmbHv51S k+l2nVcUBIGlenH3gT6gPIQwVAhRUI2M9LTa0ASEF4NOZwdqj9N/6U9JGE7qwb/+JwBD aeS1Wt+LR10lE3PcgMuwdE1oCl+qYBqizo45PPCM3ZFL9QAdENFUEmv5B6Rd2VL2VRj5 VOqw3Yd9r/s5NV7GH9CSyWNyyJ/08Mo9N1JQ2qYFhWvYaqq3Brq327TMCye4Y9l0hfpJ zDBXvWYiFZvmLHgWeksjo+Xs7bYEs3QTi06dmeXeGnddK4b3UOYMFgV0b5jvCP60IDaL 8rzA== 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=kNikvpNuPpAdhRVCjclJWp/mkjggP251w4pIBjIW2yw=; b=BdxnXOUuWTOT40K9IK64PCGPtbzaHZoEdWiIB27GMzut51H9nA3mip7gDuw7dY7ofN 83PagubupDbaoRxoXRecMqbBfRWjRW7sylHTHN59pW8Jo/1bdGZGrUeGsTV/ycfiFwqc rgKQWTyYCfYh8QThei4sLmIphaKqb2EQvfROjfbR5u8MDMH1eEFQ4IhXdfSngdpQ6d2T qJwxAn/l1jm03th7inQIeGMzNQWmU5nitxudyAvdO4HgdyJArsraRy6BrJXlrUQ6OVlO /YCqQf//hhO/2fsbQLKKQKiCO18sU+LjcNTNVgvR8HWq2OLJ+/BjcJrT97kThctRoOP6 cFzg== X-Gm-Message-State: APjAAAXT7J+Ru5n1ykQpxRJSMPrTA/dkbPXMZqzFqOFXP7MBxPvn+rU+ mx1PgCbu0hz89YT8HJ38dQIsmA== X-Google-Smtp-Source: APXvYqxVuAi/BWaynPNCrOZCzBmteOwfWW/yPe33ipqZ5rceFoKrA/7Qk2PGdnayXw1oLgiWAA3RBQ== X-Received: by 2002:ac8:1497:: with SMTP id l23mr4988343qtj.296.1551463509459; Fri, 01 Mar 2019 10:05:09 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([66.60.152.14]) by smtp.gmail.com with ESMTPSA id a13sm16785792qtb.6.2019.03.01.10.05.08 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 01 Mar 2019 10:05:08 -0800 (PST) From: Jakub Kicinski To: jiri@resnulli.us, davem@davemloft.net Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Jakub Kicinski Subject: [PATCH net-next v2 2/7] devlink: add PF and VF port flavours Date: Fri, 1 Mar 2019 10:04:48 -0800 Message-Id: <20190301180453.17778-3-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190301180453.17778-1-jakub.kicinski@netronome.com> References: <20190301180453.17778-1-jakub.kicinski@netronome.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Current port flavours cover simple switches and DSA. Add PF and VF flavours to cover "switchdev" SR-IOV NICs. Example devlink user space output: $ devlink port pci/0000:82:00.0/0: type eth netdev p4p1 flavour physical pci/0000:82:00.0/10000: type eth netdev eth0 flavour pci_pf pf 0 pci/0000:82:00.0/10001: type eth netdev eth1 flavour pci_vf pf 0 vf 0 pci/0000:82:00.0/10002: type eth netdev eth2 flavour pci_vf pf 0 vf 1 $ devlink -jp port { "port": { "pci/0000:82:00.0/0": { "type": "eth", "netdev": "p4p1", "flavour": "physical" }, "pci/0000:82:00.0/10000": { "type": "eth", "netdev": "eth0", "flavour": "pci_pf", "pf": 0, }, "pci/0000:82:00.0/10001": { "type": "eth", "netdev": "eth1", "flavour": "pci_vf", "pf": 0, "vf": 0 }, "pci/0000:82:00.0/10002": { "type": "eth", "netdev": "eth2", "flavour": "pci_vf", "pf": 0, "vf": 1 } } } v2: - fix old output in commit message s/pcie_/pci_/ (Jiri); - split the pci helper into separate ones for PF and VF (Jiri); - flip the condition in WARN_ON for devlink_port_attrs_set() to whitelist from blacklist. Signed-off-by: Jakub Kicinski --- include/net/devlink.h | 32 +++++++++++-- include/uapi/linux/devlink.h | 5 ++ net/core/devlink.c | 88 ++++++++++++++++++++++++++++++++---- 3 files changed, 113 insertions(+), 12 deletions(-) diff --git a/include/net/devlink.h b/include/net/devlink.h index 7f5a0bdca228..00ceff76762c 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -42,9 +42,19 @@ struct devlink { struct devlink_port_attrs { bool set; enum devlink_port_flavour flavour; - u32 port_number; /* same value as "split group" */ - bool split; - u32 split_subport_number; + union { /* port identifiers differ per-flavour */ + /* PHYSICAL, CPU, DSA */ + struct { + bool split; + u32 split_subport_number; + u32 port_number; /* same value as "split group" */ + }; + /* PCI_PF, PCI_VF */ + struct { + u32 pf_number; + u32 vf_number; + } pci; + }; }; struct devlink_port { @@ -568,6 +578,10 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port, enum devlink_port_flavour flavour, u32 port_number, bool split, u32 split_subport_number); +void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, + u32 pf_number); +void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, + u32 pf_number, u32 vf_number); int devlink_port_get_phys_port_name(struct devlink_port *devlink_port, char *name, size_t len); int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, @@ -782,6 +796,18 @@ static inline void devlink_port_attrs_set(struct devlink_port *devlink_port, { } +static inline void +devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, + u32 pf_number) +{ +} + +static inline void +devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, + u32 pf_number, u32 vf_number) +{ +} + static inline int devlink_port_get_phys_port_name(struct devlink_port *devlink_port, char *name, size_t len) diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h index 5bb4ea67d84f..9ce76d4f640d 100644 --- a/include/uapi/linux/devlink.h +++ b/include/uapi/linux/devlink.h @@ -167,6 +167,8 @@ enum devlink_port_flavour { DEVLINK_PORT_FLAVOUR_DSA, /* Distributed switch architecture * interconnect port. */ + DEVLINK_PORT_FLAVOUR_PCI_PF, /* PCI Physical function port */ + DEVLINK_PORT_FLAVOUR_PCI_VF, /* PCI Physical function port */ }; enum devlink_param_cmode { @@ -332,6 +334,9 @@ enum devlink_attr { DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME, /* string */ DEVLINK_ATTR_FLASH_UPDATE_COMPONENT, /* string */ + DEVLINK_ATTR_PORT_PCI_PF_NUMBER, /* u32 */ + DEVLINK_ATTR_PORT_PCI_VF_NUMBER, /* 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 6515fbec0dcd..49216b688c5b 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -516,16 +516,35 @@ static int devlink_nl_port_attrs_put(struct sk_buff *msg, return 0; if (nla_put_u16(msg, DEVLINK_ATTR_PORT_FLAVOUR, attrs->flavour)) return -EMSGSIZE; - if (nla_put_u32(msg, DEVLINK_ATTR_PORT_NUMBER, attrs->port_number)) - return -EMSGSIZE; - if (!attrs->split) + + switch (attrs->flavour) { + case DEVLINK_PORT_FLAVOUR_PHYSICAL: + case DEVLINK_PORT_FLAVOUR_CPU: + case DEVLINK_PORT_FLAVOUR_DSA: + if (nla_put_u32(msg, DEVLINK_ATTR_PORT_NUMBER, + attrs->port_number)) + return -EMSGSIZE; + + if (attrs->split && + (nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_GROUP, + attrs->port_number) || + nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER, + attrs->split_subport_number))) + return -EMSGSIZE; return 0; - if (nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_GROUP, attrs->port_number)) - return -EMSGSIZE; - if (nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER, - attrs->split_subport_number)) - return -EMSGSIZE; - return 0; + case DEVLINK_PORT_FLAVOUR_PCI_VF: + if (nla_put_u32(msg, DEVLINK_ATTR_PORT_PCI_VF_NUMBER, + attrs->pci.vf_number)) + return -EMSGSIZE; + /* fall through */ + case DEVLINK_PORT_FLAVOUR_PCI_PF: + if (nla_put_u32(msg, DEVLINK_ATTR_PORT_PCI_PF_NUMBER, + attrs->pci.pf_number)) + return -EMSGSIZE; + return 0; + default: + return -EINVAL; + } } static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink, @@ -5411,6 +5430,10 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port, { struct devlink_port_attrs *attrs = &devlink_port->attrs; + WARN_ON(flavour != DEVLINK_PORT_FLAVOUR_PHYSICAL && + flavour != DEVLINK_PORT_FLAVOUR_CPU && + flavour != DEVLINK_PORT_FLAVOUR_DSA); + attrs->set = true; attrs->flavour = flavour; attrs->port_number = port_number; @@ -5420,6 +5443,46 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port, } EXPORT_SYMBOL_GPL(devlink_port_attrs_set); +/** + * devlink_port_attrs_pci_pf_set - Set port attributes for a PCI PF port + * + * @devlink_port: devlink port + * @pf_number: PCI PF number, in multi-host mapping to hosts depends + * on the platform + */ +void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, + u32 pf_number) +{ + struct devlink_port_attrs *attrs = &devlink_port->attrs; + + attrs->set = true; + attrs->flavour = DEVLINK_PORT_FLAVOUR_PCI_PF; + attrs->pci.pf_number = pf_number; + devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW); +} +EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_pf_set); + +/** + * devlink_port_attrs_pci_vf_set - Set port attributes for a PCI VF port + * + * @devlink_port: devlink port + * @pf_number: PCI PF number, in multi-host mapping to hosts depends + * on the platform + * @vf_number: PCI VF number within given PF (ignored for PF itself) + */ +void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, + u32 pf_number, u32 vf_number) +{ + struct devlink_port_attrs *attrs = &devlink_port->attrs; + + attrs->set = true; + attrs->flavour = DEVLINK_PORT_FLAVOUR_PCI_VF; + attrs->pci.pf_number = pf_number; + attrs->pci.vf_number = vf_number; + devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW); +} +EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_vf_set); + int devlink_port_get_phys_port_name(struct devlink_port *devlink_port, char *name, size_t len) { @@ -5444,6 +5507,13 @@ int devlink_port_get_phys_port_name(struct devlink_port *devlink_port, */ WARN_ON(1); return -EINVAL; + case DEVLINK_PORT_FLAVOUR_PCI_PF: + n = snprintf(name, len, "pf%u", attrs->pci.pf_number); + break; + case DEVLINK_PORT_FLAVOUR_PCI_VF: + n = snprintf(name, len, "pf%uvf%u", + attrs->pci.pf_number, attrs->pci.vf_number); + break; } if (n >= len) -- 2.19.2