netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [patch net-next 0/5] net: call for phys_port_name into devlink directly is possible
@ 2019-03-01  8:13 Jiri Pirko
  2019-03-01  8:13 ` [patch net-next 1/5] net: replace ndo_get_devlink for ndo_get_devlink_port Jiri Pirko
                   ` (4 more replies)
  0 siblings, 5 replies; 14+ messages in thread
From: Jiri Pirko @ 2019-03-01  8:13 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, dirk.vandermerwe,
	f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

phys_port_name may be assembled by a helper in devlink. It is currently
the case only for mlxsw driver. Benefit from the get_devlink_port ndo
and call into devlink directly from dev_get_phys_port_name(). That saves
the trip to the driver, simplifies the code and makes it similar to
recently introduced ethtool-devlink compat helpers.

Jiri Pirko (5):
  net: replace ndo_get_devlink for ndo_get_devlink_port
  net: devlink: introduce devlink_compat_phys_port_name_get()
  mlxsw: spectrum: Implement ndo_get_devlink_port
  mlxsw: Remove ndo_get_phys_port_name implementation
  net: devlink: remove unused devlink_port_get_phys_port_name() function

 drivers/net/ethernet/mellanox/mlxsw/core.c         | 10 ++++---
 drivers/net/ethernet/mellanox/mlxsw/core.h         |  5 ++--
 drivers/net/ethernet/mellanox/mlxsw/spectrum.c     | 22 +++++++-------
 drivers/net/ethernet/mellanox/mlxsw/switchx2.c     | 11 -------
 drivers/net/ethernet/netronome/nfp/nfp_app.h       |  2 +-
 drivers/net/ethernet/netronome/nfp/nfp_devlink.c   | 10 +++----
 .../net/ethernet/netronome/nfp/nfp_net_common.c    |  2 +-
 drivers/net/ethernet/netronome/nfp/nfp_net_repr.c  |  2 +-
 include/linux/netdevice.h                          |  6 ++--
 include/net/devlink.h                              | 34 ++++++++++++++--------
 net/core/dev.c                                     |  3 +-
 net/core/devlink.c                                 | 25 ++++++++++++++--
 12 files changed, 77 insertions(+), 55 deletions(-)

-- 
2.14.5


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [patch net-next 1/5] net: replace ndo_get_devlink for ndo_get_devlink_port
  2019-03-01  8:13 [patch net-next 0/5] net: call for phys_port_name into devlink directly is possible Jiri Pirko
@ 2019-03-01  8:13 ` Jiri Pirko
  2019-03-01 12:45   ` Michal Kubecek
  2019-03-02  2:20   ` Florian Fainelli
  2019-03-01  8:13 ` [patch net-next 2/5] net: devlink: introduce devlink_compat_phys_port_name_get() Jiri Pirko
                   ` (3 subsequent siblings)
  4 siblings, 2 replies; 14+ messages in thread
From: Jiri Pirko @ 2019-03-01  8:13 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, dirk.vandermerwe,
	f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

Follow-up patch is going to need a devlink port instance according to
a netdev. Devlink port instance should be always available when devlink
is used. So change the recently introduced ndo_get_devlink to
ndo_get_devlink_port. With that, adjust the wrapper for the only
user to get devlink pointer.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
 drivers/net/ethernet/netronome/nfp/nfp_app.h        |  2 +-
 drivers/net/ethernet/netronome/nfp/nfp_devlink.c    | 10 +++++-----
 drivers/net/ethernet/netronome/nfp/nfp_net_common.c |  2 +-
 drivers/net/ethernet/netronome/nfp/nfp_net_repr.c   |  2 +-
 include/linux/netdevice.h                           |  6 +++---
 include/net/devlink.h                               | 16 +++++++++++++---
 6 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/netronome/nfp/nfp_app.h b/drivers/net/ethernet/netronome/nfp/nfp_app.h
index f8d422713705..a6fda07fce43 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_app.h
+++ b/drivers/net/ethernet/netronome/nfp/nfp_app.h
@@ -433,6 +433,6 @@ int nfp_app_nic_vnic_alloc(struct nfp_app *app, struct nfp_net *nn,
 int nfp_app_nic_vnic_init_phy_port(struct nfp_pf *pf, struct nfp_app *app,
 				   struct nfp_net *nn, unsigned int id);
 
-struct devlink *nfp_devlink_get_devlink(struct net_device *netdev);
+struct devlink_port *nfp_devlink_get_devlink_port(struct net_device *netdev);
 
 #endif
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
index e9eca99cf493..f24a7fc11b9f 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
@@ -377,13 +377,13 @@ void nfp_devlink_port_unregister(struct nfp_port *port)
 	devlink_port_unregister(&port->dl_port);
 }
 
-struct devlink *nfp_devlink_get_devlink(struct net_device *netdev)
+struct devlink_port *nfp_devlink_get_devlink_port(struct net_device *netdev)
 {
-	struct nfp_app *app;
+	struct nfp_port *port;
 
-	app = nfp_app_from_netdev(netdev);
-	if (!app)
+	port = nfp_port_from_netdev(netdev);
+	if (!port)
 		return NULL;
 
-	return priv_to_devlink(app->pf);
+	return &port->dl_port;
 }
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
index 6d1b8816552e..7dd6b3fbb394 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
@@ -3531,7 +3531,7 @@ const struct net_device_ops nfp_net_netdev_ops = {
 	.ndo_udp_tunnel_del	= nfp_net_del_vxlan_port,
 	.ndo_bpf		= nfp_net_xdp,
 	.ndo_get_port_parent_id	= nfp_port_get_port_parent_id,
-	.ndo_get_devlink	= nfp_devlink_get_devlink,
+	.ndo_get_devlink_port	= nfp_devlink_get_devlink_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..bf621674f583 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c
@@ -273,7 +273,7 @@ const struct net_device_ops nfp_repr_netdev_ops = {
 	.ndo_set_features	= nfp_port_set_features,
 	.ndo_set_mac_address    = eth_mac_addr,
 	.ndo_get_port_parent_id	= nfp_port_get_port_parent_id,
-	.ndo_get_devlink	= nfp_devlink_get_devlink,
+	.ndo_get_devlink_port	= nfp_devlink_get_devlink_port,
 };
 
 void
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index c10b60297d28..dc9d72b8932a 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1251,8 +1251,8 @@ struct devlink;
  *	that got dropped are freed/returned via xdp_return_frame().
  *	Returns negative number, means general error invoking ndo, meaning
  *	no frames were xmit'ed and core-caller will free all frames.
- * struct devlink *(*ndo_get_devlink)(struct net_device *dev);
- *	Get devlink instance associated with a given netdev.
+ * struct devlink_port *(*ndo_get_devlink_port)(struct net_device *dev);
+ *	Get devlink port instance associated with a given netdev.
  *	Called with a reference on the netdevice and devlink locks only,
  *	rtnl_lock is not held.
  */
@@ -1453,7 +1453,7 @@ struct net_device_ops {
 						u32 flags);
 	int			(*ndo_xsk_async_xmit)(struct net_device *dev,
 						      u32 queue_id);
-	struct devlink *	(*ndo_get_devlink)(struct net_device *dev);
+	struct devlink_port *	(*ndo_get_devlink_port)(struct net_device *dev);
 };
 
 /**
diff --git a/include/net/devlink.h b/include/net/devlink.h
index 7f5a0bdca228..f34107def48e 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -538,15 +538,25 @@ static inline struct devlink *priv_to_devlink(void *priv)
 	return container_of(priv, struct devlink, priv);
 }
 
-static inline struct devlink *netdev_to_devlink(struct net_device *dev)
+static inline struct devlink_port *
+netdev_to_devlink_port(struct net_device *dev)
 {
 #if IS_ENABLED(CONFIG_NET_DEVLINK)
-	if (dev->netdev_ops->ndo_get_devlink)
-		return dev->netdev_ops->ndo_get_devlink(dev);
+	if (dev->netdev_ops->ndo_get_devlink_port)
+		return dev->netdev_ops->ndo_get_devlink_port(dev);
 #endif
 	return NULL;
 }
 
+static inline struct devlink *netdev_to_devlink(struct net_device *dev)
+{
+	struct devlink_port *devlink_port = netdev_to_devlink_port(dev);
+
+	if (devlink_port)
+		return devlink_port->devlink;
+	return NULL;
+}
+
 struct ib_device;
 
 #if IS_ENABLED(CONFIG_NET_DEVLINK)
-- 
2.14.5


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [patch net-next 2/5] net: devlink: introduce devlink_compat_phys_port_name_get()
  2019-03-01  8:13 [patch net-next 0/5] net: call for phys_port_name into devlink directly is possible Jiri Pirko
  2019-03-01  8:13 ` [patch net-next 1/5] net: replace ndo_get_devlink for ndo_get_devlink_port Jiri Pirko
@ 2019-03-01  8:13 ` Jiri Pirko
  2019-03-01 16:14   ` Jakub Kicinski
  2019-03-01  8:14 ` [patch net-next 3/5] mlxsw: spectrum: Implement ndo_get_devlink_port Jiri Pirko
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 14+ messages in thread
From: Jiri Pirko @ 2019-03-01  8:13 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, dirk.vandermerwe,
	f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

Introduce devlink_compat_phys_port_name_get() helper that
gets the physical port name for specified netdevice
according to devlink port attributes.
Call this helper from dev_get_phys_port_name()
in case ndo_get_phys_port_name is not defined.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
 include/net/devlink.h |  9 +++++++++
 net/core/dev.c        |  3 ++-
 net/core/devlink.c    | 30 ++++++++++++++++++++++++++++--
 3 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/include/net/devlink.h b/include/net/devlink.h
index f34107def48e..ae2cd34da99e 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -729,6 +729,8 @@ int devlink_health_report(struct devlink_health_reporter *reporter,
 void devlink_compat_running_version(struct net_device *dev,
 				    char *buf, size_t len);
 int devlink_compat_flash_update(struct net_device *dev, const char *file_name);
+int devlink_compat_phys_port_name_get(struct net_device *dev,
+				      char *name, size_t len);
 
 #else
 
@@ -1224,6 +1226,13 @@ devlink_compat_flash_update(struct net_device *dev, const char *file_name)
 {
 	return -EOPNOTSUPP;
 }
+
+static inline int
+devlink_compat_phys_port_name_get(struct net_device *dev,
+				  char *name, size_t len)
+{
+	return -EOPNOTSUPP;
+}
 #endif
 
 #endif /* _NET_DEVLINK_H_ */
diff --git a/net/core/dev.c b/net/core/dev.c
index 2b67f2aa59dd..a614b26b0842 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -146,6 +146,7 @@
 #include <net/udp_tunnel.h>
 #include <linux/net_namespace.h>
 #include <linux/indirect_call_wrapper.h>
+#include <net/devlink.h>
 
 #include "net-sysfs.h"
 
@@ -7872,7 +7873,7 @@ int dev_get_phys_port_name(struct net_device *dev,
 	const struct net_device_ops *ops = dev->netdev_ops;
 
 	if (!ops->ndo_get_phys_port_name)
-		return -EOPNOTSUPP;
+		return devlink_compat_phys_port_name_get(dev, name, len);
 	return ops->ndo_get_phys_port_name(dev, name, len);
 }
 EXPORT_SYMBOL(dev_get_phys_port_name);
diff --git a/net/core/devlink.c b/net/core/devlink.c
index a49dee67e66f..4fd45d4a4818 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -5419,8 +5419,8 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port,
 }
 EXPORT_SYMBOL_GPL(devlink_port_attrs_set);
 
-int devlink_port_get_phys_port_name(struct devlink_port *devlink_port,
-				    char *name, size_t len)
+static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port,
+					     char *name, size_t len)
 {
 	struct devlink_port_attrs *attrs = &devlink_port->attrs;
 	int n = 0;
@@ -5450,6 +5450,12 @@ int devlink_port_get_phys_port_name(struct devlink_port *devlink_port,
 
 	return 0;
 }
+
+int devlink_port_get_phys_port_name(struct devlink_port *devlink_port,
+				    char *name, size_t len)
+{
+	return __devlink_port_phys_port_name_get(devlink_port, name, len);
+}
 EXPORT_SYMBOL_GPL(devlink_port_get_phys_port_name);
 
 int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
@@ -6469,6 +6475,26 @@ int devlink_compat_flash_update(struct net_device *dev, const char *file_name)
 	return ret;
 }
 
+int devlink_compat_phys_port_name_get(struct net_device *dev,
+				      char *name, size_t len)
+{
+	struct devlink_port *devlink_port;
+	int err = -EOPNOTSUPP;
+
+	mutex_lock(&devlink_mutex);
+	devlink_port = netdev_to_devlink_port(dev);
+	if (!devlink_port)
+		goto unlock_list;
+
+	mutex_lock(&devlink_port->devlink->lock);
+	err = __devlink_port_phys_port_name_get(devlink_port, name, len);
+	mutex_unlock(&devlink_port->devlink->lock);
+unlock_list:
+	mutex_unlock(&devlink_mutex);
+
+	return err;
+}
+
 static int __init devlink_init(void)
 {
 	return genl_register_family(&devlink_nl_family);
-- 
2.14.5


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [patch net-next 3/5] mlxsw: spectrum: Implement ndo_get_devlink_port
  2019-03-01  8:13 [patch net-next 0/5] net: call for phys_port_name into devlink directly is possible Jiri Pirko
  2019-03-01  8:13 ` [patch net-next 1/5] net: replace ndo_get_devlink for ndo_get_devlink_port Jiri Pirko
  2019-03-01  8:13 ` [patch net-next 2/5] net: devlink: introduce devlink_compat_phys_port_name_get() Jiri Pirko
@ 2019-03-01  8:14 ` Jiri Pirko
  2019-03-01  8:14 ` [patch net-next 4/5] mlxsw: Remove ndo_get_phys_port_name implementation Jiri Pirko
  2019-03-01  8:14 ` [patch net-next 5/5] net: devlink: remove unused devlink_port_get_phys_port_name() function Jiri Pirko
  4 siblings, 0 replies; 14+ messages in thread
From: Jiri Pirko @ 2019-03-01  8:14 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, dirk.vandermerwe,
	f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

In order for devlink compat functions to work, implement
ndo_get_devlink_port.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlxsw/core.c     | 12 ++++++++++++
 drivers/net/ethernet/mellanox/mlxsw/core.h     |  3 +++
 drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 11 +++++++++++
 3 files changed, 26 insertions(+)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c
index b505d3858235..5d656310434d 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/core.c
@@ -1807,6 +1807,18 @@ int mlxsw_core_port_get_phys_port_name(struct mlxsw_core *mlxsw_core,
 }
 EXPORT_SYMBOL(mlxsw_core_port_get_phys_port_name);
 
+struct devlink_port *
+mlxsw_core_port_devlink_port_get(struct mlxsw_core *mlxsw_core,
+				 u8 local_port)
+{
+	struct mlxsw_core_port *mlxsw_core_port =
+					&mlxsw_core->ports[local_port];
+	struct devlink_port *devlink_port = &mlxsw_core_port->devlink_port;
+
+	return devlink_port;
+}
+EXPORT_SYMBOL(mlxsw_core_port_devlink_port_get);
+
 static void mlxsw_core_buf_dump_dbg(struct mlxsw_core *mlxsw_core,
 				    const char *buf, size_t size)
 {
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.h b/drivers/net/ethernet/mellanox/mlxsw/core.h
index cd0c6aa0dff9..0592cd724ec3 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core.h
+++ b/drivers/net/ethernet/mellanox/mlxsw/core.h
@@ -178,6 +178,9 @@ enum devlink_port_type mlxsw_core_port_type_get(struct mlxsw_core *mlxsw_core,
 						u8 local_port);
 int mlxsw_core_port_get_phys_port_name(struct mlxsw_core *mlxsw_core,
 				       u8 local_port, char *name, size_t len);
+struct devlink_port *
+mlxsw_core_port_devlink_port_get(struct mlxsw_core *mlxsw_core,
+				 u8 local_port);
 
 int mlxsw_core_schedule_dw(struct delayed_work *dwork, unsigned long delay);
 bool mlxsw_core_schedule_work(struct work_struct *work);
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
index 6c797e322be8..7995e7b042a2 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -1725,6 +1725,16 @@ static int mlxsw_sp_port_get_port_parent_id(struct net_device *dev,
 	return 0;
 }
 
+static struct devlink_port *
+mlxsw_sp_port_get_devlink_port(struct net_device *dev)
+{
+	struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
+	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
+
+	return mlxsw_core_port_devlink_port_get(mlxsw_sp->core,
+						mlxsw_sp_port->local_port);
+}
+
 static const struct net_device_ops mlxsw_sp_port_netdev_ops = {
 	.ndo_open		= mlxsw_sp_port_open,
 	.ndo_stop		= mlxsw_sp_port_stop,
@@ -1741,6 +1751,7 @@ static const struct net_device_ops mlxsw_sp_port_netdev_ops = {
 	.ndo_get_phys_port_name	= mlxsw_sp_port_get_phys_port_name,
 	.ndo_set_features	= mlxsw_sp_set_features,
 	.ndo_get_port_parent_id	= mlxsw_sp_port_get_port_parent_id,
+	.ndo_get_devlink_port	= mlxsw_sp_port_get_devlink_port,
 };
 
 static void mlxsw_sp_port_get_drvinfo(struct net_device *dev,
-- 
2.14.5


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [patch net-next 4/5] mlxsw: Remove ndo_get_phys_port_name implementation
  2019-03-01  8:13 [patch net-next 0/5] net: call for phys_port_name into devlink directly is possible Jiri Pirko
                   ` (2 preceding siblings ...)
  2019-03-01  8:14 ` [patch net-next 3/5] mlxsw: spectrum: Implement ndo_get_devlink_port Jiri Pirko
@ 2019-03-01  8:14 ` Jiri Pirko
  2019-03-01  8:14 ` [patch net-next 5/5] net: devlink: remove unused devlink_port_get_phys_port_name() function Jiri Pirko
  4 siblings, 0 replies; 14+ messages in thread
From: Jiri Pirko @ 2019-03-01  8:14 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, dirk.vandermerwe,
	f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

Rely on the previously introduce fallback and let the core directly call
devlink in order to get the physical port name.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlxsw/core.c     | 10 ----------
 drivers/net/ethernet/mellanox/mlxsw/core.h     |  2 --
 drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 11 -----------
 drivers/net/ethernet/mellanox/mlxsw/switchx2.c | 11 -----------
 4 files changed, 34 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c
index 5d656310434d..d10108e44438 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/core.c
@@ -1796,16 +1796,6 @@ enum devlink_port_type mlxsw_core_port_type_get(struct mlxsw_core *mlxsw_core,
 }
 EXPORT_SYMBOL(mlxsw_core_port_type_get);
 
-int mlxsw_core_port_get_phys_port_name(struct mlxsw_core *mlxsw_core,
-				       u8 local_port, char *name, size_t len)
-{
-	struct mlxsw_core_port *mlxsw_core_port =
-					&mlxsw_core->ports[local_port];
-	struct devlink_port *devlink_port = &mlxsw_core_port->devlink_port;
-
-	return devlink_port_get_phys_port_name(devlink_port, name, len);
-}
-EXPORT_SYMBOL(mlxsw_core_port_get_phys_port_name);
 
 struct devlink_port *
 mlxsw_core_port_devlink_port_get(struct mlxsw_core *mlxsw_core,
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.h b/drivers/net/ethernet/mellanox/mlxsw/core.h
index 0592cd724ec3..60b017a07cea 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core.h
+++ b/drivers/net/ethernet/mellanox/mlxsw/core.h
@@ -176,8 +176,6 @@ void mlxsw_core_port_clear(struct mlxsw_core *mlxsw_core, u8 local_port,
 			   void *port_driver_priv);
 enum devlink_port_type mlxsw_core_port_type_get(struct mlxsw_core *mlxsw_core,
 						u8 local_port);
-int mlxsw_core_port_get_phys_port_name(struct mlxsw_core *mlxsw_core,
-				       u8 local_port, char *name, size_t len);
 struct devlink_port *
 mlxsw_core_port_devlink_port_get(struct mlxsw_core *mlxsw_core,
 				 u8 local_port);
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
index 7995e7b042a2..5d0adec84858 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -1253,16 +1253,6 @@ static int mlxsw_sp_port_kill_vid(struct net_device *dev,
 	return 0;
 }
 
-static int mlxsw_sp_port_get_phys_port_name(struct net_device *dev, char *name,
-					    size_t len)
-{
-	struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
-
-	return mlxsw_core_port_get_phys_port_name(mlxsw_sp_port->mlxsw_sp->core,
-						  mlxsw_sp_port->local_port,
-						  name, len);
-}
-
 static struct mlxsw_sp_port_mall_tc_entry *
 mlxsw_sp_port_mall_tc_entry_find(struct mlxsw_sp_port *port,
 				 unsigned long cookie) {
@@ -1748,7 +1738,6 @@ static const struct net_device_ops mlxsw_sp_port_netdev_ops = {
 	.ndo_get_offload_stats	= mlxsw_sp_port_get_offload_stats,
 	.ndo_vlan_rx_add_vid	= mlxsw_sp_port_add_vid,
 	.ndo_vlan_rx_kill_vid	= mlxsw_sp_port_kill_vid,
-	.ndo_get_phys_port_name	= mlxsw_sp_port_get_phys_port_name,
 	.ndo_set_features	= mlxsw_sp_set_features,
 	.ndo_get_port_parent_id	= mlxsw_sp_port_get_port_parent_id,
 	.ndo_get_devlink_port	= mlxsw_sp_port_get_devlink_port,
diff --git a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
index 533fe6235b7c..9999d866f394 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
@@ -379,16 +379,6 @@ 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)
-{
-	struct mlxsw_sx_port *mlxsw_sx_port = netdev_priv(dev);
-
-	return mlxsw_core_port_get_phys_port_name(mlxsw_sx_port->mlxsw_sx->core,
-						  mlxsw_sx_port->local_port,
-						  name, len);
-}
-
 static int mlxsw_sx_port_get_port_parent_id(struct net_device *dev,
 					    struct netdev_phys_item_id *ppid)
 {
@@ -407,7 +397,6 @@ static const struct net_device_ops mlxsw_sx_port_netdev_ops = {
 	.ndo_start_xmit		= mlxsw_sx_port_xmit,
 	.ndo_change_mtu		= mlxsw_sx_port_change_mtu,
 	.ndo_get_stats64	= mlxsw_sx_port_get_stats64,
-	.ndo_get_phys_port_name = mlxsw_sx_port_get_phys_port_name,
 	.ndo_get_port_parent_id	= mlxsw_sx_port_get_port_parent_id,
 };
 
-- 
2.14.5


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [patch net-next 5/5] net: devlink: remove unused devlink_port_get_phys_port_name() function
  2019-03-01  8:13 [patch net-next 0/5] net: call for phys_port_name into devlink directly is possible Jiri Pirko
                   ` (3 preceding siblings ...)
  2019-03-01  8:14 ` [patch net-next 4/5] mlxsw: Remove ndo_get_phys_port_name implementation Jiri Pirko
@ 2019-03-01  8:14 ` Jiri Pirko
  2019-03-01 16:25   ` Jakub Kicinski
  4 siblings, 1 reply; 14+ messages in thread
From: Jiri Pirko @ 2019-03-01  8:14 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, dirk.vandermerwe,
	f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

Now it is unused, remove it.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
 include/net/devlink.h | 9 ---------
 net/core/devlink.c    | 7 -------
 2 files changed, 16 deletions(-)

diff --git a/include/net/devlink.h b/include/net/devlink.h
index ae2cd34da99e..227c453cc20e 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -578,8 +578,6 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port,
 			    enum devlink_port_flavour flavour,
 			    u32 port_number, bool split,
 			    u32 split_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,
 			u32 size, u16 ingress_pools_count,
 			u16 egress_pools_count, u16 ingress_tc_count,
@@ -794,13 +792,6 @@ static inline void devlink_port_attrs_set(struct devlink_port *devlink_port,
 {
 }
 
-static inline int
-devlink_port_get_phys_port_name(struct devlink_port *devlink_port,
-				char *name, size_t len)
-{
-	return -EOPNOTSUPP;
-}
-
 static inline int devlink_sb_register(struct devlink *devlink,
 				      unsigned int sb_index, u32 size,
 				      u16 ingress_pools_count,
diff --git a/net/core/devlink.c b/net/core/devlink.c
index 4fd45d4a4818..d90a745d8258 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -5451,13 +5451,6 @@ static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port,
 	return 0;
 }
 
-int devlink_port_get_phys_port_name(struct devlink_port *devlink_port,
-				    char *name, size_t len)
-{
-	return __devlink_port_phys_port_name_get(devlink_port, name, len);
-}
-EXPORT_SYMBOL_GPL(devlink_port_get_phys_port_name);
-
 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,
-- 
2.14.5


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [patch net-next 1/5] net: replace ndo_get_devlink for ndo_get_devlink_port
  2019-03-01  8:13 ` [patch net-next 1/5] net: replace ndo_get_devlink for ndo_get_devlink_port Jiri Pirko
@ 2019-03-01 12:45   ` Michal Kubecek
  2019-03-01 13:42     ` Jiri Pirko
  2019-03-02  2:20   ` Florian Fainelli
  1 sibling, 1 reply; 14+ messages in thread
From: Michal Kubecek @ 2019-03-01 12:45 UTC (permalink / raw)
  To: Jiri Pirko
  Cc: netdev, davem, mlxsw, idosch, jakub.kicinski, dirk.vandermerwe,
	f.fainelli, andrew, vivien.didelot

On Fri, Mar 01, 2019 at 09:13:58AM +0100, Jiri Pirko wrote:
> From: Jiri Pirko <jiri@mellanox.com>
> 
> Follow-up patch is going to need a devlink port instance according to
> a netdev. Devlink port instance should be always available when devlink
> is used.

I noticed netdevsim has devlink interface but it does not register
devlink ports for its network devices. But that seems to be rather an
omission in netdevsim, right?

>          So change the recently introduced ndo_get_devlink to
> ndo_get_devlink_port. With that, adjust the wrapper for the only
> user to get devlink pointer.
> 
> Signed-off-by: Jiri Pirko <jiri@mellanox.com>

Reviewed-by: Michal Kubecek <mkubecek@suse.cz>

> ---
>  drivers/net/ethernet/netronome/nfp/nfp_app.h        |  2 +-
>  drivers/net/ethernet/netronome/nfp/nfp_devlink.c    | 10 +++++-----
>  drivers/net/ethernet/netronome/nfp/nfp_net_common.c |  2 +-
>  drivers/net/ethernet/netronome/nfp/nfp_net_repr.c   |  2 +-
>  include/linux/netdevice.h                           |  6 +++---
>  include/net/devlink.h                               | 16 +++++++++++++---
>  6 files changed, 24 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/net/ethernet/netronome/nfp/nfp_app.h b/drivers/net/ethernet/netronome/nfp/nfp_app.h
> index f8d422713705..a6fda07fce43 100644
> --- a/drivers/net/ethernet/netronome/nfp/nfp_app.h
> +++ b/drivers/net/ethernet/netronome/nfp/nfp_app.h
> @@ -433,6 +433,6 @@ int nfp_app_nic_vnic_alloc(struct nfp_app *app, struct nfp_net *nn,
>  int nfp_app_nic_vnic_init_phy_port(struct nfp_pf *pf, struct nfp_app *app,
>  				   struct nfp_net *nn, unsigned int id);
>  
> -struct devlink *nfp_devlink_get_devlink(struct net_device *netdev);
> +struct devlink_port *nfp_devlink_get_devlink_port(struct net_device *netdev);
>  
>  #endif
> diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
> index e9eca99cf493..f24a7fc11b9f 100644
> --- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
> +++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
> @@ -377,13 +377,13 @@ void nfp_devlink_port_unregister(struct nfp_port *port)
>  	devlink_port_unregister(&port->dl_port);
>  }
>  
> -struct devlink *nfp_devlink_get_devlink(struct net_device *netdev)
> +struct devlink_port *nfp_devlink_get_devlink_port(struct net_device *netdev)
>  {
> -	struct nfp_app *app;
> +	struct nfp_port *port;
>  
> -	app = nfp_app_from_netdev(netdev);
> -	if (!app)
> +	port = nfp_port_from_netdev(netdev);
> +	if (!port)
>  		return NULL;
>  
> -	return priv_to_devlink(app->pf);
> +	return &port->dl_port;
>  }
> diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
> index 6d1b8816552e..7dd6b3fbb394 100644
> --- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
> +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
> @@ -3531,7 +3531,7 @@ const struct net_device_ops nfp_net_netdev_ops = {
>  	.ndo_udp_tunnel_del	= nfp_net_del_vxlan_port,
>  	.ndo_bpf		= nfp_net_xdp,
>  	.ndo_get_port_parent_id	= nfp_port_get_port_parent_id,
> -	.ndo_get_devlink	= nfp_devlink_get_devlink,
> +	.ndo_get_devlink_port	= nfp_devlink_get_devlink_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..bf621674f583 100644
> --- a/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c
> +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c
> @@ -273,7 +273,7 @@ const struct net_device_ops nfp_repr_netdev_ops = {
>  	.ndo_set_features	= nfp_port_set_features,
>  	.ndo_set_mac_address    = eth_mac_addr,
>  	.ndo_get_port_parent_id	= nfp_port_get_port_parent_id,
> -	.ndo_get_devlink	= nfp_devlink_get_devlink,
> +	.ndo_get_devlink_port	= nfp_devlink_get_devlink_port,
>  };
>  
>  void
> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
> index c10b60297d28..dc9d72b8932a 100644
> --- a/include/linux/netdevice.h
> +++ b/include/linux/netdevice.h
> @@ -1251,8 +1251,8 @@ struct devlink;
>   *	that got dropped are freed/returned via xdp_return_frame().
>   *	Returns negative number, means general error invoking ndo, meaning
>   *	no frames were xmit'ed and core-caller will free all frames.
> - * struct devlink *(*ndo_get_devlink)(struct net_device *dev);
> - *	Get devlink instance associated with a given netdev.
> + * struct devlink_port *(*ndo_get_devlink_port)(struct net_device *dev);
> + *	Get devlink port instance associated with a given netdev.
>   *	Called with a reference on the netdevice and devlink locks only,
>   *	rtnl_lock is not held.
>   */
> @@ -1453,7 +1453,7 @@ struct net_device_ops {
>  						u32 flags);
>  	int			(*ndo_xsk_async_xmit)(struct net_device *dev,
>  						      u32 queue_id);
> -	struct devlink *	(*ndo_get_devlink)(struct net_device *dev);
> +	struct devlink_port *	(*ndo_get_devlink_port)(struct net_device *dev);
>  };
>  
>  /**
> diff --git a/include/net/devlink.h b/include/net/devlink.h
> index 7f5a0bdca228..f34107def48e 100644
> --- a/include/net/devlink.h
> +++ b/include/net/devlink.h
> @@ -538,15 +538,25 @@ static inline struct devlink *priv_to_devlink(void *priv)
>  	return container_of(priv, struct devlink, priv);
>  }
>  
> -static inline struct devlink *netdev_to_devlink(struct net_device *dev)
> +static inline struct devlink_port *
> +netdev_to_devlink_port(struct net_device *dev)
>  {
>  #if IS_ENABLED(CONFIG_NET_DEVLINK)
> -	if (dev->netdev_ops->ndo_get_devlink)
> -		return dev->netdev_ops->ndo_get_devlink(dev);
> +	if (dev->netdev_ops->ndo_get_devlink_port)
> +		return dev->netdev_ops->ndo_get_devlink_port(dev);
>  #endif
>  	return NULL;
>  }
>  
> +static inline struct devlink *netdev_to_devlink(struct net_device *dev)
> +{
> +	struct devlink_port *devlink_port = netdev_to_devlink_port(dev);
> +
> +	if (devlink_port)
> +		return devlink_port->devlink;
> +	return NULL;
> +}
> +
>  struct ib_device;
>  
>  #if IS_ENABLED(CONFIG_NET_DEVLINK)
> -- 
> 2.14.5
> 

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [patch net-next 1/5] net: replace ndo_get_devlink for ndo_get_devlink_port
  2019-03-01 12:45   ` Michal Kubecek
@ 2019-03-01 13:42     ` Jiri Pirko
  0 siblings, 0 replies; 14+ messages in thread
From: Jiri Pirko @ 2019-03-01 13:42 UTC (permalink / raw)
  To: Michal Kubecek
  Cc: netdev, davem, mlxsw, idosch, jakub.kicinski, dirk.vandermerwe,
	f.fainelli, andrew, vivien.didelot

Fri, Mar 01, 2019 at 01:45:26PM CET, mkubecek@suse.cz wrote:
>On Fri, Mar 01, 2019 at 09:13:58AM +0100, Jiri Pirko wrote:
>> From: Jiri Pirko <jiri@mellanox.com>
>> 
>> Follow-up patch is going to need a devlink port instance according to
>> a netdev. Devlink port instance should be always available when devlink
>> is used.
>
>I noticed netdevsim has devlink interface but it does not register
>devlink ports for its network devices. But that seems to be rather an
>omission in netdevsim, right?

Yep.

>
>>          So change the recently introduced ndo_get_devlink to
>> ndo_get_devlink_port. With that, adjust the wrapper for the only
>> user to get devlink pointer.
>> 
>> Signed-off-by: Jiri Pirko <jiri@mellanox.com>
>
>Reviewed-by: Michal Kubecek <mkubecek@suse.cz>

Thanks.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [patch net-next 2/5] net: devlink: introduce devlink_compat_phys_port_name_get()
  2019-03-01  8:13 ` [patch net-next 2/5] net: devlink: introduce devlink_compat_phys_port_name_get() Jiri Pirko
@ 2019-03-01 16:14   ` Jakub Kicinski
  2019-03-01 16:21     ` Jiri Pirko
  0 siblings, 1 reply; 14+ messages in thread
From: Jakub Kicinski @ 2019-03-01 16:14 UTC (permalink / raw)
  To: Jiri Pirko
  Cc: netdev, davem, mlxsw, idosch, dirk.vandermerwe, f.fainelli,
	andrew, vivien.didelot

On Fri,  1 Mar 2019 09:13:59 +0100, Jiri Pirko wrote:
> From: Jiri Pirko <jiri@mellanox.com>
> 
> Introduce devlink_compat_phys_port_name_get() helper that
> gets the physical port name for specified netdevice
> according to devlink port attributes.
> Call this helper from dev_get_phys_port_name()
> in case ndo_get_phys_port_name is not defined.
> 
> Signed-off-by: Jiri Pirko <jiri@mellanox.com>
> ---
>  include/net/devlink.h |  9 +++++++++
>  net/core/dev.c        |  3 ++-
>  net/core/devlink.c    | 30 ++++++++++++++++++++++++++++--
>  3 files changed, 39 insertions(+), 3 deletions(-)
> 
> diff --git a/include/net/devlink.h b/include/net/devlink.h
> index f34107def48e..ae2cd34da99e 100644
> --- a/include/net/devlink.h
> +++ b/include/net/devlink.h
> @@ -729,6 +729,8 @@ int devlink_health_report(struct devlink_health_reporter *reporter,
>  void devlink_compat_running_version(struct net_device *dev,
>  				    char *buf, size_t len);
>  int devlink_compat_flash_update(struct net_device *dev, const char *file_name);
> +int devlink_compat_phys_port_name_get(struct net_device *dev,
> +				      char *name, size_t len);
>  
>  #else
>  
> @@ -1224,6 +1226,13 @@ devlink_compat_flash_update(struct net_device *dev, const char *file_name)
>  {
>  	return -EOPNOTSUPP;
>  }
> +
> +static inline int
> +devlink_compat_phys_port_name_get(struct net_device *dev,
> +				  char *name, size_t len)
> +{
> +	return -EOPNOTSUPP;
> +}
>  #endif
>  
>  #endif /* _NET_DEVLINK_H_ */
> diff --git a/net/core/dev.c b/net/core/dev.c
> index 2b67f2aa59dd..a614b26b0842 100644
> --- a/net/core/dev.c
> +++ b/net/core/dev.c
> @@ -146,6 +146,7 @@
>  #include <net/udp_tunnel.h>
>  #include <linux/net_namespace.h>
>  #include <linux/indirect_call_wrapper.h>
> +#include <net/devlink.h>
>  
>  #include "net-sysfs.h"
>  
> @@ -7872,7 +7873,7 @@ int dev_get_phys_port_name(struct net_device *dev,
>  	const struct net_device_ops *ops = dev->netdev_ops;
>  
>  	if (!ops->ndo_get_phys_port_name)
> -		return -EOPNOTSUPP;
> +		return devlink_compat_phys_port_name_get(dev, name, len);
>  	return ops->ndo_get_phys_port_name(dev, name, len);
>  }
>  EXPORT_SYMBOL(dev_get_phys_port_name);
> diff --git a/net/core/devlink.c b/net/core/devlink.c
> index a49dee67e66f..4fd45d4a4818 100644
> --- a/net/core/devlink.c
> +++ b/net/core/devlink.c
> @@ -5419,8 +5419,8 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port,
>  }
>  EXPORT_SYMBOL_GPL(devlink_port_attrs_set);
>  
> -int devlink_port_get_phys_port_name(struct devlink_port *devlink_port,
> -				    char *name, size_t len)
> +static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port,
> +					     char *name, size_t len)
>  {
>  	struct devlink_port_attrs *attrs = &devlink_port->attrs;
>  	int n = 0;
> @@ -5450,6 +5450,12 @@ int devlink_port_get_phys_port_name(struct devlink_port *devlink_port,
>  
>  	return 0;
>  }
> +
> +int devlink_port_get_phys_port_name(struct devlink_port *devlink_port,
> +				    char *name, size_t len)
> +{
> +	return __devlink_port_phys_port_name_get(devlink_port, name, len);
> +}
>  EXPORT_SYMBOL_GPL(devlink_port_get_phys_port_name);
>  
>  int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
> @@ -6469,6 +6475,26 @@ int devlink_compat_flash_update(struct net_device *dev, const char *file_name)
>  	return ret;
>  }
>  
> +int devlink_compat_phys_port_name_get(struct net_device *dev,
> +				      char *name, size_t len)
> +{
> +	struct devlink_port *devlink_port;
> +	int err = -EOPNOTSUPP;
> +
> +	mutex_lock(&devlink_mutex);
> +	devlink_port = netdev_to_devlink_port(dev);
> +	if (!devlink_port)
> +		goto unlock_list;
> +
> +	mutex_lock(&devlink_port->devlink->lock);

I'm moderately confident you won't be able to take devlink locks from
RTNL code :(  I think the locking order is:

  devlink_mutex -> devlink->lock -> rtnl_lock

No? :(  At least NFP assumes that, but I think port splitting does, too.

> +	err = __devlink_port_phys_port_name_get(devlink_port, name, len);
> +	mutex_unlock(&devlink_port->devlink->lock);
> +unlock_list:
> +	mutex_unlock(&devlink_mutex);
> +
> +	return err;
> +}
> +
>  static int __init devlink_init(void)
>  {
>  	return genl_register_family(&devlink_nl_family);


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [patch net-next 2/5] net: devlink: introduce devlink_compat_phys_port_name_get()
  2019-03-01 16:14   ` Jakub Kicinski
@ 2019-03-01 16:21     ` Jiri Pirko
  0 siblings, 0 replies; 14+ messages in thread
From: Jiri Pirko @ 2019-03-01 16:21 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: netdev, davem, mlxsw, idosch, dirk.vandermerwe, f.fainelli,
	andrew, vivien.didelot

Fri, Mar 01, 2019 at 05:14:58PM CET, jakub.kicinski@netronome.com wrote:
>On Fri,  1 Mar 2019 09:13:59 +0100, Jiri Pirko wrote:
>> From: Jiri Pirko <jiri@mellanox.com>
>> 
>> Introduce devlink_compat_phys_port_name_get() helper that
>> gets the physical port name for specified netdevice
>> according to devlink port attributes.
>> Call this helper from dev_get_phys_port_name()
>> in case ndo_get_phys_port_name is not defined.
>> 
>> Signed-off-by: Jiri Pirko <jiri@mellanox.com>
>> ---
>>  include/net/devlink.h |  9 +++++++++
>>  net/core/dev.c        |  3 ++-
>>  net/core/devlink.c    | 30 ++++++++++++++++++++++++++++--
>>  3 files changed, 39 insertions(+), 3 deletions(-)
>> 
>> diff --git a/include/net/devlink.h b/include/net/devlink.h
>> index f34107def48e..ae2cd34da99e 100644
>> --- a/include/net/devlink.h
>> +++ b/include/net/devlink.h
>> @@ -729,6 +729,8 @@ int devlink_health_report(struct devlink_health_reporter *reporter,
>>  void devlink_compat_running_version(struct net_device *dev,
>>  				    char *buf, size_t len);
>>  int devlink_compat_flash_update(struct net_device *dev, const char *file_name);
>> +int devlink_compat_phys_port_name_get(struct net_device *dev,
>> +				      char *name, size_t len);
>>  
>>  #else
>>  
>> @@ -1224,6 +1226,13 @@ devlink_compat_flash_update(struct net_device *dev, const char *file_name)
>>  {
>>  	return -EOPNOTSUPP;
>>  }
>> +
>> +static inline int
>> +devlink_compat_phys_port_name_get(struct net_device *dev,
>> +				  char *name, size_t len)
>> +{
>> +	return -EOPNOTSUPP;
>> +}
>>  #endif
>>  
>>  #endif /* _NET_DEVLINK_H_ */
>> diff --git a/net/core/dev.c b/net/core/dev.c
>> index 2b67f2aa59dd..a614b26b0842 100644
>> --- a/net/core/dev.c
>> +++ b/net/core/dev.c
>> @@ -146,6 +146,7 @@
>>  #include <net/udp_tunnel.h>
>>  #include <linux/net_namespace.h>
>>  #include <linux/indirect_call_wrapper.h>
>> +#include <net/devlink.h>
>>  
>>  #include "net-sysfs.h"
>>  
>> @@ -7872,7 +7873,7 @@ int dev_get_phys_port_name(struct net_device *dev,
>>  	const struct net_device_ops *ops = dev->netdev_ops;
>>  
>>  	if (!ops->ndo_get_phys_port_name)
>> -		return -EOPNOTSUPP;
>> +		return devlink_compat_phys_port_name_get(dev, name, len);
>>  	return ops->ndo_get_phys_port_name(dev, name, len);
>>  }
>>  EXPORT_SYMBOL(dev_get_phys_port_name);
>> diff --git a/net/core/devlink.c b/net/core/devlink.c
>> index a49dee67e66f..4fd45d4a4818 100644
>> --- a/net/core/devlink.c
>> +++ b/net/core/devlink.c
>> @@ -5419,8 +5419,8 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port,
>>  }
>>  EXPORT_SYMBOL_GPL(devlink_port_attrs_set);
>>  
>> -int devlink_port_get_phys_port_name(struct devlink_port *devlink_port,
>> -				    char *name, size_t len)
>> +static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port,
>> +					     char *name, size_t len)
>>  {
>>  	struct devlink_port_attrs *attrs = &devlink_port->attrs;
>>  	int n = 0;
>> @@ -5450,6 +5450,12 @@ int devlink_port_get_phys_port_name(struct devlink_port *devlink_port,
>>  
>>  	return 0;
>>  }
>> +
>> +int devlink_port_get_phys_port_name(struct devlink_port *devlink_port,
>> +				    char *name, size_t len)
>> +{
>> +	return __devlink_port_phys_port_name_get(devlink_port, name, len);
>> +}
>>  EXPORT_SYMBOL_GPL(devlink_port_get_phys_port_name);
>>  
>>  int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
>> @@ -6469,6 +6475,26 @@ int devlink_compat_flash_update(struct net_device *dev, const char *file_name)
>>  	return ret;
>>  }
>>  
>> +int devlink_compat_phys_port_name_get(struct net_device *dev,
>> +				      char *name, size_t len)
>> +{
>> +	struct devlink_port *devlink_port;
>> +	int err = -EOPNOTSUPP;
>> +
>> +	mutex_lock(&devlink_mutex);
>> +	devlink_port = netdev_to_devlink_port(dev);
>> +	if (!devlink_port)
>> +		goto unlock_list;
>> +
>> +	mutex_lock(&devlink_port->devlink->lock);
>
>I'm moderately confident you won't be able to take devlink locks from
>RTNL code :(  I think the locking order is:
>
>  devlink_mutex -> devlink->lock -> rtnl_lock
>
>No? :(  At least NFP assumes that, but I think port splitting does, too.

Oh right, thanks for spotting this. Will fix.


>
>> +	err = __devlink_port_phys_port_name_get(devlink_port, name, len);
>> +	mutex_unlock(&devlink_port->devlink->lock);
>> +unlock_list:
>> +	mutex_unlock(&devlink_mutex);
>> +
>> +	return err;
>> +}
>> +
>>  static int __init devlink_init(void)
>>  {
>>  	return genl_register_family(&devlink_nl_family);
>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [patch net-next 5/5] net: devlink: remove unused devlink_port_get_phys_port_name() function
  2019-03-01  8:14 ` [patch net-next 5/5] net: devlink: remove unused devlink_port_get_phys_port_name() function Jiri Pirko
@ 2019-03-01 16:25   ` Jakub Kicinski
  2019-03-01 16:27     ` Jiri Pirko
  0 siblings, 1 reply; 14+ messages in thread
From: Jakub Kicinski @ 2019-03-01 16:25 UTC (permalink / raw)
  To: Jiri Pirko
  Cc: netdev, davem, mlxsw, idosch, dirk.vandermerwe, f.fainelli,
	andrew, vivien.didelot

On Fri,  1 Mar 2019 09:14:02 +0100, Jiri Pirko wrote:
> From: Jiri Pirko <jiri@mellanox.com>
> 
> Now it is unused, remove it.
> 
> Signed-off-by: Jiri Pirko <jiri@mellanox.com>

Oh, you nuke this completely, that's going to conflict hard with my
series :)

(Provided the locking is okay) I think it'd be good if we flipped the
logic in dev_get_phys_port_name().  Always try devlink:

@@ -7872,7 +7873,7 @@ int dev_get_phys_port_name(struct net_device *dev,
 	const struct net_device_ops *ops = dev->netdev_ops;
 	
+	if (!devlink_compat_phys_port_name_get(dev, name, len))
+		return 0;
 	if (!ops->ndo_get_phys_port_name)
		return -EOPNOTSUPP;
 	return ops->ndo_get_phys_port_name(dev, name, len);
 }

NFP is using a single set of NDOs for PFs and VFs (which don't have
devlink ports), so either it'd be good if I could call the devlink
helper for real ports, or we need the above.

> diff --git a/include/net/devlink.h b/include/net/devlink.h
> index ae2cd34da99e..227c453cc20e 100644
> --- a/include/net/devlink.h
> +++ b/include/net/devlink.h
> @@ -578,8 +578,6 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port,
>  			    enum devlink_port_flavour flavour,
>  			    u32 port_number, bool split,
>  			    u32 split_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,
>  			u32 size, u16 ingress_pools_count,
>  			u16 egress_pools_count, u16 ingress_tc_count,
> @@ -794,13 +792,6 @@ static inline void devlink_port_attrs_set(struct devlink_port *devlink_port,
>  {
>  }
>  
> -static inline int
> -devlink_port_get_phys_port_name(struct devlink_port *devlink_port,
> -				char *name, size_t len)
> -{
> -	return -EOPNOTSUPP;
> -}
> -
>  static inline int devlink_sb_register(struct devlink *devlink,
>  				      unsigned int sb_index, u32 size,
>  				      u16 ingress_pools_count,
> diff --git a/net/core/devlink.c b/net/core/devlink.c
> index 4fd45d4a4818..d90a745d8258 100644
> --- a/net/core/devlink.c
> +++ b/net/core/devlink.c
> @@ -5451,13 +5451,6 @@ static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port,
>  	return 0;
>  }
>  
> -int devlink_port_get_phys_port_name(struct devlink_port *devlink_port,
> -				    char *name, size_t len)
> -{
> -	return __devlink_port_phys_port_name_get(devlink_port, name, len);
> -}
> -EXPORT_SYMBOL_GPL(devlink_port_get_phys_port_name);
> -
>  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,


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [patch net-next 5/5] net: devlink: remove unused devlink_port_get_phys_port_name() function
  2019-03-01 16:25   ` Jakub Kicinski
@ 2019-03-01 16:27     ` Jiri Pirko
  2019-03-01 16:48       ` Jakub Kicinski
  0 siblings, 1 reply; 14+ messages in thread
From: Jiri Pirko @ 2019-03-01 16:27 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: netdev, davem, mlxsw, idosch, dirk.vandermerwe, f.fainelli,
	andrew, vivien.didelot

Fri, Mar 01, 2019 at 05:25:29PM CET, jakub.kicinski@netronome.com wrote:
>On Fri,  1 Mar 2019 09:14:02 +0100, Jiri Pirko wrote:
>> From: Jiri Pirko <jiri@mellanox.com>
>> 
>> Now it is unused, remove it.
>> 
>> Signed-off-by: Jiri Pirko <jiri@mellanox.com>
>
>Oh, you nuke this completely, that's going to conflict hard with my
>series :)
>
>(Provided the locking is okay) I think it'd be good if we flipped the
>logic in dev_get_phys_port_name().  Always try devlink:
>
>@@ -7872,7 +7873,7 @@ int dev_get_phys_port_name(struct net_device *dev,
> 	const struct net_device_ops *ops = dev->netdev_ops;
> 	
>+	if (!devlink_compat_phys_port_name_get(dev, name, len))
>+		return 0;
> 	if (!ops->ndo_get_phys_port_name)
>		return -EOPNOTSUPP;
> 	return ops->ndo_get_phys_port_name(dev, name, len);
> }
>
>NFP is using a single set of NDOs for PFs and VFs (which don't have
>devlink ports), so either it'd be good if I could call the devlink
>helper for real ports, or we need the above.

That wouldn't give correct results now. Until you introduce PF/VF port
flavours, devlink_compat_phys_port_name_get() does not assemble correct
names for them. So we have to call ndo_get_phys_port_name until it knows
how to do that.


>
>> diff --git a/include/net/devlink.h b/include/net/devlink.h
>> index ae2cd34da99e..227c453cc20e 100644
>> --- a/include/net/devlink.h
>> +++ b/include/net/devlink.h
>> @@ -578,8 +578,6 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port,
>>  			    enum devlink_port_flavour flavour,
>>  			    u32 port_number, bool split,
>>  			    u32 split_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,
>>  			u32 size, u16 ingress_pools_count,
>>  			u16 egress_pools_count, u16 ingress_tc_count,
>> @@ -794,13 +792,6 @@ static inline void devlink_port_attrs_set(struct devlink_port *devlink_port,
>>  {
>>  }
>>  
>> -static inline int
>> -devlink_port_get_phys_port_name(struct devlink_port *devlink_port,
>> -				char *name, size_t len)
>> -{
>> -	return -EOPNOTSUPP;
>> -}
>> -
>>  static inline int devlink_sb_register(struct devlink *devlink,
>>  				      unsigned int sb_index, u32 size,
>>  				      u16 ingress_pools_count,
>> diff --git a/net/core/devlink.c b/net/core/devlink.c
>> index 4fd45d4a4818..d90a745d8258 100644
>> --- a/net/core/devlink.c
>> +++ b/net/core/devlink.c
>> @@ -5451,13 +5451,6 @@ static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port,
>>  	return 0;
>>  }
>>  
>> -int devlink_port_get_phys_port_name(struct devlink_port *devlink_port,
>> -				    char *name, size_t len)
>> -{
>> -	return __devlink_port_phys_port_name_get(devlink_port, name, len);
>> -}
>> -EXPORT_SYMBOL_GPL(devlink_port_get_phys_port_name);
>> -
>>  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,
>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [patch net-next 5/5] net: devlink: remove unused devlink_port_get_phys_port_name() function
  2019-03-01 16:27     ` Jiri Pirko
@ 2019-03-01 16:48       ` Jakub Kicinski
  0 siblings, 0 replies; 14+ messages in thread
From: Jakub Kicinski @ 2019-03-01 16:48 UTC (permalink / raw)
  To: Jiri Pirko
  Cc: netdev, davem, mlxsw, idosch, dirk.vandermerwe, f.fainelli,
	andrew, vivien.didelot

On Fri, 1 Mar 2019 17:27:20 +0100, Jiri Pirko wrote:
> Fri, Mar 01, 2019 at 05:25:29PM CET, jakub.kicinski@netronome.com wrote:
> >On Fri,  1 Mar 2019 09:14:02 +0100, Jiri Pirko wrote:  
> >> From: Jiri Pirko <jiri@mellanox.com>
> >> 
> >> Now it is unused, remove it.
> >> 
> >> Signed-off-by: Jiri Pirko <jiri@mellanox.com>  
> >
> >Oh, you nuke this completely, that's going to conflict hard with my
> >series :)
> >
> >(Provided the locking is okay) I think it'd be good if we flipped the
> >logic in dev_get_phys_port_name().  Always try devlink:
> >
> >@@ -7872,7 +7873,7 @@ int dev_get_phys_port_name(struct net_device *dev,
> > 	const struct net_device_ops *ops = dev->netdev_ops;
> > 	
> >+	if (!devlink_compat_phys_port_name_get(dev, name, len))
> >+		return 0;
> > 	if (!ops->ndo_get_phys_port_name)
> >		return -EOPNOTSUPP;
> > 	return ops->ndo_get_phys_port_name(dev, name, len);
> > }
> >
> >NFP is using a single set of NDOs for PFs and VFs (which don't have
> >devlink ports), so either it'd be good if I could call the devlink
> >helper for real ports, or we need the above.  
> 
> That wouldn't give correct results now. Until you introduce PF/VF port
> flavours, devlink_compat_phys_port_name_get() does not assemble correct
> names for them. So we have to call ndo_get_phys_port_name until it knows
> how to do that.

Okay, yeah, this won't give correct results after my series though, so
please advise on which order you want these things merged?  I don't
think there were any changes or concerns with my series - one commit
message fix, split one helper into two, and wrap the peer into another
attr in the dump?  Can it go in first?

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [patch net-next 1/5] net: replace ndo_get_devlink for ndo_get_devlink_port
  2019-03-01  8:13 ` [patch net-next 1/5] net: replace ndo_get_devlink for ndo_get_devlink_port Jiri Pirko
  2019-03-01 12:45   ` Michal Kubecek
@ 2019-03-02  2:20   ` Florian Fainelli
  1 sibling, 0 replies; 14+ messages in thread
From: Florian Fainelli @ 2019-03-02  2:20 UTC (permalink / raw)
  To: Jiri Pirko, netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, dirk.vandermerwe, andrew,
	vivien.didelot



On 3/1/2019 12:13 AM, Jiri Pirko wrote:
> From: Jiri Pirko <jiri@mellanox.com>
> 
> Follow-up patch is going to need a devlink port instance according to
> a netdev. Devlink port instance should be always available when devlink
> is used. So change the recently introduced ndo_get_devlink to
> ndo_get_devlink_port. With that, adjust the wrapper for the only
> user to get devlink pointer.
> 
> Signed-off-by: Jiri Pirko <jiri@mellanox.com>

Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-- 
Florian

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2019-03-02  2:20 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-03-01  8:13 [patch net-next 0/5] net: call for phys_port_name into devlink directly is possible Jiri Pirko
2019-03-01  8:13 ` [patch net-next 1/5] net: replace ndo_get_devlink for ndo_get_devlink_port Jiri Pirko
2019-03-01 12:45   ` Michal Kubecek
2019-03-01 13:42     ` Jiri Pirko
2019-03-02  2:20   ` Florian Fainelli
2019-03-01  8:13 ` [patch net-next 2/5] net: devlink: introduce devlink_compat_phys_port_name_get() Jiri Pirko
2019-03-01 16:14   ` Jakub Kicinski
2019-03-01 16:21     ` Jiri Pirko
2019-03-01  8:14 ` [patch net-next 3/5] mlxsw: spectrum: Implement ndo_get_devlink_port Jiri Pirko
2019-03-01  8:14 ` [patch net-next 4/5] mlxsw: Remove ndo_get_phys_port_name implementation Jiri Pirko
2019-03-01  8:14 ` [patch net-next 5/5] net: devlink: remove unused devlink_port_get_phys_port_name() function Jiri Pirko
2019-03-01 16:25   ` Jakub Kicinski
2019-03-01 16:27     ` Jiri Pirko
2019-03-01 16:48       ` Jakub Kicinski

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).