From patchwork Fri Mar 1 18:04:47 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 1050319 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="cEsCGM20"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 449y4m0TWhz9s1B for ; Sat, 2 Mar 2019 05:05:12 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1733137AbfCASFK (ORCPT ); Fri, 1 Mar 2019 13:05:10 -0500 Received: from mail-qt1-f193.google.com ([209.85.160.193]:35028 "EHLO mail-qt1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727492AbfCASFJ (ORCPT ); Fri, 1 Mar 2019 13:05:09 -0500 Received: by mail-qt1-f193.google.com with SMTP id p48so28806479qtk.2 for ; Fri, 01 Mar 2019 10:05:08 -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=LwyaoMTc0583VDcl6/eRBBSG+wKQpUsn8AvrJrTaxgc=; b=cEsCGM20xaKZAzMmhcKR2M/O8abrpx1otgk35s3NvFTegee/S+RNuyuDYcsh2Nq3Zm VKTv6TCCCyunfBsaaEcXTMGx2ccwZvaiJ8gXoxh+ULcm6jocy4eAWZYcHBWXzeLGbxY0 OqHpu2jKJaYi8T2pVvExfWPfhKn2N84qRMHls/A7nu2D3bFo0Fr+pvhogPZu6Mt+bKES qA2PZ73Js+JN+dCY7S6I2QnWb9PRDVbgPQc5jkjaBz0M9HyssR3vIqo24In+6AMxsJoi ul3IkuRfo4ZoYDXf2v6BNTQeZHXpiuUBdsw2jP9qME/L9tTi8aXvIlymHTFNvPKFYHf4 Q8yw== 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=LwyaoMTc0583VDcl6/eRBBSG+wKQpUsn8AvrJrTaxgc=; b=DjREyLfQ4tvmnCujaMtzovADlfms89HsEAxkNiU0Cc+q+RsCCPXzaAHMGLFef89KP1 Sy0yowM7UB75aeE9ZwxFgqQpQpQLj9TNNO4baTbyndbZlIpm/Ks7g7UD9DM3zHvbjS+y HyHwMJp1VRbogH2KNw+RF5VR00j2y5ykSm4gN/bL2P0U0Wy5dNaYQTkjIGJwvEoE9czm neyZTB8g2uzilj0DFf7tsnQf3T0Z/L9v7kq9Gix5qBqjaTjW9mW0q+2VkInmaRaCAMbJ RwxFJtOBxMf6Tu8p/gZM2ypJHIhUUJlH24EZTtdyB6eI1noKwRepHt1DI7Wcx/0ryr0S cIKg== X-Gm-Message-State: APjAAAV4awWb1iJnsyaW1SDAq4iwWp7C2WsPvIrkbsTMjLiM56ZziGUC 3NIbsF3cXxLQIZyAgUr/4P1Ilg== X-Google-Smtp-Source: APXvYqzDZ1csjl5WwVul5RLwXOB9/Qq0As1Yt01gw15TxMMxZwhqokzymq7bPBBxAyc/tZwsXZXJ2A== X-Received: by 2002:ac8:372b:: with SMTP id o40mr4978561qtb.73.1551463508055; Fri, 01 Mar 2019 10:05:08 -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.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 01 Mar 2019 10:05:07 -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 1/7] nfp: split devlink port init from registration Date: Fri, 1 Mar 2019 10:04:47 -0800 Message-Id: <20190301180453.17778-2-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 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In the future we want to switch to using the devlink_port_get_phys_port_name() helper for .ndo_phys_port_name. This requires that we initialize the devlink ports before the netdevs are registered. Split the registration from init. Signed-off-by: Jakub Kicinski --- .../net/ethernet/netronome/nfp/nfp_devlink.c | 13 ++++++++++--- .../net/ethernet/netronome/nfp/nfp_net_main.c | 17 ++++++++++++++--- drivers/net/ethernet/netronome/nfp/nfp_port.h | 2 ++ 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c index e9eca99cf493..9af3cb1f2f17 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c @@ -350,10 +350,9 @@ const struct devlink_ops nfp_devlink_ops = { .flash_update = nfp_devlink_flash_update, }; -int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port) +int nfp_devlink_port_init(struct nfp_app *app, struct nfp_port *port) { struct nfp_eth_table_port eth_port; - struct devlink *devlink; int ret; rtnl_lock(); @@ -366,8 +365,16 @@ int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port) devlink_port_attrs_set(&port->dl_port, DEVLINK_PORT_FLAVOUR_PHYSICAL, eth_port.label_port, eth_port.is_split, eth_port.label_subport); + return 0; +} + +void nfp_devlink_port_clean(struct nfp_port *port) +{ +} - devlink = priv_to_devlink(app->pf); +int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port) +{ + struct devlink *devlink = priv_to_devlink(app->pf); return devlink_port_register(devlink, &port->dl_port, port->eth_id); } diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c index 08f5fdbd8e41..39e87bb73ebf 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c @@ -150,9 +150,15 @@ nfp_net_pf_init_vnic(struct nfp_pf *pf, struct nfp_net *nn, unsigned int id) nn->id = id; + if (nn->port) { + err = nfp_devlink_port_init(pf->app, nn->port); + if (err) + return err; + } + err = nfp_net_init(nn); if (err) - return err; + goto err_port_clean; nfp_net_debugfs_vnic_add(nn, pf->ddir); @@ -167,17 +173,20 @@ nfp_net_pf_init_vnic(struct nfp_pf *pf, struct nfp_net *nn, unsigned int id) if (nfp_net_is_data_vnic(nn)) { err = nfp_app_vnic_init(pf->app, nn); if (err) - goto err_devlink_port_clean; + goto err_port_unreg; } return 0; -err_devlink_port_clean: +err_port_unreg: if (nn->port) nfp_devlink_port_unregister(nn->port); err_dfs_clean: nfp_net_debugfs_dir_clean(&nn->debugfs_dir); nfp_net_clean(nn); +err_port_clean: + if (nn->port) + nfp_devlink_port_clean(nn->port); return err; } @@ -224,6 +233,8 @@ static void nfp_net_pf_clean_vnic(struct nfp_pf *pf, struct nfp_net *nn) nfp_devlink_port_unregister(nn->port); nfp_net_debugfs_dir_clean(&nn->debugfs_dir); nfp_net_clean(nn); + if (nn->port) + nfp_devlink_port_clean(nn->port); } static int nfp_net_pf_alloc_irqs(struct nfp_pf *pf) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_port.h b/drivers/net/ethernet/netronome/nfp/nfp_port.h index 90ae053f5c07..09c55ca2371a 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_port.h +++ b/drivers/net/ethernet/netronome/nfp/nfp_port.h @@ -129,6 +129,8 @@ int nfp_net_refresh_eth_port(struct nfp_port *port); void nfp_net_refresh_port_table(struct nfp_port *port); int nfp_net_refresh_port_table_sync(struct nfp_pf *pf); +int nfp_devlink_port_init(struct nfp_app *app, struct nfp_port *port); +void nfp_devlink_port_clean(struct nfp_port *port); int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port); void nfp_devlink_port_unregister(struct nfp_port *port); From patchwork Fri Mar 1 18:04:48 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 1050320 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="sdiY2NLl"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 449y4p2bX9z9s1B for ; Sat, 2 Mar 2019 05:05:14 +1100 (AEDT) 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 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) From patchwork Fri Mar 1 18:04:49 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 1050325 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="OW4sVh+i"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 449y516WDgz9s1B for ; Sat, 2 Mar 2019 05:05:25 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388900AbfCASFY (ORCPT ); Fri, 1 Mar 2019 13:05:24 -0500 Received: from mail-qt1-f195.google.com ([209.85.160.195]:36510 "EHLO mail-qt1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727492AbfCASFM (ORCPT ); Fri, 1 Mar 2019 13:05:12 -0500 Received: by mail-qt1-f195.google.com with SMTP id p25so28805329qtb.3 for ; Fri, 01 Mar 2019 10:05:11 -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=NjwyXG2XAyk0TtIYpiQ8WnRY5fjnrDmJOhK41BFxtwY=; b=OW4sVh+i3gXDMQ1+Fz6gvWydKBQJT9UebiFwqTWxb6xGSgfRbLJI8nJpy/oUbjI5iM c3Dphpi4UWcxKg6gp73KbY633yP7WN7Jr4VsYJCGpEyI2JYM+ApZM+vhqMenc1Kgfcps HiXKi04GAycd8zHNSSnIT0eFwrreLVVud4iQrw3mq+29VSFzJhWeLKUZcOauIsdRlfIB 6JU17dBJ/T17Okmz6NbLF8uPqNr8z9h/XnAqO77/QJDlcBrXt0G7QskjRuxfqgypXztS Qk0khm4uNbrpO2eW+XK/NDPizmwjtFSnuJLd9yaKygwp7xucs3MuP0powHDYcwxnv6jH 8/8w== 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=NjwyXG2XAyk0TtIYpiQ8WnRY5fjnrDmJOhK41BFxtwY=; b=iSnk3ERiaiI2Eb4qn+omHe6mNRzQHNEtROxnptd+IoTaejnEcAAZZoySs71zZzkvgS Er/O8ZvBErB5uqBpRa8tqqfTNSadOYr4wZF3m907o+KWh0H+BRLIubk03Y3CWzHkty8D cWY6t2phFJMApd42stU19Dfc7PlZBX6UXtKd6vMuhWR6NZkQcpgpHIcQBr18sBHWz/6g Afwq63pbAzU6vLlz6scvtPbUlW2KLLY0mmu11PzimhZAV/Mkt1rKpRr4gvSDftXyB/9w Yy5c9zIKLSdG/kRZnClQ6pV2dU5rncMG4HqTTzsqAVgNp8YMsuwyVS7qCV9NWnt0O3Eh Woeg== X-Gm-Message-State: APjAAAV5X5hOKq+Mx6kGZ/BlA7S3qHMMv5E+sfBW//IvJ5oK5oUJJQa3 JwtOVAI+B5wgfZTeJQ7gMc4R8Q== X-Google-Smtp-Source: APXvYqwhoNUHtMDeXzxHWpwi705ivRCHOs5iUSAVc3a4KKZvECgy0R8BaPsme1gcwJ9lr/DsVECcMQ== X-Received: by 2002:aed:2206:: with SMTP id n6mr5175072qtc.28.1551463510854; Fri, 01 Mar 2019 10:05:10 -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.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 01 Mar 2019 10:05:10 -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 3/7] nfp: register devlink ports of all reprs Date: Fri, 1 Mar 2019 10:04:49 -0800 Message-Id: <20190301180453.17778-4-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 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Register all representors as devlink ports. The port_index is slightly tricky to figure out, we use a bit of arbitrary math to create unique IDs for PCI ports. Signed-off-by: Jakub Kicinski --- .../net/ethernet/netronome/nfp/nfp_devlink.c | 40 ++++++++++++++++++- .../net/ethernet/netronome/nfp/nfp_net_repr.c | 16 +++++++- 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c index 9af3cb1f2f17..bf7fd9614152 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c @@ -350,7 +350,8 @@ const struct devlink_ops nfp_devlink_ops = { .flash_update = nfp_devlink_flash_update, }; -int nfp_devlink_port_init(struct nfp_app *app, struct nfp_port *port) +static int +nfp_devlink_port_init_phys(struct devlink *devlink, struct nfp_port *port) { struct nfp_eth_table_port eth_port; int ret; @@ -368,6 +369,27 @@ int nfp_devlink_port_init(struct nfp_app *app, struct nfp_port *port) return 0; } +int nfp_devlink_port_init(struct nfp_app *app, struct nfp_port *port) +{ + struct devlink *devlink = priv_to_devlink(app->pf); + + switch (port->type) { + case NFP_PORT_PHYS_PORT: + return nfp_devlink_port_init_phys(devlink, port); + case NFP_PORT_PF_PORT: + devlink_port_type_eth_set(&port->dl_port, port->netdev); + devlink_port_attrs_pci_pf_set(&port->dl_port, port->pf_id); + return 0; + case NFP_PORT_VF_PORT: + devlink_port_type_eth_set(&port->dl_port, port->netdev); + devlink_port_attrs_pci_vf_set(&port->dl_port, port->pf_id, + port->vf_id); + return 0; + default: + return -EINVAL; + } +} + void nfp_devlink_port_clean(struct nfp_port *port) { } @@ -376,7 +398,21 @@ int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port) { struct devlink *devlink = priv_to_devlink(app->pf); - return devlink_port_register(devlink, &port->dl_port, port->eth_id); + switch (port->type) { + case NFP_PORT_PHYS_PORT: + return devlink_port_register(devlink, &port->dl_port, + port->eth_id); + case NFP_PORT_PF_PORT: + return devlink_port_register(devlink, &port->dl_port, + (port->pf_id + 1) * 10000 + + port->pf_split_id * 1000); + case NFP_PORT_VF_PORT: + return devlink_port_register(devlink, &port->dl_port, + (port->pf_id + 1) * 10000 + + port->vf_id + 1); + default: + return -EINVAL; + } } void nfp_devlink_port_unregister(struct nfp_port *port) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c b/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c index d2c803bb4e56..869d22760a6e 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c @@ -292,7 +292,9 @@ nfp_repr_transfer_features(struct net_device *netdev, struct net_device *lower) static void nfp_repr_clean(struct nfp_repr *repr) { + nfp_devlink_port_unregister(repr->port); unregister_netdev(repr->netdev); + nfp_devlink_port_clean(repr->port); nfp_app_repr_clean(repr->app, repr->netdev); dst_release((struct dst_entry *)repr->dst); nfp_port_free(repr->port); @@ -395,12 +397,24 @@ int nfp_repr_init(struct nfp_app *app, struct net_device *netdev, if (err) goto err_clean; - err = register_netdev(netdev); + err = nfp_devlink_port_init(app, repr->port); if (err) goto err_repr_clean; + err = register_netdev(netdev); + if (err) + goto err_port_clean; + + err = nfp_devlink_port_register(app, repr->port); + if (err) + goto err_unreg_netdev; + return 0; +err_unreg_netdev: + unregister_netdev(repr->netdev); +err_port_clean: + nfp_devlink_port_clean(repr->port); err_repr_clean: nfp_app_repr_clean(app, netdev); err_clean: From patchwork Fri Mar 1 18:04:50 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 1050321 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="WcUqc2vl"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 449y4r2yDhz9s1B for ; Sat, 2 Mar 2019 05:05:16 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387795AbfCASFP (ORCPT ); Fri, 1 Mar 2019 13:05:15 -0500 Received: from mail-qt1-f196.google.com ([209.85.160.196]:34645 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1733302AbfCASFO (ORCPT ); Fri, 1 Mar 2019 13:05:14 -0500 Received: by mail-qt1-f196.google.com with SMTP id w4so28847380qtc.1 for ; Fri, 01 Mar 2019 10:05:12 -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=dkxqCcKmcbbKbQf4+9VKf9QHumM0dteS/XLBhbo1Djg=; b=WcUqc2vl7LNuyw/vwg8VNPRyoJL0U3rs+Za10AroFd136ITcLr0HxWZV1eVa2boDqS Rdov4hnRLTjYStyYjNlNySJZgwKEqqyr9qG5Z8rk6CC0tbVOnZ9NHJ4Et4IbZbo+cJre SJZrl/ckCfkYoIl5tXQJEZwdAZd4HUKfR8xDHl8oOHjLfFOj0wxdc/3u8lXN23SbvwT+ Ud6VnLZn9nju1NNKS2XSDJH2gFJDDjMfkIX5DvprW+dLOvEyrJghCOu6tv/80NBTicO3 NWi4chZCh4zfeplJ/+1FOxsXtPZCw4XtZbmiGfhF+e9VkTrWKT/IeM7jDPq7ljC/d9HX JhEA== 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=dkxqCcKmcbbKbQf4+9VKf9QHumM0dteS/XLBhbo1Djg=; b=bqszHWKcnAJExmJ+KCz+BNCrOFbThtGEyEfkju8+Pi5++r8hAVAuhS1lzbEmkSK/+i dHa+86qKN3WWxWG6u0NDuAfPSwvKICj/xPLc8wg7gfnqPRdOEjUg/5NYeIbFwS7Ym9lU RUu1EF9Rf0MjguGqrIg8Phaf8PzvzlHdtGd6Z4nO1Z6OV0jeizYhM7oC6Yju7CC6g8t9 efxgvFht7Cgkk5iUmylflF4btZBCyJzS5aIpdfQio/XA3wXmV8wz3s3F5oA2oN89XGbK J+8lyRl3BG/JojMndNcavpRvvcgovHJYpGGahsfM3LJ/idBIgpyCoMDMOp9mmPQvFSjT hSRw== X-Gm-Message-State: APjAAAWwR06ncsHU0uBKN8TQyxIzhNbf526p1GbO+kz9kdTjpKfBom7n y20FFvX86bgl41fOJ9VsAd85Lw== X-Google-Smtp-Source: APXvYqz83n+EQpXLT1b0uJfaG/uM4W+rN3Hy5lnjs9Zo2ES5H4FCmho/4ul8P2H3/4VatniBwhkQBw== X-Received: by 2002:ac8:1bf7:: with SMTP id m52mr5157041qtk.200.1551463512232; Fri, 01 Mar 2019 10:05:12 -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.10 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 01 Mar 2019 10:05:11 -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 4/7] devlink: allow subports on devlink PCI ports Date: Fri, 1 Mar 2019 10:04:50 -0800 Message-Id: <20190301180453.17778-5-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 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org PCI endpoint corresponds to a PCI device, but such device can have one more more logical device ports associated with it. We need a way to distinguish those. Add a PCI subport in the dumps and print the info in phys_port_name appropriately. This is not equivalent to port splitting, there is no split group. It's just a way of representing multiple netdevs on a single PCI function. Note that the quality of being multiport pertains only to the PCI function itself. A PF having multiple netdevs does not mean that its VFs will also have multiple, or that VFs are associated with any particular port of a multiport VF. Example (bus 05 device has subports, bus 82 has only one port per function): $ devlink port pci/0000:05:00.0/0: type eth netdev enp5s0np0 flavour physical pci/0000:05:00.0/10000: type eth netdev enp5s0npf0s0 flavour pci_pf pf 0 subport 0 pci/0000:05:00.0/4: type eth netdev enp5s0np1 flavour physical pci/0000:05:00.0/11000: type eth netdev enp5s0npf0s1 flavour pci_pf pf 0 subport 1 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 $ devlink -jp port { "port": { "pci/0000:05:00.0/0": { "type": "eth", "netdev": "enp5s0np0", "flavour": "physical" }, "pci/0000:05:00.0/10000": { "type": "eth", "netdev": "enp5s0npf0s0", "flavour": "pci_pf", "pf": 0, "subport": 0 }, "pci/0000:05:00.0/4": { "type": "eth", "netdev": "enp5s0np1", "flavour": "physical" }, "pci/0000:05:00.0/11000": { "type": "eth", "netdev": "enp5s0npf0s1", "flavour": "pci_pf", "pf": 0, "subport": 1 }, "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 } } } Signed-off-by: Jakub Kicinski --- .../net/ethernet/netronome/nfp/nfp_devlink.c | 6 ++-- include/net/devlink.h | 13 ++++--- include/uapi/linux/devlink.h | 1 + net/core/devlink.c | 36 ++++++++++++++++--- 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c index bf7fd9614152..6ad2805f1efc 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c @@ -378,12 +378,14 @@ int nfp_devlink_port_init(struct nfp_app *app, struct nfp_port *port) return nfp_devlink_port_init_phys(devlink, port); case NFP_PORT_PF_PORT: devlink_port_type_eth_set(&port->dl_port, port->netdev); - devlink_port_attrs_pci_pf_set(&port->dl_port, port->pf_id); + devlink_port_attrs_pci_pf_set(&port->dl_port, port->pf_id, + port->pf_split, + port->pf_split_id); return 0; case NFP_PORT_VF_PORT: devlink_port_type_eth_set(&port->dl_port, port->netdev); devlink_port_attrs_pci_vf_set(&port->dl_port, port->pf_id, - port->vf_id); + port->vf_id, false, 0); return 0; default: return -EINVAL; diff --git a/include/net/devlink.h b/include/net/devlink.h index 00ceff76762c..6a29ce80cb38 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -53,6 +53,8 @@ struct devlink_port_attrs { struct { u32 pf_number; u32 vf_number; + bool multiport; + u32 subport_number; } pci; }; }; @@ -579,9 +581,11 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port, u32 port_number, bool split, u32 split_subport_number); void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, - u32 pf_number); + u32 pf_number, bool multiport, + u32 subport_number); void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, - u32 pf_number, u32 vf_number); + u32 pf_number, u32 vf_number, bool multiport, + u32 subport_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, @@ -798,13 +802,14 @@ 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) + u32 pf_number, bool multiport, u32 subport_number) { } static inline void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, - u32 pf_number, u32 vf_number) + u32 pf_number, u32 vf_number, bool multiport, + u32 subport_number) { } diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h index 9ce76d4f640d..417ae8233cce 100644 --- a/include/uapi/linux/devlink.h +++ b/include/uapi/linux/devlink.h @@ -336,6 +336,7 @@ enum devlink_attr { DEVLINK_ATTR_PORT_PCI_PF_NUMBER, /* u32 */ DEVLINK_ATTR_PORT_PCI_VF_NUMBER, /* u32 */ + DEVLINK_ATTR_PORT_PCI_SUBPORT, /* u32 */ /* add new attributes above here, update the policy in devlink.c */ diff --git a/net/core/devlink.c b/net/core/devlink.c index 49216b688c5b..a7dd958be513 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -541,6 +541,11 @@ static int devlink_nl_port_attrs_put(struct sk_buff *msg, if (nla_put_u32(msg, DEVLINK_ATTR_PORT_PCI_PF_NUMBER, attrs->pci.pf_number)) return -EMSGSIZE; + + if (attrs->pci.multiport && + nla_put_u32(msg, DEVLINK_ATTR_PORT_PCI_SUBPORT, + attrs->pci.subport_number)) + return -EMSGSIZE; return 0; default: return -EINVAL; @@ -5449,15 +5454,20 @@ EXPORT_SYMBOL_GPL(devlink_port_attrs_set); * @devlink_port: devlink port * @pf_number: PCI PF number, in multi-host mapping to hosts depends * on the platform + * @multiport: PCI function has more than one logical port + * @subport_number: PCI function has more than one logical port */ void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, - u32 pf_number) + u32 pf_number, bool multiport, + u32 subport_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; + attrs->pci.multiport = multiport; + attrs->pci.subport_number = subport_number; devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW); } EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_pf_set); @@ -5469,9 +5479,12 @@ EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_pf_set); * @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) + * @multiport: PCI function has more than one logical port + * @subport_number: PCI function has more than one logical port */ void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, - u32 pf_number, u32 vf_number) + u32 pf_number, u32 vf_number, bool multiport, + u32 subport_number) { struct devlink_port_attrs *attrs = &devlink_port->attrs; @@ -5479,6 +5492,8 @@ void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, attrs->flavour = DEVLINK_PORT_FLAVOUR_PCI_VF; attrs->pci.pf_number = pf_number; attrs->pci.vf_number = vf_number; + attrs->pci.multiport = multiport; + attrs->pci.subport_number = subport_number; devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW); } EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_vf_set); @@ -5508,11 +5523,22 @@ 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); + if (!attrs->pci.multiport) + n = snprintf(name, len, "pf%u", attrs->pci.pf_number); + else + n = snprintf(name, len, "pf%us%u", attrs->pci.pf_number, + attrs->pci.subport_number); break; case DEVLINK_PORT_FLAVOUR_PCI_VF: - n = snprintf(name, len, "pf%uvf%u", - attrs->pci.pf_number, attrs->pci.vf_number); + if (!attrs->pci.multiport) + n = snprintf(name, len, "pf%uvf%u", + attrs->pci.pf_number, + attrs->pci.vf_number); + else + n = snprintf(name, len, "pf%uvf%us%u", + attrs->pci.pf_number, + attrs->pci.vf_number, + attrs->pci.subport_number); break; } From patchwork Fri Mar 1 18:04:51 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 1050322 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="lblqMY4h"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 449y4s3CNlz9s5R for ; Sat, 2 Mar 2019 05:05:17 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388303AbfCASFP (ORCPT ); Fri, 1 Mar 2019 13:05:15 -0500 Received: from mail-qt1-f196.google.com ([209.85.160.196]:39753 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728499AbfCASFP (ORCPT ); Fri, 1 Mar 2019 13:05:15 -0500 Received: by mail-qt1-f196.google.com with SMTP id o6so28780879qtk.6 for ; Fri, 01 Mar 2019 10:05:14 -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=KktHkygU6jWmqL+PKca+3KkQtat9XwZ62aEsEchNYTo=; b=lblqMY4hxudvJ9i05El3QxGlo5A9LXmd2BblLbfMmnCdNo9dGTWwb/EHEoI1AmF3cq 8GPlPjs7X2JfWvpujBB1/jJXvMHBsglvl7j3sNraOA7xZtjnLqur8XOgXj1lFMO/YaBQ KAwkTYhPqqaV9ud7jBlHDeUza74tdx0q0rgQCqS0fav87pivZ1FpXn/83X+98tvgo1fF b5oFsh9eVe4cvUrP1x9SOPRU3QgvOaTUebtgQ99vIzMVUvhS9XVCswpn/3czwgkhmc7s PAlRKAjz0Ar7gy6Glg75xO/Oscjax3B6lubBvTECVlZJMOKrW5n7Kse9K1pmTuIDsgue 8cJg== 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=KktHkygU6jWmqL+PKca+3KkQtat9XwZ62aEsEchNYTo=; b=StaYYkeMmBozqNmc0HscOu74AqG646rqryptst6D8wLBzLSdEISA/rCiIbULisC9Qg a8xHtbtqATKvfisJAEo3p6Reas4hCOh2HsP4k0MhaA01PmuRJGMAE4ZreC/Bytd6W9vn DnwXucy5liHEIIaqQ0otEvuF6+zKhypl7J1A+yPkrJa9DkRFttGGqMirTJBxslIKU5Df hQIeNLTt3fVDQ2XmvohNAC4TnBmF7zVkM2R1hg1yTDWjhreUP4ltQWjAXDYa1abOf0t/ P96KG3GIsRH85hYtzEHALAnyQSbwCgbtAec5SnkeKab2Yh+bZRszw+ofUx2g7DdB2ux8 8mJA== X-Gm-Message-State: APjAAAUJSq+7ML4uk0h8RMCa/EgZEpkiN0NDml3MYHBKN5BbDcHoodSL 1htlWiHfRvCEARoM+16+YmVa/g== X-Google-Smtp-Source: APXvYqzBSqghooHkqjg83DrpLjRpA2sUbOnBLoS2NDU9Z7wptYrexH9/0dyMfk3RhrhvfJ0WrI22zA== X-Received: by 2002:ac8:1bb7:: with SMTP id z52mr5119285qtj.294.1551463513746; Fri, 01 Mar 2019 10:05:13 -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.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 01 Mar 2019 10:05:13 -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 5/7] nfp: switch to devlink_port_get_phys_port_name() Date: Fri, 1 Mar 2019 10:04:51 -0800 Message-Id: <20190301180453.17778-6-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 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Now that devlink understands all port flavours - switch to the devlink_port_get_phys_port_name() helper. Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/netronome/nfp/nfp_port.c | 33 +------------------ 1 file changed, 1 insertion(+), 32 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_port.c b/drivers/net/ethernet/netronome/nfp/nfp_port.c index 93c5bfc0510b..3e2ff8d35e8d 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_port.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_port.c @@ -117,44 +117,13 @@ struct nfp_eth_table_port *nfp_port_get_eth_port(struct nfp_port *port) int nfp_port_get_phys_port_name(struct net_device *netdev, char *name, size_t len) { - struct nfp_eth_table_port *eth_port; struct nfp_port *port; - int n; port = nfp_port_from_netdev(netdev); if (!port) return -EOPNOTSUPP; - switch (port->type) { - case NFP_PORT_PHYS_PORT: - eth_port = __nfp_port_get_eth_port(port); - if (!eth_port) - return -EOPNOTSUPP; - - if (!eth_port->is_split) - n = snprintf(name, len, "p%d", eth_port->label_port); - else - n = snprintf(name, len, "p%ds%d", eth_port->label_port, - eth_port->label_subport); - break; - case NFP_PORT_PF_PORT: - if (!port->pf_split) - n = snprintf(name, len, "pf%d", port->pf_id); - else - n = snprintf(name, len, "pf%ds%d", port->pf_id, - port->pf_split_id); - break; - case NFP_PORT_VF_PORT: - n = snprintf(name, len, "pf%dvf%d", port->pf_id, port->vf_id); - break; - default: - return -EOPNOTSUPP; - } - - if (n >= len) - return -EINVAL; - - return 0; + return devlink_port_get_phys_port_name(&port->dl_port, name, len); } /** From patchwork Fri Mar 1 18:04:52 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 1050323 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="D0TeiguM"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 449y4v6qMXz9s1B for ; Sat, 2 Mar 2019 05:05:19 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728499AbfCASFS (ORCPT ); Fri, 1 Mar 2019 13:05:18 -0500 Received: from mail-qk1-f196.google.com ([209.85.222.196]:43921 "EHLO mail-qk1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1733302AbfCASFQ (ORCPT ); Fri, 1 Mar 2019 13:05:16 -0500 Received: by mail-qk1-f196.google.com with SMTP id f196so14806102qke.10 for ; Fri, 01 Mar 2019 10:05:15 -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=RtsF9MyBb+zoRzJj35bqIaW81o9k7PgG4JDt65bE2jo=; b=D0TeiguMBbvS3G5ZEil2u8iKBDSTKjwl/8qhctDe/4fvTwn2fyO8do4ylrcrd+rx51 3hwnvqEpuwm/HTqEodAlATulMlE3/qTGYusCiwivoeQuM28eJv64X6uD62KqRBTM8P1p +k6bbKgxNweO6Doagvdfg85kLMig2+Veh+DIUZdKm22eu/RCyNpZh3ZkLR1plqJ7sORi LyIGF3NHFFGlc84TFsuKDrbXwxvIfcxEfq9OCwrf/K15jSH6NKTDOUkT0sdayAX8YB4i xGu3wWmhe01sqDBEqEXVkKke9ZWTKw6el8SCPjh1h1kDCUsNojG8x/NPv2AOkxwVmWg3 EDfQ== 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=RtsF9MyBb+zoRzJj35bqIaW81o9k7PgG4JDt65bE2jo=; b=HCmmYi7r8sHec/yyHcdSuyFsvgIZnSqOS8Kpbyh/d/LhCRL8yUr9NjqU/lv8kVRThK Y/IeryIFGIsd+7KoPCcRx3MntmsRr88Q+5itH5ZOITEfKdekV9nZiXPeO3G/rpYUpZnr zp1+r+C2gXsE/YPwdG5HW9/9DOt+6vnr0NSMk6MQ8zx6Wpp7qbIo9h7imKQYhmv/P6Tc AsSR3dWwzlSskdtI5x2yX3LrjALv+Ql74p/koawg8QTAGzCBphJuSL7g/rlQh9g4YGEz xX/cy6tIeJ3gc78a0/Dcp8u9mq3bfTCXpXzsR3btf/EurK/sRITSkeg2Z0RjjRosKCre Be4g== X-Gm-Message-State: APjAAAW3LA0pX/KHxpu21y0h5imVpLnK+yclDOnqthUycTS+WkbZmchQ YNeENBMhwq+69ks5NaoyWgQTGQ== X-Google-Smtp-Source: APXvYqy7RKh/dkuJNObiVQx7ok3p56ck+Lw41yrPtNciqaVZpEN0AsuHpMgSfiNjf1Redmm6sblLYQ== X-Received: by 2002:a37:7e45:: with SMTP id z66mr4745751qkc.23.1551463515067; Fri, 01 Mar 2019 10:05:15 -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.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 01 Mar 2019 10:05:14 -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 6/7] devlink: introduce port's peer netdevs Date: Fri, 1 Mar 2019 10:04:52 -0800 Message-Id: <20190301180453.17778-7-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 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Devlink ports represent ports of a switch device (or SR-IOV NIC which has an embedded switch). In case of SR-IOV when PCIe PFs are exposed the PFs which are directly connected to the local machine may also spawn PF netdev (much like VFs have a port/"repr" and an actual VF netdev). Allow devlink to expose such linking. There is currently no way to find out which netdev corresponds to which PF. Example: $ devlink port pci/0000:82:00.0/0: type eth netdev p4p1 flavour physical pci/0000:82:00.0/10000: type eth netdev eth1 flavour pci_pf pf 0 peer_netdev enp130s0 pci/0000:82:00.0/10001: type eth netdev eth0 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: - move the peer info into a nested attr. Signed-off-by: Jakub Kicinski --- include/net/devlink.h | 11 ++++++ include/uapi/linux/devlink.h | 6 ++++ net/core/devlink.c | 68 +++++++++++++++++++++++++++++++++--- 3 files changed, 81 insertions(+), 4 deletions(-) diff --git a/include/net/devlink.h b/include/net/devlink.h index 6a29ce80cb38..f3ced79a30a8 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -68,6 +68,7 @@ struct devlink_port { enum devlink_port_type type; enum devlink_port_type desired_type; void *type_dev; + void *type_peer; struct devlink_port_attrs attrs; }; @@ -573,6 +574,9 @@ int devlink_port_register(struct devlink *devlink, void devlink_port_unregister(struct devlink_port *devlink_port); void devlink_port_type_eth_set(struct devlink_port *devlink_port, struct net_device *netdev); +void devlink_port_type_eth_set_peer(struct devlink_port *devlink_port, + struct net_device *netdev, + struct net_device *peer); void devlink_port_type_ib_set(struct devlink_port *devlink_port, struct ib_device *ibdev); void devlink_port_type_clear(struct devlink_port *devlink_port); @@ -784,6 +788,13 @@ static inline void devlink_port_type_eth_set(struct devlink_port *devlink_port, { } +static inline void +devlink_port_type_eth_set_peer(struct devlink_port *devlink_port, + struct net_device *netdev, + struct net_device *peer) +{ +} + static inline void devlink_port_type_ib_set(struct devlink_port *devlink_port, struct ib_device *ibdev) { diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h index 417ae8233cce..34ed03bee9fc 100644 --- a/include/uapi/linux/devlink.h +++ b/include/uapi/linux/devlink.h @@ -338,6 +338,12 @@ enum devlink_attr { DEVLINK_ATTR_PORT_PCI_VF_NUMBER, /* u32 */ DEVLINK_ATTR_PORT_PCI_SUBPORT, /* u32 */ + DEVLINK_ATTR_PORT_PEER, /* nested */ + DEVLINK_ATTR_PORT_PEER_TYPE, /* u16 */ + DEVLINK_ATTR_PORT_PEER_NETDEV_IFINDEX, /* u32 */ + DEVLINK_ATTR_PORT_PEER_NETDEV_NAME, /* string */ + DEVLINK_ATTR_PORT_PEER_IBDEV_NAME, /* string */ + /* 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 a7dd958be513..75c313b5b616 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -552,6 +552,47 @@ static int devlink_nl_port_attrs_put(struct sk_buff *msg, } } +static int devlink_nl_port_peer_put(struct sk_buff *msg, + struct devlink_port *devlink_port) +{ + struct nlattr *peer_attr; + + if (!devlink_port->type_peer) + return 0; + + peer_attr = nla_nest_start(msg, DEVLINK_ATTR_PORT_PEER); + if (!peer_attr) + return -EMSGSIZE; + + /* Peer's type is got to be the same as the port's type */ + if (nla_put_u16(msg, DEVLINK_ATTR_PORT_PEER_TYPE, devlink_port->type)) + goto cancel_peer_attr; + + if (devlink_port->type == DEVLINK_PORT_TYPE_ETH) { + struct net_device *netdev = devlink_port->type_peer; + + if (nla_put_u32(msg, DEVLINK_ATTR_PORT_PEER_NETDEV_IFINDEX, + netdev->ifindex) || + nla_put_string(msg, DEVLINK_ATTR_PORT_PEER_NETDEV_NAME, + netdev->name)) + goto cancel_peer_attr; + } + if (devlink_port->type == DEVLINK_PORT_TYPE_IB) { + struct ib_device *ibdev = devlink_port->type_peer; + + if (ibdev && + nla_put_string(msg, DEVLINK_ATTR_PORT_PEER_IBDEV_NAME, + ibdev->name)) + goto cancel_peer_attr; + } + nla_nest_end(msg, peer_attr); + return 0; + +cancel_peer_attr: + nla_nest_cancel(msg, peer_attr); + return -EMSGSIZE; +} + static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink, struct devlink_port *devlink_port, enum devlink_command cmd, u32 portid, @@ -593,6 +634,8 @@ static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink, } if (devlink_nl_port_attrs_put(msg, devlink_port)) goto nla_put_failure; + if (devlink_nl_port_peer_put(msg, devlink_port)) + goto nla_put_failure; genlmsg_end(msg, hdr); return 0; @@ -5370,10 +5413,11 @@ EXPORT_SYMBOL_GPL(devlink_port_unregister); static void __devlink_port_type_set(struct devlink_port *devlink_port, enum devlink_port_type type, - void *type_dev) + void *type_dev, void *type_peer) { devlink_port->type = type; devlink_port->type_dev = type_dev; + devlink_port->type_peer = type_peer; devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW); } @@ -5387,10 +5431,26 @@ void devlink_port_type_eth_set(struct devlink_port *devlink_port, struct net_device *netdev) { return __devlink_port_type_set(devlink_port, - DEVLINK_PORT_TYPE_ETH, netdev); + DEVLINK_PORT_TYPE_ETH, netdev, NULL); } EXPORT_SYMBOL_GPL(devlink_port_type_eth_set); +/** + * devlink_port_type_eth_set_peer - Set port type to Ethernet with peer + * + * @devlink_port: devlink port + * @netdev: related netdevice + * @peer: for PCIe ports the non-port netdev (actual VF or PF) + */ +void devlink_port_type_eth_set_peer(struct devlink_port *devlink_port, + struct net_device *netdev, + struct net_device *peer) +{ + return __devlink_port_type_set(devlink_port, + DEVLINK_PORT_TYPE_ETH, netdev, peer); +} +EXPORT_SYMBOL_GPL(devlink_port_type_eth_set_peer); + /** * devlink_port_type_ib_set - Set port type to InfiniBand * @@ -5401,7 +5461,7 @@ void devlink_port_type_ib_set(struct devlink_port *devlink_port, struct ib_device *ibdev) { return __devlink_port_type_set(devlink_port, - DEVLINK_PORT_TYPE_IB, ibdev); + DEVLINK_PORT_TYPE_IB, ibdev, NULL); } EXPORT_SYMBOL_GPL(devlink_port_type_ib_set); @@ -5413,7 +5473,7 @@ EXPORT_SYMBOL_GPL(devlink_port_type_ib_set); void devlink_port_type_clear(struct devlink_port *devlink_port) { return __devlink_port_type_set(devlink_port, - DEVLINK_PORT_TYPE_NOTSET, NULL); + DEVLINK_PORT_TYPE_NOTSET, NULL, NULL); } EXPORT_SYMBOL_GPL(devlink_port_type_clear); From patchwork Fri Mar 1 18:04:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 1050324 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="rAFG8xg2"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 449y4y0QFvz9s5R for ; Sat, 2 Mar 2019 05:05:22 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388687AbfCASFU (ORCPT ); Fri, 1 Mar 2019 13:05:20 -0500 Received: from mail-qk1-f195.google.com ([209.85.222.195]:44335 "EHLO mail-qk1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388380AbfCASFR (ORCPT ); Fri, 1 Mar 2019 13:05:17 -0500 Received: by mail-qk1-f195.google.com with SMTP id r21so14781649qkl.11 for ; Fri, 01 Mar 2019 10:05:16 -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=69IWf6aJfcYtmsOuD+reKgRqier1VRVLP5Sq/1cqOKo=; b=rAFG8xg2Ox/E9xRz0zlMVBKeYtqvAZXpuwppryuBzmOYDGMMSRkaDdNgS8bn2Zgrpy CrzMbh1MY3I2yhh1DUcNW9PEm+ODQqAaN3lsvSKGcidoYHGzSWH01IFZIfh8WiXfufF5 VSZF+xXlGZfejGVSOTwBGVESFVsMmx8EXkdTjgir0iFi3vhpHzjw+suPXnj1OL+G3vS/ WolhfGN9+3q36xydnzEK3G62xpnDUj2mQOEvBESqqSlqeK21MjSySzh3J2iV0QT8WO2G DtFLFKM3B8gG/QOMd2QzReJPJnw/MeFu2+Rp2x9tUpdR9TmIqpF/C+3XDszZQyWRvetS C1WA== 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=69IWf6aJfcYtmsOuD+reKgRqier1VRVLP5Sq/1cqOKo=; b=JxlQQ6r/qmGPjZOdlYvrKzJIs1nhaYR3aouPHmKBncLUN6ogYuoSBLNodfRSI1+J+r LSLGTnuAvTGwCw5yOEz5MOfgTOAj/1KZ0CvRZsqrtjdmP/v8sAi29OTV8wqQc+8Crql9 PQmpcR7wqT2mhizXLI9JYCe2t7DCcgswobU8x0YHlLBhqaw9V3N7kUTAXIQL2H6G24VC asJifyoITJqtFoBXwzxWogWth52+7g/nGKDCkiAZOsoSxJX418RMeV9sKfD6Tpze/0ds P4EZGNx3yhsho7YrHhJHw3q7mj+SXOT/9NpNfTmR8klqWINjPmUldkVBqOEP3735YLKb GCsg== X-Gm-Message-State: APjAAAV14zi1haTOjA8jRTgVMZoi1y4C94OA42XC5B8JUdGdcULYlwHv mfvAz2jmZmSQMtEApIqZbwQjFP0ZNgs= X-Google-Smtp-Source: APXvYqzbNxiklEJqdFOJ/jSvGvHfW3qQg52IUJx1e3BVH92yNb1dsklKlReBgxGlUcYYxBAAtZZxug== X-Received: by 2002:a05:620a:1679:: with SMTP id d25mr4915794qko.69.1551463516470; Fri, 01 Mar 2019 10:05:16 -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.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 01 Mar 2019 10:05:15 -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 7/7] nfp: expose PF peer netdevs Date: Fri, 1 Mar 2019 10:04:53 -0800 Message-Id: <20190301180453.17778-8-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 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Expose PF netdevs as devlink port's peers. Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/netronome/nfp/abm/main.c | 1 + drivers/net/ethernet/netronome/nfp/flower/main.c | 1 + drivers/net/ethernet/netronome/nfp/nfp_devlink.c | 3 ++- drivers/net/ethernet/netronome/nfp/nfp_port.h | 2 ++ 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/netronome/nfp/abm/main.c b/drivers/net/ethernet/netronome/nfp/abm/main.c index 4d4ff5844c47..8d7ff1200fd4 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/main.c +++ b/drivers/net/ethernet/netronome/nfp/abm/main.c @@ -113,6 +113,7 @@ nfp_abm_spawn_repr(struct nfp_app *app, struct nfp_abm_link *alink, port->pf_id = alink->abm->pf_id; port->pf_split = app->pf->max_data_vnics > 1; port->pf_split_id = alink->id; + port->peer = alink->vnic->dp.netdev; port->vnic = alink->vnic->dp.ctrl_bar; } diff --git a/drivers/net/ethernet/netronome/nfp/flower/main.c b/drivers/net/ethernet/netronome/nfp/flower/main.c index 408089133599..13aa21923bf7 100644 --- a/drivers/net/ethernet/netronome/nfp/flower/main.c +++ b/drivers/net/ethernet/netronome/nfp/flower/main.c @@ -300,6 +300,7 @@ nfp_flower_spawn_vnic_reprs(struct nfp_app *app, if (repr_type == NFP_REPR_TYPE_PF) { port->pf_id = i; port->vnic = priv->nn->dp.ctrl_bar; + port->peer = priv->nn->dp.netdev; } else { port->pf_id = 0; port->vf_id = i; diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c index 6ad2805f1efc..ced21a9951aa 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c @@ -377,7 +377,8 @@ int nfp_devlink_port_init(struct nfp_app *app, struct nfp_port *port) case NFP_PORT_PHYS_PORT: return nfp_devlink_port_init_phys(devlink, port); case NFP_PORT_PF_PORT: - devlink_port_type_eth_set(&port->dl_port, port->netdev); + devlink_port_type_eth_set_peer(&port->dl_port, port->netdev, + port->peer); devlink_port_attrs_pci_pf_set(&port->dl_port, port->pf_id, port->pf_split, port->pf_split_id); diff --git a/drivers/net/ethernet/netronome/nfp/nfp_port.h b/drivers/net/ethernet/netronome/nfp/nfp_port.h index 09c55ca2371a..c75a25cc5cea 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_port.h +++ b/drivers/net/ethernet/netronome/nfp/nfp_port.h @@ -51,6 +51,7 @@ enum nfp_port_flags { * @eth_forced: for %NFP_PORT_PHYS_PORT port is forced UP or DOWN, don't change * @eth_port: for %NFP_PORT_PHYS_PORT translated ETH Table port entry * @eth_stats: for %NFP_PORT_PHYS_PORT MAC stats if available + * @peer: for %NFP_PORT_PF_PORT netdev of the actual vNIC, if reachable * @pf_id: for %NFP_PORT_PF_PORT, %NFP_PORT_VF_PORT ID of the PCI PF (0-3) * @vf_id: for %NFP_PORT_VF_PORT ID of the PCI VF within @pf_id * @pf_split: for %NFP_PORT_PF_PORT %true if PCI PF has more than one vNIC @@ -79,6 +80,7 @@ struct nfp_port { }; /* NFP_PORT_PF_PORT, NFP_PORT_VF_PORT */ struct { + struct net_device *peer; unsigned int pf_id; unsigned int vf_id; bool pf_split;