netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jiri Pirko <jiri@resnulli.us>
To: Jakub Kicinski <jakub.kicinski@netronome.com>
Cc: Or Gerlitz <gerlitz.or@gmail.com>,
	netdev@vger.kernel.org, Or Gerlitz <ogerlitz@mellanox.com>,
	Michael Chan <michael.chan@broadcom.com>,
	Sathya Perla <sathya.perla@broadcom.com>,
	David Miller <davem@davemloft.net>,
	simon.horman@netronome.com
Subject: Re: [RFC] switchdev: generate phys_port_name in the core
Date: Fri, 28 Jul 2017 07:35:07 +0200	[thread overview]
Message-ID: <20170728053507.GA1857@nanopsycho> (raw)
In-Reply-To: <20170728023122.1674-1-jakub.kicinski@netronome.com>

Fri, Jul 28, 2017 at 04:31:22AM CEST, jakub.kicinski@netronome.com wrote:
>On Thu, 27 Jul 2017 13:30:44 +0300, Or Gerlitz wrote:
>> > want to add port splitting support, for example, reporting the name on
>> > physical ports will become more of a necessity.  
>> 
>> > If we adopt Jiri's suggestion of returning structured data it will be
>> > very easy to give user space type and indexes separately, but we should
>> > probably still return the string for backwards compatibility.  
>> 
>> I am not still clear how the structured data would look like
>
>I decided to just quickly write the code, that should be easier to 
>understand.  We can probably leave out the netlink part of the API
>if there is no need for it right now, but that's what I ment by
>returning the information in a more structured way.
>
>Tested-by: nobody :)
>Suggested-by: Jiri (if I understood correctly)

Yes, you did :) Couple of nits inlined.


>---
> drivers/net/ethernet/mellanox/mlx5/core/en_rep.c |  8 ++-
> drivers/net/ethernet/mellanox/mlxsw/switchx2.c   | 10 ++--
> drivers/net/ethernet/netronome/nfp/nfp_port.c    | 26 ++++-----
> drivers/net/ethernet/netronome/nfp/nfp_port.h    |  4 +-
> include/linux/netdevice.h                        | 18 ++++++-
> include/uapi/linux/if_link.h                     | 16 ++++++
> net/core/dev.c                                   | 31 +++++++++--
> net/core/rtnetlink.c                             | 69 ++++++++++++++++++++++++
> 8 files changed, 153 insertions(+), 29 deletions(-)
>
>diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
>index 45e60be9c277..7a71291b8ec3 100644
>--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
>+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
>@@ -637,16 +637,14 @@ static int mlx5e_rep_close(struct net_device *dev)
> }
> 
> static int mlx5e_rep_get_phys_port_name(struct net_device *dev,
>-					char *buf, size_t len)
>+					struct netdev_port_info *info)

Either we rename ndo to something like ndo_get_port_info or you rename
the struct to netdev_port_name_info. These 2 should be in sync


> {
> 	struct mlx5e_priv *priv = netdev_priv(dev);
> 	struct mlx5e_rep_priv *rpriv = priv->ppriv;
> 	struct mlx5_eswitch_rep *rep = rpriv->rep;
>-	int ret;
> 
>-	ret = snprintf(buf, len, "%d", rep->vport - 1);
>-	if (ret >= len)
>-		return -EOPNOTSUPP;
>+	info->type = NETDEV_PORT_PCI_VF;

NETDEV_PORT_TYPE_PCI_VF
or
NETDEV_PORT_NAME_TYPE_PCI_VF
depends on the option you chose above.


>+	info->pci.vf_id = rep->vport - 1;
> 
> 	return 0;
> }
>diff --git a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
>index 3b0f72455681..383b8b5f41cf 100644
>--- a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
>+++ b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
>@@ -413,15 +413,13 @@ mlxsw_sx_port_get_stats64(struct net_device *dev,
> 	stats->tx_dropped	= tx_dropped;
> }
> 
>-static int mlxsw_sx_port_get_phys_port_name(struct net_device *dev, char *name,
>-					    size_t len)
>+static int mlxsw_sx_port_get_phys_port_name(struct net_device *dev,
>+					    struct netdev_port_info *info)
> {
> 	struct mlxsw_sx_port *mlxsw_sx_port = netdev_priv(dev);
>-	int err;
> 
>-	err = snprintf(name, len, "p%d", mlxsw_sx_port->mapping.module + 1);
>-	if (err >= len)
>-		return -EINVAL;
>+	info->type = NETDEV_PORT_EXTERNAL;
>+	info->port.id = mlxsw_sx_port->mapping.module + 1;
> 
> 	return 0;
> }
>diff --git a/drivers/net/ethernet/netronome/nfp/nfp_port.c b/drivers/net/ethernet/netronome/nfp/nfp_port.c
>index d16a7b78ba9b..8f5c37b9a79c 100644
>--- a/drivers/net/ethernet/netronome/nfp/nfp_port.c
>+++ b/drivers/net/ethernet/netronome/nfp/nfp_port.c
>@@ -143,11 +143,11 @@ 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)
>+nfp_port_get_phys_port_name(struct net_device *netdev,
>+			    struct netdev_port_info *info)
> {
> 	struct nfp_eth_table_port *eth_port;
> 	struct nfp_port *port;
>-	int n;
> 
> 	port = nfp_port_from_netdev(netdev);
> 	if (!port)
>@@ -159,25 +159,27 @@ nfp_port_get_phys_port_name(struct net_device *netdev, char *name, size_t len)
> 		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);
>+		info->type = NETDEV_PORT_EXTERNAL;
>+		info->external.id = eth_port->label_port;
>+
>+		if (eth_port->is_split) {
>+			info->type = NETDEV_PORT_EXTERNAL_SPLIT;
>+			info->external.split_id = eth_port->label_subport;
>+		}
> 		break;
> 	case NFP_PORT_PF_PORT:
>-		n = snprintf(name, len, "pf%d", port->pf_id);
>+		info->type = NETDEV_PORT_PCI_PF;
>+		info->pci.pf_id = port->pf_id;
> 		break;
> 	case NFP_PORT_VF_PORT:
>-		n = snprintf(name, len, "pf%dvf%d", port->pf_id, port->vf_id);
>+		info->type = NETDEV_PORT_PCI_VF;
>+		info->pci.pf_id = port->pf_id;
>+		info->pci.vf_id = port->vf_id;
> 		break;
> 	default:
> 		return -EOPNOTSUPP;
> 	}
> 
>-	if (n >= len)
>-		return -EINVAL;
>-
> 	return 0;
> }
> 
>diff --git a/drivers/net/ethernet/netronome/nfp/nfp_port.h b/drivers/net/ethernet/netronome/nfp/nfp_port.h
>index 56c76926c82a..03b8746feb29 100644
>--- a/drivers/net/ethernet/netronome/nfp/nfp_port.h
>+++ b/drivers/net/ethernet/netronome/nfp/nfp_port.h
>@@ -118,8 +118,8 @@ nfp_port_from_id(struct nfp_pf *pf, enum nfp_port_type type, unsigned int id);
> struct nfp_eth_table_port *__nfp_port_get_eth_port(struct nfp_port *port);
> 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);
>+int nfp_port_get_phys_port_name(struct net_device *netdev,
>+				struct netdev_port_info *info);
> int nfp_port_configure(struct net_device *netdev, bool configed);
> 
> struct nfp_port *
>diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
>index 3a3cdc1b1f31..0a055df701ef 100644
>--- a/include/linux/netdevice.h
>+++ b/include/linux/netdevice.h
>@@ -845,6 +845,22 @@ struct xfrmdev_ops {
> };
> #endif
> 
>+struct netdev_port_info {
>+	int type;

enum please


>+
>+	union {
>+		struct {
>+			u32 id;
>+			u32 split_id;
>+		} external;
>+
>+		struct {
>+			u32 pf_id;
>+			u32 vf_id;
>+		} pci;
>+	};
>+};
>+
> /*
>  * This structure defines the management hooks for network devices.
>  * The following hooks can be defined; unless noted otherwise, they are
>@@ -1306,7 +1322,7 @@ struct net_device_ops {
> 	int			(*ndo_get_phys_port_id)(struct net_device *dev,
> 							struct netdev_phys_item_id *ppid);
> 	int			(*ndo_get_phys_port_name)(struct net_device *dev,
>-							  char *name, size_t len);
>+							  struct netdev_port_info *info);
> 	void			(*ndo_udp_tunnel_add)(struct net_device *dev,
> 						      struct udp_tunnel_info *ti);
> 	void			(*ndo_udp_tunnel_del)(struct net_device *dev,
>diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h
>index 8d062c58d5cb..e00ff0333e3f 100644
>--- a/include/uapi/linux/if_link.h
>+++ b/include/uapi/linux/if_link.h
>@@ -158,6 +158,7 @@ enum {
> 	IFLA_PAD,
> 	IFLA_XDP,
> 	IFLA_EVENT,
>+	IFLA_PORT_INFO,
> 	__IFLA_MAX
> };
> 
>@@ -927,4 +928,19 @@ enum {
> 	IFLA_EVENT_BONDING_OPTIONS,	/* change in bonding options */
> };
> 
>+enum {
>+	NETDEV_PORT_EXTERNAL,
>+	NETDEV_PORT_EXTERNAL_SPLIT,
>+	NETDEV_PORT_PCI_PF,

Isn't PF also EXTERNAL? Cant VF be split? What I'm getting at, shoudn't
these be flags?


>+	NETDEV_PORT_PCI_VF,
>+};
>+

  parent reply	other threads:[~2017-07-28  5:35 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-07-24 16:34 [PATCH net-next 00/10] bnxt_en: Updates for net-next Michael Chan
2017-07-24 16:34 ` [PATCH net-next 01/10] bnxt_en: Update firmware interface spec to 1.8.0 Michael Chan
2017-07-24 16:34 ` [PATCH net-next 02/10] bnxt_en: Retrieve the hardware bridge mode from the firmware Michael Chan
2017-07-24 16:34 ` [PATCH net-next 03/10] bnxt_en: Implement ndo_bridge_{get|set}link methods Michael Chan
2017-07-24 16:34 ` [PATCH net-next 04/10] bnxt_en: Add bnxt_get_num_stats() to centrally get the number of ethtool stats Michael Chan
2017-07-24 16:34 ` [PATCH net-next 05/10] bnxt_en: Allow the user to set ethtool stats-block-usecs to 0 Michael Chan
2017-07-24 16:34 ` [PATCH net-next 06/10] bnxt_en: Report firmware DCBX agent Michael Chan
2017-07-24 16:34 ` [PATCH net-next 07/10] bnxt_en: Set ETS min_bw parameter for older firmware Michael Chan
2017-07-24 16:34 ` [PATCH net-next 08/10] bnxt_en: add support to enable VF-representors Michael Chan
2017-07-25  2:28   ` kbuild test robot
2017-07-24 16:34 ` [PATCH net-next 09/10] bnxt_en: add vf-rep RX/TX and netdev implementation Michael Chan
2017-07-24 16:34 ` [PATCH net-next 10/10] bnxt_en: add support for port_attr_get and and get_phys_port_name Michael Chan
2017-07-25  2:44   ` kbuild test robot
2017-07-25  4:06     ` Jakub Kicinski
2017-07-25  4:21       ` David Miller
2017-07-25  4:45   ` Jakub Kicinski
2017-07-25  5:13     ` [RFC] switchdev: clarify ndo_get_phys_port_name() formats Jakub Kicinski
2017-07-25 15:22       ` Andy Gospodarek
2017-07-25 22:26         ` Jakub Kicinski
2017-07-26  1:48           ` Andy Gospodarek
2017-07-26  2:34             ` Jakub Kicinski
2017-07-26 17:54               ` Andy Gospodarek
2017-07-26  5:48       ` Jiri Pirko
2017-07-26  8:13         ` Jakub Kicinski
2017-07-26  9:23           ` Or Gerlitz
2017-07-26 20:11             ` Jakub Kicinski
2017-07-27 10:30               ` Or Gerlitz
2017-07-28  2:31                 ` [RFC] switchdev: generate phys_port_name in the core Jakub Kicinski
2017-07-28  2:37                   ` Jakub Kicinski
2017-07-28  5:35                   ` Jiri Pirko [this message]
2017-07-28  5:58                     ` Jiri Pirko
2017-07-28  7:28                       ` Jakub Kicinski
2017-07-28  7:27                     ` Jakub Kicinski
2017-07-28 14:13                   ` Andrew Lunn
2017-07-25  9:55     ` [PATCH net-next 10/10] bnxt_en: add support for port_attr_get and and get_phys_port_name Sathya Perla
2017-07-25 22:27       ` Jakub Kicinski
2017-07-26  9:13     ` Or Gerlitz
2017-07-25  0:32 ` [PATCH net-next 00/10] bnxt_en: Updates for net-next David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170728053507.GA1857@nanopsycho \
    --to=jiri@resnulli.us \
    --cc=davem@davemloft.net \
    --cc=gerlitz.or@gmail.com \
    --cc=jakub.kicinski@netronome.com \
    --cc=michael.chan@broadcom.com \
    --cc=netdev@vger.kernel.org \
    --cc=ogerlitz@mellanox.com \
    --cc=sathya.perla@broadcom.com \
    --cc=simon.horman@netronome.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).