All of lore.kernel.org
 help / color / mirror / Atom feed
* [patch net-next v2 00/15] devlink: small spring cleanup
@ 2019-03-22 16:56 Jiri Pirko
  2019-03-22 16:56 ` [patch net-next v2 01/15] net: devlink: add couple of missing mutex_destroy() calls Jiri Pirko
                   ` (14 more replies)
  0 siblings, 15 replies; 21+ messages in thread
From: Jiri Pirko @ 2019-03-22 16:56 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

Mostly cosmetics and janitor work.

Jiri Pirko (15):
  net: devlink: add couple of missing mutex_destroy() calls
  bnxt: add missing net/devlink.h include
  dsa: add missing net/devlink.h include
  bnxt: set devlink port attrs properly
  bnxt: call devlink_port_type_eth_set() before port register
  net: devlink: don't take devlink_mutex for devlink_compat_*
  net: devlink: don't pass return value of __devlink_port_type_set()
  mlxsw: Move devlink_port_attrs_set() call before register
  dsa: move devlink_port_attrs_set() call before register
  net: devlink: disallow port_attrs_set() to be called before register
  nfp: move devlink port type set after netdev registration
  bnxt: set devlink port type after registration
  net: devlink: warn on setting type on unregistered port
  net: devlink: add port type spinlock
  net: devlink: select NET_DEVLINK from drivers

 drivers/net/Kconfig                           |   1 +
 drivers/net/ethernet/broadcom/Kconfig         |   1 +
 .../net/ethernet/broadcom/bnxt/bnxt_devlink.c |   3 +
 drivers/net/ethernet/cavium/Kconfig           |   1 +
 drivers/net/ethernet/mellanox/mlx4/Kconfig    |   1 +
 .../net/ethernet/mellanox/mlx5/core/Kconfig   |   1 +
 drivers/net/ethernet/mellanox/mlxsw/Kconfig   |   1 +
 drivers/net/ethernet/mellanox/mlxsw/core.c    |  12 +-
 drivers/net/ethernet/mellanox/mlxsw/core.h    |   8 +-
 drivers/net/ethernet/mellanox/mlxsw/minimal.c |   5 +-
 .../net/ethernet/mellanox/mlxsw/spectrum.c    |   6 +-
 .../net/ethernet/mellanox/mlxsw/switchib.c    |   3 +-
 .../net/ethernet/mellanox/mlxsw/switchx2.c    |   5 +-
 drivers/net/ethernet/netronome/Kconfig        |   1 +
 .../net/ethernet/netronome/nfp/nfp_devlink.c  |  11 +-
 .../net/ethernet/netronome/nfp/nfp_net_main.c |   4 +
 drivers/net/ethernet/netronome/nfp/nfp_port.h |   2 +
 include/net/devlink.h                         | 499 +-----------------
 net/Kconfig                                   |   7 +-
 net/core/devlink.c                            |  51 +-
 net/dsa/Kconfig                               |   1 +
 net/dsa/dsa2.c                                |  48 +-
 22 files changed, 114 insertions(+), 558 deletions(-)

-- 
2.17.2


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

* [patch net-next v2 01/15] net: devlink: add couple of missing mutex_destroy() calls
  2019-03-22 16:56 [patch net-next v2 00/15] devlink: small spring cleanup Jiri Pirko
@ 2019-03-22 16:56 ` Jiri Pirko
  2019-03-22 16:56 ` [patch net-next v2 02/15] bnxt: add missing net/devlink.h include Jiri Pirko
                   ` (13 subsequent siblings)
  14 siblings, 0 replies; 21+ messages in thread
From: Jiri Pirko @ 2019-03-22 16:56 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

Add missing called to mutex_destroy() for two mutexes used
in devlink code.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
 net/core/devlink.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/net/core/devlink.c b/net/core/devlink.c
index 78e22cea4cc7..3dc51ddf7451 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -4486,6 +4486,7 @@ devlink_health_reporter_destroy(struct devlink_health_reporter *reporter)
 {
 	mutex_lock(&reporter->devlink->lock);
 	list_del(&reporter->list);
+	mutex_destroy(&reporter->dump_lock);
 	mutex_unlock(&reporter->devlink->lock);
 	if (reporter->dump_fmsg)
 		devlink_fmsg_free(reporter->dump_fmsg);
@@ -5298,6 +5299,7 @@ EXPORT_SYMBOL_GPL(devlink_unregister);
  */
 void devlink_free(struct devlink *devlink)
 {
+	mutex_destroy(&devlink->lock);
 	WARN_ON(!list_empty(&devlink->reporter_list));
 	WARN_ON(!list_empty(&devlink->region_list));
 	WARN_ON(!list_empty(&devlink->param_list));
-- 
2.17.2


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

* [patch net-next v2 02/15] bnxt: add missing net/devlink.h include
  2019-03-22 16:56 [patch net-next v2 00/15] devlink: small spring cleanup Jiri Pirko
  2019-03-22 16:56 ` [patch net-next v2 01/15] net: devlink: add couple of missing mutex_destroy() calls Jiri Pirko
@ 2019-03-22 16:56 ` Jiri Pirko
  2019-03-22 16:56 ` [patch net-next v2 03/15] dsa: " Jiri Pirko
                   ` (12 subsequent siblings)
  14 siblings, 0 replies; 21+ messages in thread
From: Jiri Pirko @ 2019-03-22 16:56 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

devlink functions are in use, so include the related header file.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
 drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
index e1feb97bcd81..ecb328ee8f5c 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
@@ -9,6 +9,7 @@
 
 #include <linux/pci.h>
 #include <linux/netdevice.h>
+#include <net/devlink.h>
 #include "bnxt_hsi.h"
 #include "bnxt.h"
 #include "bnxt_vfr.h"
-- 
2.17.2


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

* [patch net-next v2 03/15] dsa: add missing net/devlink.h include
  2019-03-22 16:56 [patch net-next v2 00/15] devlink: small spring cleanup Jiri Pirko
  2019-03-22 16:56 ` [patch net-next v2 01/15] net: devlink: add couple of missing mutex_destroy() calls Jiri Pirko
  2019-03-22 16:56 ` [patch net-next v2 02/15] bnxt: add missing net/devlink.h include Jiri Pirko
@ 2019-03-22 16:56 ` Jiri Pirko
  2019-03-22 16:56 ` [patch net-next v2 04/15] bnxt: set devlink port attrs properly Jiri Pirko
                   ` (11 subsequent siblings)
  14 siblings, 0 replies; 21+ messages in thread
From: Jiri Pirko @ 2019-03-22 16:56 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

devlink functions are in use, so include the related header file.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
---
 net/dsa/dsa2.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c
index c00ee464afc7..4558de672b4f 100644
--- a/net/dsa/dsa2.c
+++ b/net/dsa/dsa2.c
@@ -18,6 +18,7 @@
 #include <linux/rtnetlink.h>
 #include <linux/of.h>
 #include <linux/of_net.h>
+#include <net/devlink.h>
 
 #include "dsa_priv.h"
 
-- 
2.17.2


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

* [patch net-next v2 04/15] bnxt: set devlink port attrs properly
  2019-03-22 16:56 [patch net-next v2 00/15] devlink: small spring cleanup Jiri Pirko
                   ` (2 preceding siblings ...)
  2019-03-22 16:56 ` [patch net-next v2 03/15] dsa: " Jiri Pirko
@ 2019-03-22 16:56 ` Jiri Pirko
  2019-03-22 16:56 ` [patch net-next v2 05/15] bnxt: call devlink_port_type_eth_set() before port register Jiri Pirko
                   ` (10 subsequent siblings)
  14 siblings, 0 replies; 21+ messages in thread
From: Jiri Pirko @ 2019-03-22 16:56 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

Set the attrs properly so delink has enough info to generate physical
port names.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
 drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
index ecb328ee8f5c..ab6fd05c462b 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
@@ -229,6 +229,8 @@ int bnxt_dl_register(struct bnxt *bp)
 		goto err_dl_unreg;
 	}
 
+	devlink_port_attrs_set(&bp->dl_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
+			       bp->pf.port_id, false, 0);
 	rc = devlink_port_register(dl, &bp->dl_port, bp->pf.port_id);
 	if (rc) {
 		netdev_err(bp->dev, "devlink_port_register failed");
-- 
2.17.2


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

* [patch net-next v2 05/15] bnxt: call devlink_port_type_eth_set() before port register
  2019-03-22 16:56 [patch net-next v2 00/15] devlink: small spring cleanup Jiri Pirko
                   ` (3 preceding siblings ...)
  2019-03-22 16:56 ` [patch net-next v2 04/15] bnxt: set devlink port attrs properly Jiri Pirko
@ 2019-03-22 16:56 ` Jiri Pirko
  2019-03-22 16:56 ` [patch net-next v2 06/15] net: devlink: don't take devlink_mutex for devlink_compat_* Jiri Pirko
                   ` (9 subsequent siblings)
  14 siblings, 0 replies; 21+ messages in thread
From: Jiri Pirko @ 2019-03-22 16:56 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

Call devlink_port_type_eth_set() before devlink_port_register(). Bnxt
instances won't change type during lifetime. This avoids one extra
userspace devlink notification.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
 drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
index ab6fd05c462b..a266bff559dc 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
@@ -229,6 +229,7 @@ int bnxt_dl_register(struct bnxt *bp)
 		goto err_dl_unreg;
 	}
 
+	devlink_port_type_eth_set(&bp->dl_port, bp->dev);
 	devlink_port_attrs_set(&bp->dl_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
 			       bp->pf.port_id, false, 0);
 	rc = devlink_port_register(dl, &bp->dl_port, bp->pf.port_id);
@@ -236,7 +237,6 @@ int bnxt_dl_register(struct bnxt *bp)
 		netdev_err(bp->dev, "devlink_port_register failed");
 		goto err_dl_param_unreg;
 	}
-	devlink_port_type_eth_set(&bp->dl_port, bp->dev);
 
 	rc = devlink_port_params_register(&bp->dl_port, bnxt_dl_port_params,
 					  ARRAY_SIZE(bnxt_dl_port_params));
-- 
2.17.2


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

* [patch net-next v2 06/15] net: devlink: don't take devlink_mutex for devlink_compat_*
  2019-03-22 16:56 [patch net-next v2 00/15] devlink: small spring cleanup Jiri Pirko
                   ` (4 preceding siblings ...)
  2019-03-22 16:56 ` [patch net-next v2 05/15] bnxt: call devlink_port_type_eth_set() before port register Jiri Pirko
@ 2019-03-22 16:56 ` Jiri Pirko
  2019-03-22 16:56 ` [patch net-next v2 07/15] net: devlink: don't pass return value of __devlink_port_type_set() Jiri Pirko
                   ` (8 subsequent siblings)
  14 siblings, 0 replies; 21+ messages in thread
From: Jiri Pirko @ 2019-03-22 16:56 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

The netdevice is guaranteed to not disappear so we can rely that
devlink_port and devlink won't disappear as well. No need to take
devlink_mutex so don't take it here.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
 net/core/devlink.c | 18 ++++++++----------
 1 file changed, 8 insertions(+), 10 deletions(-)

diff --git a/net/core/devlink.c b/net/core/devlink.c
index 3dc51ddf7451..1e125c3b890c 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -6444,17 +6444,15 @@ void devlink_compat_running_version(struct net_device *dev,
 	dev_hold(dev);
 	rtnl_unlock();
 
-	mutex_lock(&devlink_mutex);
 	devlink = netdev_to_devlink(dev);
 	if (!devlink || !devlink->ops->info_get)
-		goto unlock_list;
+		goto out;
 
 	mutex_lock(&devlink->lock);
 	__devlink_compat_running_version(devlink, buf, len);
 	mutex_unlock(&devlink->lock);
-unlock_list:
-	mutex_unlock(&devlink_mutex);
 
+out:
 	rtnl_lock();
 	dev_put(dev);
 }
@@ -6462,22 +6460,22 @@ void devlink_compat_running_version(struct net_device *dev,
 int devlink_compat_flash_update(struct net_device *dev, const char *file_name)
 {
 	struct devlink *devlink;
-	int ret = -EOPNOTSUPP;
+	int ret;
 
 	dev_hold(dev);
 	rtnl_unlock();
 
-	mutex_lock(&devlink_mutex);
 	devlink = netdev_to_devlink(dev);
-	if (!devlink || !devlink->ops->flash_update)
-		goto unlock_list;
+	if (!devlink || !devlink->ops->flash_update) {
+		ret = -EOPNOTSUPP;
+		goto out;
+	}
 
 	mutex_lock(&devlink->lock);
 	ret = devlink->ops->flash_update(devlink, file_name, NULL, NULL);
 	mutex_unlock(&devlink->lock);
-unlock_list:
-	mutex_unlock(&devlink_mutex);
 
+out:
 	rtnl_lock();
 	dev_put(dev);
 
-- 
2.17.2


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

* [patch net-next v2 07/15] net: devlink: don't pass return value of __devlink_port_type_set()
  2019-03-22 16:56 [patch net-next v2 00/15] devlink: small spring cleanup Jiri Pirko
                   ` (5 preceding siblings ...)
  2019-03-22 16:56 ` [patch net-next v2 06/15] net: devlink: don't take devlink_mutex for devlink_compat_* Jiri Pirko
@ 2019-03-22 16:56 ` Jiri Pirko
  2019-03-22 16:56 ` [patch net-next v2 08/15] mlxsw: Move devlink_port_attrs_set() call before register Jiri Pirko
                   ` (7 subsequent siblings)
  14 siblings, 0 replies; 21+ messages in thread
From: Jiri Pirko @ 2019-03-22 16:56 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

__devlink_port_type_set() returns void, it makes no sense to pass it on,
so don't do that.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
 net/core/devlink.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/net/core/devlink.c b/net/core/devlink.c
index 1e125c3b890c..98ca788ffd97 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -5379,8 +5379,7 @@ static void __devlink_port_type_set(struct devlink_port *devlink_port,
 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_set(devlink_port, DEVLINK_PORT_TYPE_ETH, netdev);
 }
 EXPORT_SYMBOL_GPL(devlink_port_type_eth_set);
 
@@ -5393,8 +5392,7 @@ EXPORT_SYMBOL_GPL(devlink_port_type_eth_set);
 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_set(devlink_port, DEVLINK_PORT_TYPE_IB, ibdev);
 }
 EXPORT_SYMBOL_GPL(devlink_port_type_ib_set);
 
@@ -5405,8 +5403,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_set(devlink_port, DEVLINK_PORT_TYPE_NOTSET, NULL);
 }
 EXPORT_SYMBOL_GPL(devlink_port_type_clear);
 
-- 
2.17.2


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

* [patch net-next v2 08/15] mlxsw: Move devlink_port_attrs_set() call before register
  2019-03-22 16:56 [patch net-next v2 00/15] devlink: small spring cleanup Jiri Pirko
                   ` (6 preceding siblings ...)
  2019-03-22 16:56 ` [patch net-next v2 07/15] net: devlink: don't pass return value of __devlink_port_type_set() Jiri Pirko
@ 2019-03-22 16:56 ` Jiri Pirko
  2019-03-22 16:56 ` [patch net-next v2 09/15] dsa: move " Jiri Pirko
                   ` (6 subsequent siblings)
  14 siblings, 0 replies; 21+ messages in thread
From: Jiri Pirko @ 2019-03-22 16:56 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

Since attrs are static during the existence of devlink port, set the
before registration of the port.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlxsw/core.c     | 12 ++++++------
 drivers/net/ethernet/mellanox/mlxsw/core.h     |  8 ++++----
 drivers/net/ethernet/mellanox/mlxsw/minimal.c  |  5 +++--
 drivers/net/ethernet/mellanox/mlxsw/spectrum.c |  6 +++---
 drivers/net/ethernet/mellanox/mlxsw/switchib.c |  3 ++-
 drivers/net/ethernet/mellanox/mlxsw/switchx2.c |  5 +++--
 6 files changed, 21 insertions(+), 18 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c
index d23d53c0e284..e70bb673eeec 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/core.c
@@ -1718,7 +1718,9 @@ u64 mlxsw_core_res_get(struct mlxsw_core *mlxsw_core,
 }
 EXPORT_SYMBOL(mlxsw_core_res_get);
 
-int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port)
+int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port,
+			 u32 port_number, bool split,
+			 u32 split_port_subnumber)
 {
 	struct devlink *devlink = priv_to_devlink(mlxsw_core);
 	struct mlxsw_core_port *mlxsw_core_port =
@@ -1727,6 +1729,8 @@ int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port)
 	int err;
 
 	mlxsw_core_port->local_port = local_port;
+	devlink_port_attrs_set(devlink_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
+			       port_number, split, split_port_subnumber);
 	err = devlink_port_register(devlink, devlink_port, local_port);
 	if (err)
 		memset(mlxsw_core_port, 0, sizeof(*mlxsw_core_port));
@@ -1746,17 +1750,13 @@ void mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port)
 EXPORT_SYMBOL(mlxsw_core_port_fini);
 
 void mlxsw_core_port_eth_set(struct mlxsw_core *mlxsw_core, u8 local_port,
-			     void *port_driver_priv, struct net_device *dev,
-			     u32 port_number, bool split,
-			     u32 split_port_subnumber)
+			     void *port_driver_priv, struct net_device *dev)
 {
 	struct mlxsw_core_port *mlxsw_core_port =
 					&mlxsw_core->ports[local_port];
 	struct devlink_port *devlink_port = &mlxsw_core_port->devlink_port;
 
 	mlxsw_core_port->port_driver_priv = port_driver_priv;
-	devlink_port_attrs_set(devlink_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
-			       port_number, split, split_port_subnumber);
 	devlink_port_type_eth_set(devlink_port, dev);
 }
 EXPORT_SYMBOL(mlxsw_core_port_eth_set);
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.h b/drivers/net/ethernet/mellanox/mlxsw/core.h
index 8ec53f027575..74e95e943b24 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core.h
+++ b/drivers/net/ethernet/mellanox/mlxsw/core.h
@@ -164,12 +164,12 @@ void mlxsw_core_lag_mapping_clear(struct mlxsw_core *mlxsw_core,
 				  u16 lag_id, u8 local_port);
 
 void *mlxsw_core_port_driver_priv(struct mlxsw_core_port *mlxsw_core_port);
-int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port);
+int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port,
+			 u32 port_number, bool split,
+			 u32 split_port_subnumber);
 void mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port);
 void mlxsw_core_port_eth_set(struct mlxsw_core *mlxsw_core, u8 local_port,
-			     void *port_driver_priv, struct net_device *dev,
-			     u32 port_number, bool split,
-			     u32 split_port_subnumber);
+			     void *port_driver_priv, struct net_device *dev);
 void mlxsw_core_port_ib_set(struct mlxsw_core *mlxsw_core, u8 local_port,
 			    void *port_driver_priv);
 void mlxsw_core_port_clear(struct mlxsw_core *mlxsw_core, u8 local_port,
diff --git a/drivers/net/ethernet/mellanox/mlxsw/minimal.c b/drivers/net/ethernet/mellanox/mlxsw/minimal.c
index 00c390024350..0ee1656609f5 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/minimal.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/minimal.c
@@ -150,7 +150,8 @@ mlxsw_m_port_create(struct mlxsw_m *mlxsw_m, u8 local_port, u8 module)
 	struct net_device *dev;
 	int err;
 
-	err = mlxsw_core_port_init(mlxsw_m->core, local_port);
+	err = mlxsw_core_port_init(mlxsw_m->core, local_port,
+				   module + 1, false, 0);
 	if (err) {
 		dev_err(mlxsw_m->bus_info->dev, "Port %d: Failed to init core port\n",
 			local_port);
@@ -190,7 +191,7 @@ mlxsw_m_port_create(struct mlxsw_m *mlxsw_m, u8 local_port, u8 module)
 	}
 
 	mlxsw_core_port_eth_set(mlxsw_m->core, mlxsw_m_port->local_port,
-				mlxsw_m_port, dev, module + 1, false, 0);
+				mlxsw_m_port, dev);
 
 	return 0;
 
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
index 9eb63300c1d3..eaf86c4c2f6c 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -3391,7 +3391,8 @@ static int mlxsw_sp_port_create(struct mlxsw_sp *mlxsw_sp, u8 local_port,
 	struct net_device *dev;
 	int err;
 
-	err = mlxsw_core_port_init(mlxsw_sp->core, local_port);
+	err = mlxsw_core_port_init(mlxsw_sp->core, local_port,
+				   module + 1, split, lane / width);
 	if (err) {
 		dev_err(mlxsw_sp->bus_info->dev, "Port %d: Failed to init core port\n",
 			local_port);
@@ -3573,8 +3574,7 @@ static int mlxsw_sp_port_create(struct mlxsw_sp *mlxsw_sp, u8 local_port,
 	}
 
 	mlxsw_core_port_eth_set(mlxsw_sp->core, mlxsw_sp_port->local_port,
-				mlxsw_sp_port, dev, module + 1,
-				mlxsw_sp_port->split, lane / width);
+				mlxsw_sp_port, dev);
 	mlxsw_core_schedule_dw(&mlxsw_sp_port->periodic_hw_stats.update_dw, 0);
 	return 0;
 
diff --git a/drivers/net/ethernet/mellanox/mlxsw/switchib.c b/drivers/net/ethernet/mellanox/mlxsw/switchib.c
index bcf2e79a21c8..e1e7e0dd808d 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/switchib.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/switchib.c
@@ -267,7 +267,8 @@ static int mlxsw_sib_port_create(struct mlxsw_sib *mlxsw_sib, u8 local_port,
 {
 	int err;
 
-	err = mlxsw_core_port_init(mlxsw_sib->core, local_port);
+	err = mlxsw_core_port_init(mlxsw_sib->core, local_port,
+				   module + 1, false, 0);
 	if (err) {
 		dev_err(mlxsw_sib->bus_info->dev, "Port %d: Failed to init core port\n",
 			local_port);
diff --git a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
index 533fe6235b7c..568883fc40df 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
@@ -1102,7 +1102,7 @@ static int __mlxsw_sx_port_eth_create(struct mlxsw_sx *mlxsw_sx, u8 local_port,
 	}
 
 	mlxsw_core_port_eth_set(mlxsw_sx->core, mlxsw_sx_port->local_port,
-				mlxsw_sx_port, dev, module + 1, false, 0);
+				mlxsw_sx_port, dev);
 	mlxsw_sx->ports[local_port] = mlxsw_sx_port;
 	return 0;
 
@@ -1127,7 +1127,8 @@ static int mlxsw_sx_port_eth_create(struct mlxsw_sx *mlxsw_sx, u8 local_port,
 {
 	int err;
 
-	err = mlxsw_core_port_init(mlxsw_sx->core, local_port);
+	err = mlxsw_core_port_init(mlxsw_sx->core, local_port,
+				   module + 1, false, 0);
 	if (err) {
 		dev_err(mlxsw_sx->bus_info->dev, "Port %d: Failed to init core port\n",
 			local_port);
-- 
2.17.2


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

* [patch net-next v2 09/15] dsa: move devlink_port_attrs_set() call before register
  2019-03-22 16:56 [patch net-next v2 00/15] devlink: small spring cleanup Jiri Pirko
                   ` (7 preceding siblings ...)
  2019-03-22 16:56 ` [patch net-next v2 08/15] mlxsw: Move devlink_port_attrs_set() call before register Jiri Pirko
@ 2019-03-22 16:56 ` Jiri Pirko
  2019-03-22 20:47   ` Andrew Lunn
  2019-03-22 16:56 ` [patch net-next v2 10/15] net: devlink: disallow port_attrs_set() to be called " Jiri Pirko
                   ` (5 subsequent siblings)
  14 siblings, 1 reply; 21+ messages in thread
From: Jiri Pirko @ 2019-03-22 16:56 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

Since attrs are static during the existence of devlink port, set the
before registration of the port.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
v1->v2:
- fixed comment for port numbering
---
 net/dsa/dsa2.c | 47 ++++++++++++++++++++++++++---------------------
 1 file changed, 26 insertions(+), 21 deletions(-)

diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c
index 4558de672b4f..fe0a6197db9c 100644
--- a/net/dsa/dsa2.c
+++ b/net/dsa/dsa2.c
@@ -258,14 +258,36 @@ static void dsa_tree_teardown_default_cpu(struct dsa_switch_tree *dst)
 
 static int dsa_port_setup(struct dsa_port *dp)
 {
+	enum devlink_port_flavour flavour;
 	struct dsa_switch *ds = dp->ds;
-	int err = 0;
+	int err;
+
+	if (dp->type == DSA_PORT_TYPE_UNUSED)
+		return 0;
 
 	memset(&dp->devlink_port, 0, sizeof(dp->devlink_port));
 
-	if (dp->type != DSA_PORT_TYPE_UNUSED)
-		err = devlink_port_register(ds->devlink, &dp->devlink_port,
-					    dp->index);
+	switch (dp->type) {
+	case DSA_PORT_TYPE_CPU:
+		flavour = DEVLINK_PORT_FLAVOUR_CPU;
+		break;
+	case DSA_PORT_TYPE_DSA:
+		flavour = DEVLINK_PORT_FLAVOUR_DSA;
+		break;
+	case DSA_PORT_TYPE_USER: /* fall-through */
+	default:
+		flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
+		break;
+	}
+
+	/* dp->index is used now as port_number. However
+	 * CPU and DSA ports should have separate numbering
+	 * independent from front panel port numbers.
+	 */
+	devlink_port_attrs_set(&dp->devlink_port, flavour,
+			       dp->index, false, 0);
+	err = devlink_port_register(ds->devlink, &dp->devlink_port,
+				    dp->index);
 	if (err)
 		return err;
 
@@ -273,13 +295,6 @@ static int dsa_port_setup(struct dsa_port *dp)
 	case DSA_PORT_TYPE_UNUSED:
 		break;
 	case DSA_PORT_TYPE_CPU:
-		/* dp->index is used now as port_number. However
-		 * CPU ports should have separate numbering
-		 * independent from front panel port numbers.
-		 */
-		devlink_port_attrs_set(&dp->devlink_port,
-				       DEVLINK_PORT_FLAVOUR_CPU,
-				       dp->index, false, 0);
 		err = dsa_port_link_register_of(dp);
 		if (err) {
 			dev_err(ds->dev, "failed to setup link for port %d.%d\n",
@@ -288,13 +303,6 @@ static int dsa_port_setup(struct dsa_port *dp)
 		}
 		break;
 	case DSA_PORT_TYPE_DSA:
-		/* dp->index is used now as port_number. However
-		 * DSA ports should have separate numbering
-		 * independent from front panel port numbers.
-		 */
-		devlink_port_attrs_set(&dp->devlink_port,
-				       DEVLINK_PORT_FLAVOUR_DSA,
-				       dp->index, false, 0);
 		err = dsa_port_link_register_of(dp);
 		if (err) {
 			dev_err(ds->dev, "failed to setup link for port %d.%d\n",
@@ -303,9 +311,6 @@ static int dsa_port_setup(struct dsa_port *dp)
 		}
 		break;
 	case DSA_PORT_TYPE_USER:
-		devlink_port_attrs_set(&dp->devlink_port,
-				       DEVLINK_PORT_FLAVOUR_PHYSICAL,
-				       dp->index, false, 0);
 		err = dsa_slave_create(dp);
 		if (err)
 			dev_err(ds->dev, "failed to create slave for port %d.%d\n",
-- 
2.17.2


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

* [patch net-next v2 10/15] net: devlink: disallow port_attrs_set() to be called before register
  2019-03-22 16:56 [patch net-next v2 00/15] devlink: small spring cleanup Jiri Pirko
                   ` (8 preceding siblings ...)
  2019-03-22 16:56 ` [patch net-next v2 09/15] dsa: move " Jiri Pirko
@ 2019-03-22 16:56 ` Jiri Pirko
  2019-03-22 16:56 ` [patch net-next v2 11/15] nfp: move devlink port type set after netdev registration Jiri Pirko
                   ` (4 subsequent siblings)
  14 siblings, 0 replies; 21+ messages in thread
From: Jiri Pirko @ 2019-03-22 16:56 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

Since the port attributes are static and cannot change during the port
lifetime, WARN_ON if some driver calls it after registration. Also, no
need to call notifications as it is noop anyway due to check of
devlink_port->registered there.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
 net/core/devlink.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/net/core/devlink.c b/net/core/devlink.c
index 98ca788ffd97..f77a68f72d14 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -5425,12 +5425,13 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port,
 {
 	struct devlink_port_attrs *attrs = &devlink_port->attrs;
 
+	if (WARN_ON(devlink_port->registered))
+		return;
 	attrs->set = true;
 	attrs->flavour = flavour;
 	attrs->port_number = port_number;
 	attrs->split = split;
 	attrs->split_subport_number = split_subport_number;
-	devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
 }
 EXPORT_SYMBOL_GPL(devlink_port_attrs_set);
 
-- 
2.17.2


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

* [patch net-next v2 11/15] nfp: move devlink port type set after netdev registration
  2019-03-22 16:56 [patch net-next v2 00/15] devlink: small spring cleanup Jiri Pirko
                   ` (9 preceding siblings ...)
  2019-03-22 16:56 ` [patch net-next v2 10/15] net: devlink: disallow port_attrs_set() to be called " Jiri Pirko
@ 2019-03-22 16:56 ` Jiri Pirko
  2019-03-23 20:31   ` Jakub Kicinski
  2019-03-22 16:56 ` [patch net-next v2 12/15] bnxt: set devlink port type after registration Jiri Pirko
                   ` (3 subsequent siblings)
  14 siblings, 1 reply; 21+ messages in thread
From: Jiri Pirko @ 2019-03-22 16:56 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

Similar to other driver, move the port type set after netdev registration
is done. Along with that, clear the type before unregistration.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
v1->v2:
- new patch
---
 drivers/net/ethernet/netronome/nfp/nfp_devlink.c  | 11 ++++++++++-
 drivers/net/ethernet/netronome/nfp/nfp_net_main.c |  4 ++++
 drivers/net/ethernet/netronome/nfp/nfp_port.h     |  2 ++
 3 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
index e9eca99cf493..cb59a18ec6a6 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
@@ -362,7 +362,6 @@ int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port)
 	if (ret)
 		return ret;
 
-	devlink_port_type_eth_set(&port->dl_port, port->netdev);
 	devlink_port_attrs_set(&port->dl_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
 			       eth_port.label_port, eth_port.is_split,
 			       eth_port.label_subport);
@@ -377,6 +376,16 @@ void nfp_devlink_port_unregister(struct nfp_port *port)
 	devlink_port_unregister(&port->dl_port);
 }
 
+void nfp_devlink_port_type_eth_set(struct nfp_port *port)
+{
+	devlink_port_type_eth_set(&port->dl_port, port->netdev);
+}
+
+void nfp_devlink_port_type_clear(struct nfp_port *port)
+{
+	devlink_port_type_clear(&port->dl_port);
+}
+
 struct devlink *nfp_devlink_get_devlink(struct net_device *netdev)
 {
 	struct nfp_app *app;
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c
index 08f5fdbd8e41..e29744f2af02 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c
@@ -169,6 +169,8 @@ nfp_net_pf_init_vnic(struct nfp_pf *pf, struct nfp_net *nn, unsigned int id)
 		if (err)
 			goto err_devlink_port_clean;
 	}
+	if (nn->port)
+		nfp_devlink_port_type_eth_set(nn->port);
 
 	return 0;
 
@@ -218,6 +220,8 @@ nfp_net_pf_alloc_vnics(struct nfp_pf *pf, void __iomem *ctrl_bar,
 
 static void nfp_net_pf_clean_vnic(struct nfp_pf *pf, struct nfp_net *nn)
 {
+	if (nn->port)
+		nfp_devlink_port_type_clear(nn->port);
 	if (nfp_net_is_data_vnic(nn))
 		nfp_app_vnic_clean(pf->app, nn);
 	if (nn->port)
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_port.h b/drivers/net/ethernet/netronome/nfp/nfp_port.h
index 90ae053f5c07..d7fd203bb180 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_port.h
+++ b/drivers/net/ethernet/netronome/nfp/nfp_port.h
@@ -131,6 +131,8 @@ int nfp_net_refresh_port_table_sync(struct nfp_pf *pf);
 
 int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port);
 void nfp_devlink_port_unregister(struct nfp_port *port);
+void nfp_devlink_port_type_eth_set(struct nfp_port *port);
+void nfp_devlink_port_type_clear(struct nfp_port *port);
 
 /**
  * Mac stats (0x0000 - 0x0200)
-- 
2.17.2


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

* [patch net-next v2 12/15] bnxt: set devlink port type after registration
  2019-03-22 16:56 [patch net-next v2 00/15] devlink: small spring cleanup Jiri Pirko
                   ` (10 preceding siblings ...)
  2019-03-22 16:56 ` [patch net-next v2 11/15] nfp: move devlink port type set after netdev registration Jiri Pirko
@ 2019-03-22 16:56 ` Jiri Pirko
  2019-03-22 16:56 ` [patch net-next v2 13/15] net: devlink: warn on setting type on unregistered port Jiri Pirko
                   ` (2 subsequent siblings)
  14 siblings, 0 replies; 21+ messages in thread
From: Jiri Pirko @ 2019-03-22 16:56 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

Move the type set of devlink port after it is registered.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
v1->v2:
- new patch
---
 drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
index a266bff559dc..ab6fd05c462b 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
@@ -229,7 +229,6 @@ int bnxt_dl_register(struct bnxt *bp)
 		goto err_dl_unreg;
 	}
 
-	devlink_port_type_eth_set(&bp->dl_port, bp->dev);
 	devlink_port_attrs_set(&bp->dl_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
 			       bp->pf.port_id, false, 0);
 	rc = devlink_port_register(dl, &bp->dl_port, bp->pf.port_id);
@@ -237,6 +236,7 @@ int bnxt_dl_register(struct bnxt *bp)
 		netdev_err(bp->dev, "devlink_port_register failed");
 		goto err_dl_param_unreg;
 	}
+	devlink_port_type_eth_set(&bp->dl_port, bp->dev);
 
 	rc = devlink_port_params_register(&bp->dl_port, bnxt_dl_port_params,
 					  ARRAY_SIZE(bnxt_dl_port_params));
-- 
2.17.2


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

* [patch net-next v2 13/15] net: devlink: warn on setting type on unregistered port
  2019-03-22 16:56 [patch net-next v2 00/15] devlink: small spring cleanup Jiri Pirko
                   ` (11 preceding siblings ...)
  2019-03-22 16:56 ` [patch net-next v2 12/15] bnxt: set devlink port type after registration Jiri Pirko
@ 2019-03-22 16:56 ` Jiri Pirko
  2019-03-22 16:56 ` [patch net-next v2 14/15] net: devlink: add port type spinlock Jiri Pirko
  2019-03-22 16:56 ` [patch net-next v2 15/15] net: devlink: select NET_DEVLINK from drivers Jiri Pirko
  14 siblings, 0 replies; 21+ messages in thread
From: Jiri Pirko @ 2019-03-22 16:56 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

Port needs to be registered first before the type is set. Warn and
bail-out in case it is not.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
v1->v2:
- new patch
---
 net/core/devlink.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/net/core/devlink.c b/net/core/devlink.c
index f77a68f72d14..ff3e31010954 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -5365,6 +5365,8 @@ static void __devlink_port_type_set(struct devlink_port *devlink_port,
 				    enum devlink_port_type type,
 				    void *type_dev)
 {
+	if (WARN_ON(!devlink_port->registered))
+		return;
 	devlink_port->type = type;
 	devlink_port->type_dev = type_dev;
 	devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
-- 
2.17.2


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

* [patch net-next v2 14/15] net: devlink: add port type spinlock
  2019-03-22 16:56 [patch net-next v2 00/15] devlink: small spring cleanup Jiri Pirko
                   ` (12 preceding siblings ...)
  2019-03-22 16:56 ` [patch net-next v2 13/15] net: devlink: warn on setting type on unregistered port Jiri Pirko
@ 2019-03-22 16:56 ` Jiri Pirko
  2019-03-22 16:56 ` [patch net-next v2 15/15] net: devlink: select NET_DEVLINK from drivers Jiri Pirko
  14 siblings, 0 replies; 21+ messages in thread
From: Jiri Pirko @ 2019-03-22 16:56 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

Add spinlock to protect port type and type_dev pointer consistency.
Without that, userspace may see inconsistent type and type_dev
combinations.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
v1->v2:
- rebased
---
 include/net/devlink.h |  4 ++++
 net/core/devlink.c    | 17 +++++++++++++----
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/include/net/devlink.h b/include/net/devlink.h
index 63de99e09f04..cb9b060033e1 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -16,6 +16,7 @@
 #include <linux/gfp.h>
 #include <linux/list.h>
 #include <linux/netdevice.h>
+#include <linux/spinlock.h>
 #include <net/net_namespace.h>
 #include <uapi/linux/devlink.h>
 
@@ -53,6 +54,9 @@ struct devlink_port {
 	struct devlink *devlink;
 	unsigned index;
 	bool registered;
+	spinlock_t type_lock; /* Protects type and type_dev
+			       * pointer consistency.
+			       */
 	enum devlink_port_type type;
 	enum devlink_port_type desired_type;
 	void *type_dev;
diff --git a/net/core/devlink.c b/net/core/devlink.c
index ff3e31010954..cf389e26a32d 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -19,6 +19,7 @@
 #include <linux/device.h>
 #include <linux/list.h>
 #include <linux/netdevice.h>
+#include <linux/spinlock.h>
 #include <rdma/ib_verbs.h>
 #include <net/netlink.h>
 #include <net/genetlink.h>
@@ -543,12 +544,14 @@ static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink,
 		goto nla_put_failure;
 	if (nla_put_u32(msg, DEVLINK_ATTR_PORT_INDEX, devlink_port->index))
 		goto nla_put_failure;
+
+	spin_lock(&devlink_port->type_lock);
 	if (nla_put_u16(msg, DEVLINK_ATTR_PORT_TYPE, devlink_port->type))
-		goto nla_put_failure;
+		goto nla_put_failure_type_locked;
 	if (devlink_port->desired_type != DEVLINK_PORT_TYPE_NOTSET &&
 	    nla_put_u16(msg, DEVLINK_ATTR_PORT_DESIRED_TYPE,
 			devlink_port->desired_type))
-		goto nla_put_failure;
+		goto nla_put_failure_type_locked;
 	if (devlink_port->type == DEVLINK_PORT_TYPE_ETH) {
 		struct net_device *netdev = devlink_port->type_dev;
 
@@ -557,7 +560,7 @@ static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink,
 				 netdev->ifindex) ||
 		     nla_put_string(msg, DEVLINK_ATTR_PORT_NETDEV_NAME,
 				    netdev->name)))
-			goto nla_put_failure;
+			goto nla_put_failure_type_locked;
 	}
 	if (devlink_port->type == DEVLINK_PORT_TYPE_IB) {
 		struct ib_device *ibdev = devlink_port->type_dev;
@@ -565,14 +568,17 @@ static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink,
 		if (ibdev &&
 		    nla_put_string(msg, DEVLINK_ATTR_PORT_IBDEV_NAME,
 				   ibdev->name))
-			goto nla_put_failure;
+			goto nla_put_failure_type_locked;
 	}
+	spin_unlock(&devlink_port->type_lock);
 	if (devlink_nl_port_attrs_put(msg, devlink_port))
 		goto nla_put_failure;
 
 	genlmsg_end(msg, hdr);
 	return 0;
 
+nla_put_failure_type_locked:
+	spin_unlock(&devlink_port->type_lock);
 nla_put_failure:
 	genlmsg_cancel(msg, hdr);
 	return -EMSGSIZE;
@@ -5337,6 +5343,7 @@ int devlink_port_register(struct devlink *devlink,
 	devlink_port->devlink = devlink;
 	devlink_port->index = port_index;
 	devlink_port->registered = true;
+	spin_lock_init(&devlink_port->type_lock);
 	list_add_tail(&devlink_port->list, &devlink->port_list);
 	INIT_LIST_HEAD(&devlink_port->param_list);
 	mutex_unlock(&devlink->lock);
@@ -5367,8 +5374,10 @@ static void __devlink_port_type_set(struct devlink_port *devlink_port,
 {
 	if (WARN_ON(!devlink_port->registered))
 		return;
+	spin_lock(&devlink_port->type_lock);
 	devlink_port->type = type;
 	devlink_port->type_dev = type_dev;
+	spin_unlock(&devlink_port->type_lock);
 	devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
 }
 
-- 
2.17.2


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

* [patch net-next v2 15/15] net: devlink: select NET_DEVLINK from drivers
  2019-03-22 16:56 [patch net-next v2 00/15] devlink: small spring cleanup Jiri Pirko
                   ` (13 preceding siblings ...)
  2019-03-22 16:56 ` [patch net-next v2 14/15] net: devlink: add port type spinlock Jiri Pirko
@ 2019-03-22 16:56 ` Jiri Pirko
  14 siblings, 0 replies; 21+ messages in thread
From: Jiri Pirko @ 2019-03-22 16:56 UTC (permalink / raw)
  To: netdev
  Cc: davem, mlxsw, idosch, jakub.kicinski, f.fainelli, andrew, vivien.didelot

From: Jiri Pirko <jiri@mellanox.com>

Some drivers are becoming more dependent on NET_DEVLINK being selected
in configuration. With upcoming compat functions, the behavior would be
wrong in case devlink was not compiled in. So make the drivers select
NET_DEVLINK and rely on the functions being there, not just stubs.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
 drivers/net/Kconfig                           |   1 +
 drivers/net/ethernet/broadcom/Kconfig         |   1 +
 drivers/net/ethernet/cavium/Kconfig           |   1 +
 drivers/net/ethernet/mellanox/mlx4/Kconfig    |   1 +
 .../net/ethernet/mellanox/mlx5/core/Kconfig   |   1 +
 drivers/net/ethernet/mellanox/mlxsw/Kconfig   |   1 +
 drivers/net/ethernet/netronome/Kconfig        |   1 +
 include/net/devlink.h                         | 495 +-----------------
 net/Kconfig                                   |   7 +-
 net/dsa/Kconfig                               |   1 +
 10 files changed, 13 insertions(+), 497 deletions(-)

diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 7a96d168efc4..bc42f131f47c 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -505,6 +505,7 @@ source "drivers/net/hyperv/Kconfig"
 config NETDEVSIM
 	tristate "Simulated networking device"
 	depends on DEBUG_FS
+	select NET_DEVLINK
 	help
 	  This driver is a developer testing tool and software model that can
 	  be used to test various control path networking APIs, especially
diff --git a/drivers/net/ethernet/broadcom/Kconfig b/drivers/net/ethernet/broadcom/Kconfig
index 716bfbba59cf..461b2c0b2ed6 100644
--- a/drivers/net/ethernet/broadcom/Kconfig
+++ b/drivers/net/ethernet/broadcom/Kconfig
@@ -196,6 +196,7 @@ config BNXT
 	depends on PCI
 	select FW_LOADER
 	select LIBCRC32C
+	select NET_DEVLINK
 	---help---
 	  This driver supports Broadcom NetXtreme-C/E 10/25/40/50 gigabit
 	  Ethernet cards.  To compile this driver as a module, choose M here:
diff --git a/drivers/net/ethernet/cavium/Kconfig b/drivers/net/ethernet/cavium/Kconfig
index 6650e2a5f171..7612ab6b286d 100644
--- a/drivers/net/ethernet/cavium/Kconfig
+++ b/drivers/net/ethernet/cavium/Kconfig
@@ -68,6 +68,7 @@ config LIQUIDIO
 	imply PTP_1588_CLOCK
 	select FW_LOADER
 	select LIBCRC32C
+	select NET_DEVLINK
 	---help---
 	  This driver supports Cavium LiquidIO Intelligent Server Adapters
 	  based on CN66XX, CN68XX and CN23XX chips.
diff --git a/drivers/net/ethernet/mellanox/mlx4/Kconfig b/drivers/net/ethernet/mellanox/mlx4/Kconfig
index ff8057ed97ee..8491db57b0b0 100644
--- a/drivers/net/ethernet/mellanox/mlx4/Kconfig
+++ b/drivers/net/ethernet/mellanox/mlx4/Kconfig
@@ -26,6 +26,7 @@ config MLX4_EN_DCB
 config MLX4_CORE
 	tristate
 	depends on PCI
+	select NET_DEVLINK
 	default n
 
 config MLX4_DEBUG
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/Kconfig b/drivers/net/ethernet/mellanox/mlx5/core/Kconfig
index 6debffb8336b..9aca8086ee01 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/Kconfig
+++ b/drivers/net/ethernet/mellanox/mlx5/core/Kconfig
@@ -5,6 +5,7 @@
 config MLX5_CORE
 	tristate "Mellanox 5th generation network adapters (ConnectX series) core driver"
 	depends on PCI
+	select NET_DEVLINK
 	imply PTP_1588_CLOCK
 	imply VXLAN
 	default n
diff --git a/drivers/net/ethernet/mellanox/mlxsw/Kconfig b/drivers/net/ethernet/mellanox/mlxsw/Kconfig
index 9c195dfed031..b6b3ff0fe17f 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/Kconfig
+++ b/drivers/net/ethernet/mellanox/mlxsw/Kconfig
@@ -4,6 +4,7 @@
 
 config MLXSW_CORE
 	tristate "Mellanox Technologies Switch ASICs support"
+	select NET_DEVLINK
 	---help---
 	  This driver supports Mellanox Technologies Switch ASICs family.
 
diff --git a/drivers/net/ethernet/netronome/Kconfig b/drivers/net/ethernet/netronome/Kconfig
index 549898d5d450..f0d0e09f60e2 100644
--- a/drivers/net/ethernet/netronome/Kconfig
+++ b/drivers/net/ethernet/netronome/Kconfig
@@ -19,6 +19,7 @@ config NFP
 	tristate "Netronome(R) NFP4000/NFP6000 NIC driver"
 	depends on PCI && PCI_MSI
 	depends on VXLAN || VXLAN=n
+	select NET_DEVLINK
 	---help---
 	  This driver supports the Netronome(R) NFP4000/NFP6000 based
 	  cards working as a advanced Ethernet NIC.  It works with both
diff --git a/include/net/devlink.h b/include/net/devlink.h
index cb9b060033e1..03fb16f4fb6c 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -549,17 +549,13 @@ static inline struct devlink *priv_to_devlink(void *priv)
 
 static inline struct devlink *netdev_to_devlink(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);
-#endif
 	return NULL;
 }
 
 struct ib_device;
 
-#if IS_ENABLED(CONFIG_NET_DEVLINK)
-
 struct devlink *devlink_alloc(const struct devlink_ops *ops, size_t priv_size);
 int devlink_register(struct devlink *devlink, struct device *dev);
 void devlink_unregister(struct devlink *devlink);
@@ -728,500 +724,14 @@ void
 devlink_health_reporter_state_update(struct devlink_health_reporter *reporter,
 				     enum devlink_health_reporter_state state);
 
+#if IS_ENABLED(CONFIG_NET_DEVLINK)
+
 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);
 
 #else
 
-static inline struct devlink *devlink_alloc(const struct devlink_ops *ops,
-					    size_t priv_size)
-{
-	return kzalloc(sizeof(struct devlink) + priv_size, GFP_KERNEL);
-}
-
-static inline int devlink_register(struct devlink *devlink, struct device *dev)
-{
-	return 0;
-}
-
-static inline void devlink_unregister(struct devlink *devlink)
-{
-}
-
-static inline void devlink_params_publish(struct devlink *devlink)
-{
-}
-
-static inline void devlink_params_unpublish(struct devlink *devlink)
-{
-}
-
-static inline void devlink_free(struct devlink *devlink)
-{
-	kfree(devlink);
-}
-
-static inline int devlink_port_register(struct devlink *devlink,
-					struct devlink_port *devlink_port,
-					unsigned int port_index)
-{
-	return 0;
-}
-
-static inline void devlink_port_unregister(struct devlink_port *devlink_port)
-{
-}
-
-static inline void devlink_port_type_eth_set(struct devlink_port *devlink_port,
-					     struct net_device *netdev)
-{
-}
-
-static inline void devlink_port_type_ib_set(struct devlink_port *devlink_port,
-					    struct ib_device *ibdev)
-{
-}
-
-static inline void devlink_port_type_clear(struct devlink_port *devlink_port)
-{
-}
-
-static inline void devlink_port_attrs_set(struct devlink_port *devlink_port,
-					  enum devlink_port_flavour flavour,
-					  u32 port_number, bool split,
-					  u32 split_subport_number)
-{
-}
-
-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,
-				      u16 egress_pools_count,
-				      u16 ingress_tc_count,
-				      u16 egress_tc_count)
-{
-	return 0;
-}
-
-static inline void devlink_sb_unregister(struct devlink *devlink,
-					 unsigned int sb_index)
-{
-}
-
-static inline int
-devlink_dpipe_table_register(struct devlink *devlink,
-			     const char *table_name,
-			     struct devlink_dpipe_table_ops *table_ops,
-			     void *priv, bool counter_control_extern)
-{
-	return 0;
-}
-
-static inline void devlink_dpipe_table_unregister(struct devlink *devlink,
-						  const char *table_name)
-{
-}
-
-static inline int devlink_dpipe_headers_register(struct devlink *devlink,
-						 struct devlink_dpipe_headers *
-						 dpipe_headers)
-{
-	return 0;
-}
-
-static inline void devlink_dpipe_headers_unregister(struct devlink *devlink)
-{
-}
-
-static inline bool devlink_dpipe_table_counter_enabled(struct devlink *devlink,
-						       const char *table_name)
-{
-	return false;
-}
-
-static inline int
-devlink_dpipe_entry_ctx_prepare(struct devlink_dpipe_dump_ctx *dump_ctx)
-{
-	return 0;
-}
-
-static inline int
-devlink_dpipe_entry_ctx_append(struct devlink_dpipe_dump_ctx *dump_ctx,
-			       struct devlink_dpipe_entry *entry)
-{
-	return 0;
-}
-
-static inline int
-devlink_dpipe_entry_ctx_close(struct devlink_dpipe_dump_ctx *dump_ctx)
-{
-	return 0;
-}
-
-static inline void
-devlink_dpipe_entry_clear(struct devlink_dpipe_entry *entry)
-{
-}
-
-static inline int
-devlink_dpipe_action_put(struct sk_buff *skb,
-			 struct devlink_dpipe_action *action)
-{
-	return 0;
-}
-
-static inline int
-devlink_dpipe_match_put(struct sk_buff *skb,
-			struct devlink_dpipe_match *match)
-{
-	return 0;
-}
-
-static inline int
-devlink_resource_register(struct devlink *devlink,
-			  const char *resource_name,
-			  u64 resource_size,
-			  u64 resource_id,
-			  u64 parent_resource_id,
-			  const struct devlink_resource_size_params *size_params)
-{
-	return 0;
-}
-
-static inline void
-devlink_resources_unregister(struct devlink *devlink,
-			     struct devlink_resource *resource)
-{
-}
-
-static inline int
-devlink_resource_size_get(struct devlink *devlink, u64 resource_id,
-			  u64 *p_resource_size)
-{
-	return -EOPNOTSUPP;
-}
-
-static inline int
-devlink_dpipe_table_resource_set(struct devlink *devlink,
-				 const char *table_name, u64 resource_id,
-				 u64 resource_units)
-{
-	return -EOPNOTSUPP;
-}
-
-static inline void
-devlink_resource_occ_get_register(struct devlink *devlink,
-				  u64 resource_id,
-				  devlink_resource_occ_get_t *occ_get,
-				  void *occ_get_priv)
-{
-}
-
-static inline void
-devlink_resource_occ_get_unregister(struct devlink *devlink,
-				    u64 resource_id)
-{
-}
-
-static inline int
-devlink_params_register(struct devlink *devlink,
-			const struct devlink_param *params,
-			size_t params_count)
-{
-	return 0;
-}
-
-static inline void
-devlink_params_unregister(struct devlink *devlink,
-			  const struct devlink_param *params,
-			  size_t params_count)
-{
-
-}
-
-static inline int
-devlink_port_params_register(struct devlink_port *devlink_port,
-			     const struct devlink_param *params,
-			     size_t params_count)
-{
-	return 0;
-}
-
-static inline void
-devlink_port_params_unregister(struct devlink_port *devlink_port,
-			       const struct devlink_param *params,
-			       size_t params_count)
-{
-}
-
-static inline int
-devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
-				   union devlink_param_value *init_val)
-{
-	return -EOPNOTSUPP;
-}
-
-static inline int
-devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
-				   union devlink_param_value init_val)
-{
-	return -EOPNOTSUPP;
-}
-
-static inline int
-devlink_port_param_driverinit_value_get(struct devlink_port *devlink_port,
-					u32 param_id,
-					union devlink_param_value *init_val)
-{
-	return -EOPNOTSUPP;
-}
-
-static inline int
-devlink_port_param_driverinit_value_set(struct devlink_port *devlink_port,
-					u32 param_id,
-					union devlink_param_value init_val)
-{
-	return -EOPNOTSUPP;
-}
-
-static inline void
-devlink_param_value_changed(struct devlink *devlink, u32 param_id)
-{
-}
-
-static inline void
-devlink_port_param_value_changed(struct devlink_port *devlink_port,
-				 u32 param_id)
-{
-}
-
-static inline void
-devlink_param_value_str_fill(union devlink_param_value *dst_val,
-			     const char *src)
-{
-}
-
-static inline struct devlink_region *
-devlink_region_create(struct devlink *devlink,
-		      const char *region_name,
-		      u32 region_max_snapshots,
-		      u64 region_size)
-{
-	return NULL;
-}
-
-static inline void
-devlink_region_destroy(struct devlink_region *region)
-{
-}
-
-static inline u32
-devlink_region_shapshot_id_get(struct devlink *devlink)
-{
-	return 0;
-}
-
-static inline int
-devlink_region_snapshot_create(struct devlink_region *region, u64 data_len,
-			       u8 *data, u32 snapshot_id,
-			       devlink_snapshot_data_dest_t *data_destructor)
-{
-	return 0;
-}
-
-static inline int
-devlink_info_driver_name_put(struct devlink_info_req *req, const char *name)
-{
-	return 0;
-}
-
-static inline int
-devlink_info_serial_number_put(struct devlink_info_req *req, const char *sn)
-{
-	return 0;
-}
-
-static inline int
-devlink_info_version_fixed_put(struct devlink_info_req *req,
-			       const char *version_name,
-			       const char *version_value)
-{
-	return 0;
-}
-
-static inline int
-devlink_info_version_stored_put(struct devlink_info_req *req,
-				const char *version_name,
-				const char *version_value)
-{
-	return 0;
-}
-
-static inline int
-devlink_info_version_running_put(struct devlink_info_req *req,
-				 const char *version_name,
-				 const char *version_value)
-{
-	return 0;
-}
-
-static inline int
-devlink_fmsg_obj_nest_start(struct devlink_fmsg *fmsg)
-{
-	return 0;
-}
-
-static inline int
-devlink_fmsg_obj_nest_end(struct devlink_fmsg *fmsg)
-{
-	return 0;
-}
-
-static inline int
-devlink_fmsg_pair_nest_start(struct devlink_fmsg *fmsg, const char *name)
-{
-	return 0;
-}
-
-static inline int
-devlink_fmsg_pair_nest_end(struct devlink_fmsg *fmsg)
-{
-	return 0;
-}
-
-static inline int
-devlink_fmsg_arr_pair_nest_start(struct devlink_fmsg *fmsg,
-				 const char *name)
-{
-	return 0;
-}
-
-static inline int
-devlink_fmsg_arr_pair_nest_end(struct devlink_fmsg *fmsg)
-{
-	return 0;
-}
-
-static inline int
-devlink_fmsg_bool_put(struct devlink_fmsg *fmsg, bool value)
-{
-	return 0;
-}
-
-static inline int
-devlink_fmsg_u8_put(struct devlink_fmsg *fmsg, u8 value)
-{
-	return 0;
-}
-
-static inline int
-devlink_fmsg_u32_put(struct devlink_fmsg *fmsg, u32 value)
-{
-	return 0;
-}
-
-static inline int
-devlink_fmsg_u64_put(struct devlink_fmsg *fmsg, u64 value)
-{
-	return 0;
-}
-
-static inline int
-devlink_fmsg_string_put(struct devlink_fmsg *fmsg, const char *value)
-{
-	return 0;
-}
-
-static inline int
-devlink_fmsg_binary_put(struct devlink_fmsg *fmsg, const void *value,
-			u16 value_len)
-{
-	return 0;
-}
-
-static inline int
-devlink_fmsg_bool_pair_put(struct devlink_fmsg *fmsg, const char *name,
-			   bool value)
-{
-	return 0;
-}
-
-static inline int
-devlink_fmsg_u8_pair_put(struct devlink_fmsg *fmsg, const char *name,
-			 u8 value)
-{
-	return 0;
-}
-
-static inline int
-devlink_fmsg_u32_pair_put(struct devlink_fmsg *fmsg, const char *name,
-			  u32 value)
-{
-	return 0;
-}
-
-static inline int
-devlink_fmsg_u64_pair_put(struct devlink_fmsg *fmsg, const char *name,
-			  u64 value)
-{
-	return 0;
-}
-
-static inline int
-devlink_fmsg_string_pair_put(struct devlink_fmsg *fmsg, const char *name,
-			     const char *value)
-{
-	return 0;
-}
-
-static inline int
-devlink_fmsg_binary_pair_put(struct devlink_fmsg *fmsg, const char *name,
-			     const void *value, u16 value_len)
-{
-	return 0;
-}
-
-static inline struct devlink_health_reporter *
-devlink_health_reporter_create(struct devlink *devlink,
-			       const struct devlink_health_reporter_ops *ops,
-			       u64 graceful_period, bool auto_recover,
-			       void *priv)
-{
-	return NULL;
-}
-
-static inline void
-devlink_health_reporter_destroy(struct devlink_health_reporter *reporter)
-{
-}
-
-static inline void *
-devlink_health_reporter_priv(struct devlink_health_reporter *reporter)
-{
-	return NULL;
-}
-
-static inline int
-devlink_health_report(struct devlink_health_reporter *reporter,
-		      const char *msg, void *priv_ctx)
-{
-	return 0;
-}
-
-static inline void
-devlink_health_reporter_state_update(struct devlink_health_reporter *reporter,
-				     enum devlink_health_reporter_state state)
-{
-}
-
 static inline void
 devlink_compat_running_version(struct net_device *dev, char *buf, size_t len)
 {
@@ -1232,6 +742,7 @@ devlink_compat_flash_update(struct net_device *dev, const char *file_name)
 {
 	return -EOPNOTSUPP;
 }
+
 #endif
 
 #endif /* _NET_DEVLINK_H_ */
diff --git a/net/Kconfig b/net/Kconfig
index 1efe1f9ee492..3e8fdd688329 100644
--- a/net/Kconfig
+++ b/net/Kconfig
@@ -429,11 +429,8 @@ config NET_SOCK_MSG
 	  with the help of BPF programs.
 
 config NET_DEVLINK
-	bool "Network physical/parent device Netlink interface"
-	help
-	  Network physical/parent device Netlink interface provides
-	  infrastructure to support access to physical chip-wide config and
-	  monitoring.
+	bool
+	default n
 
 config PAGE_POOL
        bool
diff --git a/net/dsa/Kconfig b/net/dsa/Kconfig
index fab49132345f..b695170795c2 100644
--- a/net/dsa/Kconfig
+++ b/net/dsa/Kconfig
@@ -10,6 +10,7 @@ config NET_DSA
 	depends on BRIDGE || BRIDGE=n
 	select NET_SWITCHDEV
 	select PHYLINK
+	select NET_DEVLINK
 	---help---
 	  Say Y if you want to enable support for the hardware switches supported
 	  by the Distributed Switch Architecture.
-- 
2.17.2


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

* Re: [patch net-next v2 09/15] dsa: move devlink_port_attrs_set() call before register
  2019-03-22 16:56 ` [patch net-next v2 09/15] dsa: move " Jiri Pirko
@ 2019-03-22 20:47   ` Andrew Lunn
  0 siblings, 0 replies; 21+ messages in thread
From: Andrew Lunn @ 2019-03-22 20:47 UTC (permalink / raw)
  To: Jiri Pirko
  Cc: netdev, davem, mlxsw, idosch, jakub.kicinski, f.fainelli, vivien.didelot

On Fri, Mar 22, 2019 at 05:56:30PM +0100, Jiri Pirko wrote:
> From: Jiri Pirko <jiri@mellanox.com>
> 
> Since attrs are static during the existence of devlink port, set the
> before registration of the port.
> 
> Signed-off-by: Jiri Pirko <jiri@mellanox.com>

Reviewed-by: Andrew Lunn <andrew@lunn.ch>

    Andrew

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

* Re: [patch net-next v2 11/15] nfp: move devlink port type set after netdev registration
  2019-03-22 16:56 ` [patch net-next v2 11/15] nfp: move devlink port type set after netdev registration Jiri Pirko
@ 2019-03-23 20:31   ` Jakub Kicinski
  2019-03-23 22:47     ` Jiri Pirko
  0 siblings, 1 reply; 21+ messages in thread
From: Jakub Kicinski @ 2019-03-23 20:31 UTC (permalink / raw)
  To: Jiri Pirko
  Cc: netdev, davem, mlxsw, idosch, f.fainelli, andrew, vivien.didelot

On Fri, 22 Mar 2019 17:56:32 +0100, Jiri Pirko wrote:
> From: Jiri Pirko <jiri@mellanox.com>
> 
> Similar to other driver, move the port type set after netdev registration
> is done. Along with that, clear the type before unregistration.
> 
> Signed-off-by: Jiri Pirko <jiri@mellanox.com>
> diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
> index e9eca99cf493..cb59a18ec6a6 100644
> --- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
> +++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
> @@ -362,7 +362,6 @@ int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port)
>  	if (ret)
>  		return ret;
>  
> -	devlink_port_type_eth_set(&port->dl_port, port->netdev);
>  	devlink_port_attrs_set(&port->dl_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
>  			       eth_port.label_port, eth_port.is_split,
>  			       eth_port.label_subport);
> @@ -377,6 +376,16 @@ void nfp_devlink_port_unregister(struct nfp_port *port)
>  	devlink_port_unregister(&port->dl_port);
>  }
>  
> +void nfp_devlink_port_type_eth_set(struct nfp_port *port)
> +{
> +	devlink_port_type_eth_set(&port->dl_port, port->netdev);
> +}
> +
> +void nfp_devlink_port_type_clear(struct nfp_port *port)
> +{
> +	devlink_port_type_clear(&port->dl_port);
> +}
> +
>  struct devlink *nfp_devlink_get_devlink(struct net_device *netdev)
>  {
>  	struct nfp_app *app;
> diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c
> index 08f5fdbd8e41..e29744f2af02 100644
> --- a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c
> +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c
> @@ -169,6 +169,8 @@ nfp_net_pf_init_vnic(struct nfp_pf *pf, struct nfp_net *nn, unsigned int id)
>  		if (err)
>  			goto err_devlink_port_clean;
>  	}
> +	if (nn->port)
> +		nfp_devlink_port_type_eth_set(nn->port);
>  
>  	return 0;
>  
> @@ -218,6 +220,8 @@ nfp_net_pf_alloc_vnics(struct nfp_pf *pf, void __iomem *ctrl_bar,
>  
>  static void nfp_net_pf_clean_vnic(struct nfp_pf *pf, struct nfp_net *nn)
>  {
> +	if (nn->port)
> +		nfp_devlink_port_type_clear(nn->port);
>  	if (nfp_net_is_data_vnic(nn))
>  		nfp_app_vnic_clean(pf->app, nn);

Sorry for not noticing right away, I thought you just split my patch in
two, but it seems you reordered the app_vnic_init/clean calls with the
type setting.  I'd rather those calls happened on fully initialized
netdev (and port), could you perhaps just take this patch into the
series:

https://git.kernel.org/pub/scm/linux/kernel/git/kuba/linux.git/commit/?h=devlink-pci-ports&id=1debfdef5aef369412e72f370d11120d309a6a74

>  	if (nn->port)

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

* Re: [patch net-next v2 11/15] nfp: move devlink port type set after netdev registration
  2019-03-23 20:31   ` Jakub Kicinski
@ 2019-03-23 22:47     ` Jiri Pirko
  2019-03-24  3:04       ` Jakub Kicinski
  0 siblings, 1 reply; 21+ messages in thread
From: Jiri Pirko @ 2019-03-23 22:47 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: netdev, davem, mlxsw, idosch, f.fainelli, andrew, vivien.didelot

Sat, Mar 23, 2019 at 09:31:02PM CET, jakub.kicinski@netronome.com wrote:
>On Fri, 22 Mar 2019 17:56:32 +0100, Jiri Pirko wrote:
>> From: Jiri Pirko <jiri@mellanox.com>
>> 
>> Similar to other driver, move the port type set after netdev registration
>> is done. Along with that, clear the type before unregistration.
>> 
>> Signed-off-by: Jiri Pirko <jiri@mellanox.com>
>> diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
>> index e9eca99cf493..cb59a18ec6a6 100644
>> --- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
>> +++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
>> @@ -362,7 +362,6 @@ int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port)
>>  	if (ret)
>>  		return ret;
>>  
>> -	devlink_port_type_eth_set(&port->dl_port, port->netdev);
>>  	devlink_port_attrs_set(&port->dl_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
>>  			       eth_port.label_port, eth_port.is_split,
>>  			       eth_port.label_subport);
>> @@ -377,6 +376,16 @@ void nfp_devlink_port_unregister(struct nfp_port *port)
>>  	devlink_port_unregister(&port->dl_port);
>>  }
>>  
>> +void nfp_devlink_port_type_eth_set(struct nfp_port *port)
>> +{
>> +	devlink_port_type_eth_set(&port->dl_port, port->netdev);
>> +}
>> +
>> +void nfp_devlink_port_type_clear(struct nfp_port *port)
>> +{
>> +	devlink_port_type_clear(&port->dl_port);
>> +}
>> +
>>  struct devlink *nfp_devlink_get_devlink(struct net_device *netdev)
>>  {
>>  	struct nfp_app *app;
>> diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c
>> index 08f5fdbd8e41..e29744f2af02 100644
>> --- a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c
>> +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c
>> @@ -169,6 +169,8 @@ nfp_net_pf_init_vnic(struct nfp_pf *pf, struct nfp_net *nn, unsigned int id)
>>  		if (err)
>>  			goto err_devlink_port_clean;
>>  	}
>> +	if (nn->port)
>> +		nfp_devlink_port_type_eth_set(nn->port);
>>  
>>  	return 0;
>>  
>> @@ -218,6 +220,8 @@ nfp_net_pf_alloc_vnics(struct nfp_pf *pf, void __iomem *ctrl_bar,
>>  
>>  static void nfp_net_pf_clean_vnic(struct nfp_pf *pf, struct nfp_net *nn)
>>  {
>> +	if (nn->port)
>> +		nfp_devlink_port_type_clear(nn->port);
>>  	if (nfp_net_is_data_vnic(nn))
>>  		nfp_app_vnic_clean(pf->app, nn);
>
>Sorry for not noticing right away, I thought you just split my patch in
>two, but it seems you reordered the app_vnic_init/clean calls with the

I did the patch from scratch.


>type setting.  I'd rather those calls happened on fully initialized
>netdev (and port), could you perhaps just take this patch into the

I don't get it, you are commenting cleanup part. On init, the type set
happens on fully initialized devlink_port and netdev.


>series:
>
>https://git.kernel.org/pub/scm/linux/kernel/git/kuba/linux.git/commit/?h=devlink-pci-ports&id=1debfdef5aef369412e72f370d11120d309a6a74
>
>>  	if (nn->port)

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

* Re: [patch net-next v2 11/15] nfp: move devlink port type set after netdev registration
  2019-03-23 22:47     ` Jiri Pirko
@ 2019-03-24  3:04       ` Jakub Kicinski
  2019-03-24  8:01         ` Jiri Pirko
  0 siblings, 1 reply; 21+ messages in thread
From: Jakub Kicinski @ 2019-03-24  3:04 UTC (permalink / raw)
  To: Jiri Pirko
  Cc: netdev, davem, mlxsw, idosch, f.fainelli, andrew, vivien.didelot

On Sat, 23 Mar 2019 23:47:50 +0100, Jiri Pirko wrote:
> >type setting.  I'd rather those calls happened on fully initialized
> >netdev (and port), could you perhaps just take this patch into the  
> 
> I don't get it, you are commenting cleanup part. On init, the type set
> happens on fully initialized devlink_port and netdev.

I'm talking about internal nfp API calls, nfp_app_vnic_init() and
nfp_app_vnic_clean() should be called while vNIC is completely
initialized and registered from stack's PoV.  netdev, and devlink 
port fully initialized and set up.  I don't think it matters much, 
just an imperfection.

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

* Re: [patch net-next v2 11/15] nfp: move devlink port type set after netdev registration
  2019-03-24  3:04       ` Jakub Kicinski
@ 2019-03-24  8:01         ` Jiri Pirko
  0 siblings, 0 replies; 21+ messages in thread
From: Jiri Pirko @ 2019-03-24  8:01 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: netdev, davem, mlxsw, idosch, f.fainelli, andrew, vivien.didelot

Sun, Mar 24, 2019 at 04:04:05AM CET, jakub.kicinski@netronome.com wrote:
>On Sat, 23 Mar 2019 23:47:50 +0100, Jiri Pirko wrote:
>> >type setting.  I'd rather those calls happened on fully initialized
>> >netdev (and port), could you perhaps just take this patch into the  
>> 
>> I don't get it, you are commenting cleanup part. On init, the type set
>> happens on fully initialized devlink_port and netdev.
>
>I'm talking about internal nfp API calls, nfp_app_vnic_init() and
>nfp_app_vnic_clean() should be called while vNIC is completely
>initialized and registered from stack's PoV.  netdev, and devlink 
>port fully initialized and set up.  I don't think it matters much, 
>just an imperfection.

Oh, I get it. Will change the order. Thanks.

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

end of thread, other threads:[~2019-03-24  8:12 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-22 16:56 [patch net-next v2 00/15] devlink: small spring cleanup Jiri Pirko
2019-03-22 16:56 ` [patch net-next v2 01/15] net: devlink: add couple of missing mutex_destroy() calls Jiri Pirko
2019-03-22 16:56 ` [patch net-next v2 02/15] bnxt: add missing net/devlink.h include Jiri Pirko
2019-03-22 16:56 ` [patch net-next v2 03/15] dsa: " Jiri Pirko
2019-03-22 16:56 ` [patch net-next v2 04/15] bnxt: set devlink port attrs properly Jiri Pirko
2019-03-22 16:56 ` [patch net-next v2 05/15] bnxt: call devlink_port_type_eth_set() before port register Jiri Pirko
2019-03-22 16:56 ` [patch net-next v2 06/15] net: devlink: don't take devlink_mutex for devlink_compat_* Jiri Pirko
2019-03-22 16:56 ` [patch net-next v2 07/15] net: devlink: don't pass return value of __devlink_port_type_set() Jiri Pirko
2019-03-22 16:56 ` [patch net-next v2 08/15] mlxsw: Move devlink_port_attrs_set() call before register Jiri Pirko
2019-03-22 16:56 ` [patch net-next v2 09/15] dsa: move " Jiri Pirko
2019-03-22 20:47   ` Andrew Lunn
2019-03-22 16:56 ` [patch net-next v2 10/15] net: devlink: disallow port_attrs_set() to be called " Jiri Pirko
2019-03-22 16:56 ` [patch net-next v2 11/15] nfp: move devlink port type set after netdev registration Jiri Pirko
2019-03-23 20:31   ` Jakub Kicinski
2019-03-23 22:47     ` Jiri Pirko
2019-03-24  3:04       ` Jakub Kicinski
2019-03-24  8:01         ` Jiri Pirko
2019-03-22 16:56 ` [patch net-next v2 12/15] bnxt: set devlink port type after registration Jiri Pirko
2019-03-22 16:56 ` [patch net-next v2 13/15] net: devlink: warn on setting type on unregistered port Jiri Pirko
2019-03-22 16:56 ` [patch net-next v2 14/15] net: devlink: add port type spinlock Jiri Pirko
2019-03-22 16:56 ` [patch net-next v2 15/15] net: devlink: select NET_DEVLINK from drivers Jiri Pirko

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.