All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next v2 0/3] mlxsw: spectrum_buffers: Add the ability to query the CPU port's shared buffer
@ 2019-09-16  6:17 Ido Schimmel
  2019-09-16  6:17 ` [PATCH net-next v2 1/3] mlxsw: spectrum_buffers: Prevent changing CPU port's configuration Ido Schimmel
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Ido Schimmel @ 2019-09-16  6:17 UTC (permalink / raw)
  To: netdev; +Cc: davem, jiri, shalomt, mlxsw, Ido Schimmel

From: Ido Schimmel <idosch@mellanox.com>

Shalom says:

While debugging packet loss towards the CPU, it is useful to be able to
query the CPU port's shared buffer quotas and occupancy.

Patch #1 prevents changing the CPU port's threshold and binding.

Patch #2 registers the CPU port with devlink.

Patch #3 adds the ability to query the CPU port's shared buffer quotas and
occupancy.

v2:

Patch #1:
* s/0/MLXSW_PORT_CPU_PORT/
* Assign "mlxsw_sp->ports[MLXSW_PORT_CPU_PORT" at the end of
  mlxsw_sp_cpu_port_create() to avoid NULL assignment on error path
* Add common functions for mlxsw_core_port_init/fini()

Patch #2:
* Move "changing CPU port's threshold and binding" check to a separate
  patch

Shalom Toledo (3):
  mlxsw: spectrum_buffers: Prevent changing CPU port's configuration
  mlxsw: spectrum: Register CPU port with devlink
  mlxsw: spectrum_buffers: Add the ability to query the CPU port's
    shared buffer

 drivers/net/ethernet/mellanox/mlxsw/core.c    | 65 ++++++++++++++++---
 drivers/net/ethernet/mellanox/mlxsw/core.h    |  5 ++
 .../net/ethernet/mellanox/mlxsw/spectrum.c    | 46 +++++++++++++
 .../mellanox/mlxsw/spectrum_buffers.c         | 51 ++++++++++++---
 4 files changed, 150 insertions(+), 17 deletions(-)

-- 
2.21.0


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

* [PATCH net-next v2 1/3] mlxsw: spectrum_buffers: Prevent changing CPU port's configuration
  2019-09-16  6:17 [PATCH net-next v2 0/3] mlxsw: spectrum_buffers: Add the ability to query the CPU port's shared buffer Ido Schimmel
@ 2019-09-16  6:17 ` Ido Schimmel
  2019-09-16  7:00   ` Jiri Pirko
  2019-09-16  6:17 ` [PATCH net-next v2 2/3] mlxsw: spectrum: Register CPU port with devlink Ido Schimmel
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 9+ messages in thread
From: Ido Schimmel @ 2019-09-16  6:17 UTC (permalink / raw)
  To: netdev; +Cc: davem, jiri, shalomt, mlxsw, Ido Schimmel

From: Shalom Toledo <shalomt@mellanox.com>

Next patch is going to register the CPU port with devlink, but only so
that the CPU port's shared buffer configuration and occupancy could be
queried.

Prevent changing CPU port's shared buffer threshold and binding
configuration.

Signed-off-by: Shalom Toledo <shalomt@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c
index 888ba4300bcc..f1dbde73fa78 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c
@@ -1085,6 +1085,11 @@ int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port,
 	u32 max_buff;
 	int err;
 
+	if (local_port == MLXSW_PORT_CPU_PORT) {
+		NL_SET_ERR_MSG_MOD(extack, "Changing CPU port's threshold is forbidden");
+		return -EINVAL;
+	}
+
 	err = mlxsw_sp_sb_threshold_in(mlxsw_sp, pool_index,
 				       threshold, &max_buff, extack);
 	if (err)
@@ -1130,6 +1135,11 @@ int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port,
 	u32 max_buff;
 	int err;
 
+	if (local_port == MLXSW_PORT_CPU_PORT) {
+		NL_SET_ERR_MSG_MOD(extack, "Changing CPU port's binding is forbidden");
+		return -EINVAL;
+	}
+
 	if (dir != mlxsw_sp->sb_vals->pool_dess[pool_index].dir) {
 		NL_SET_ERR_MSG_MOD(extack, "Binding egress TC to ingress pool and vice versa is forbidden");
 		return -EINVAL;
-- 
2.21.0


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

* [PATCH net-next v2 2/3] mlxsw: spectrum: Register CPU port with devlink
  2019-09-16  6:17 [PATCH net-next v2 0/3] mlxsw: spectrum_buffers: Add the ability to query the CPU port's shared buffer Ido Schimmel
  2019-09-16  6:17 ` [PATCH net-next v2 1/3] mlxsw: spectrum_buffers: Prevent changing CPU port's configuration Ido Schimmel
@ 2019-09-16  6:17 ` Ido Schimmel
  2019-09-16  7:08   ` Jiri Pirko
  2019-09-16  6:17 ` [PATCH net-next v2 3/3] mlxsw: spectrum_buffers: Add the ability to query the CPU port's shared buffer Ido Schimmel
  2019-09-16  8:14 ` [PATCH net-next v2 0/3] " Shalom Toledo
  3 siblings, 1 reply; 9+ messages in thread
From: Ido Schimmel @ 2019-09-16  6:17 UTC (permalink / raw)
  To: netdev; +Cc: davem, jiri, shalomt, mlxsw, Ido Schimmel

From: Shalom Toledo <shalomt@mellanox.com>

Register CPU port with devlink.

Signed-off-by: Shalom Toledo <shalomt@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlxsw/core.c    | 65 ++++++++++++++++---
 drivers/net/ethernet/mellanox/mlxsw/core.h    |  5 ++
 .../net/ethernet/mellanox/mlxsw/spectrum.c    | 46 +++++++++++++
 3 files changed, 107 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c
index 3fa96076e8a5..66354b05fd6c 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/core.c
@@ -1864,11 +1864,13 @@ 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,
-			 u32 port_number, bool split,
-			 u32 split_port_subnumber,
-			 const unsigned char *switch_id,
-			 unsigned char switch_id_len)
+static int
+__mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port,
+		       enum devlink_port_flavour flavour,
+		       u32 port_number, bool split,
+		       u32 split_port_subnumber,
+		       const unsigned char *switch_id,
+		       unsigned char switch_id_len)
 {
 	struct devlink *devlink = priv_to_devlink(mlxsw_core);
 	struct mlxsw_core_port *mlxsw_core_port =
@@ -1877,17 +1879,17 @@ 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,
+	devlink_port_attrs_set(devlink_port, flavour, port_number,
+			       split, split_port_subnumber,
 			       switch_id, switch_id_len);
 	err = devlink_port_register(devlink, devlink_port, local_port);
 	if (err)
 		memset(mlxsw_core_port, 0, sizeof(*mlxsw_core_port));
 	return err;
 }
-EXPORT_SYMBOL(mlxsw_core_port_init);
 
-void mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port)
+static void
+__mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port)
 {
 	struct mlxsw_core_port *mlxsw_core_port =
 					&mlxsw_core->ports[local_port];
@@ -1896,8 +1898,53 @@ void mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port)
 	devlink_port_unregister(devlink_port);
 	memset(mlxsw_core_port, 0, sizeof(*mlxsw_core_port));
 }
+
+int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port,
+			 u32 port_number, bool split,
+			 u32 split_port_subnumber,
+			 const unsigned char *switch_id,
+			 unsigned char switch_id_len)
+{
+	return __mlxsw_core_port_init(mlxsw_core, local_port,
+				      DEVLINK_PORT_FLAVOUR_PHYSICAL,
+				      port_number, split, split_port_subnumber,
+				      switch_id, switch_id_len);
+}
+EXPORT_SYMBOL(mlxsw_core_port_init);
+
+void mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port)
+{
+	__mlxsw_core_port_fini(mlxsw_core, local_port);
+}
 EXPORT_SYMBOL(mlxsw_core_port_fini);
 
+int mlxsw_core_cpu_port_init(struct mlxsw_core *mlxsw_core,
+			     void *port_driver_priv,
+			     const unsigned char *switch_id,
+			     unsigned char switch_id_len)
+{
+	struct mlxsw_core_port *mlxsw_core_port =
+				&mlxsw_core->ports[MLXSW_PORT_CPU_PORT];
+	int err;
+
+	err = __mlxsw_core_port_init(mlxsw_core, MLXSW_PORT_CPU_PORT,
+				     DEVLINK_PORT_FLAVOUR_CPU,
+				     0, false, 0,
+				     switch_id, switch_id_len);
+	if (err)
+		return err;
+
+	mlxsw_core_port->port_driver_priv = port_driver_priv;
+	return 0;
+}
+EXPORT_SYMBOL(mlxsw_core_cpu_port_init);
+
+void mlxsw_core_cpu_port_fini(struct mlxsw_core *mlxsw_core)
+{
+	__mlxsw_core_port_fini(mlxsw_core, MLXSW_PORT_CPU_PORT);
+}
+EXPORT_SYMBOL(mlxsw_core_cpu_port_fini);
+
 void mlxsw_core_port_eth_set(struct mlxsw_core *mlxsw_core, u8 local_port,
 			     void *port_driver_priv, struct net_device *dev)
 {
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.h b/drivers/net/ethernet/mellanox/mlxsw/core.h
index b65a17d49e43..5d7d2ab6d155 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core.h
+++ b/drivers/net/ethernet/mellanox/mlxsw/core.h
@@ -177,6 +177,11 @@ int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port,
 			 const unsigned char *switch_id,
 			 unsigned char switch_id_len);
 void mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port);
+int mlxsw_core_cpu_port_init(struct mlxsw_core *mlxsw_core,
+			     void *port_driver_priv,
+			     const unsigned char *switch_id,
+			     unsigned char switch_id_len);
+void mlxsw_core_cpu_port_fini(struct mlxsw_core *mlxsw_core);
 void mlxsw_core_port_eth_set(struct mlxsw_core *mlxsw_core, u8 local_port,
 			     void *port_driver_priv, struct net_device *dev);
 void mlxsw_core_port_ib_set(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 91e4792bb7e7..dd234cf7b39d 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -3872,6 +3872,45 @@ static void mlxsw_sp_port_remove(struct mlxsw_sp *mlxsw_sp, u8 local_port)
 	mlxsw_core_port_fini(mlxsw_sp->core, local_port);
 }
 
+static int mlxsw_sp_cpu_port_create(struct mlxsw_sp *mlxsw_sp)
+{
+	struct mlxsw_sp_port *mlxsw_sp_port;
+	int err;
+
+	mlxsw_sp_port = kzalloc(sizeof(*mlxsw_sp_port), GFP_KERNEL);
+	if (!mlxsw_sp_port)
+		return -ENOMEM;
+
+	mlxsw_sp_port->mlxsw_sp = mlxsw_sp;
+	mlxsw_sp_port->local_port = MLXSW_PORT_CPU_PORT;
+
+	err = mlxsw_core_cpu_port_init(mlxsw_sp->core,
+				       mlxsw_sp_port,
+				       mlxsw_sp->base_mac,
+				       sizeof(mlxsw_sp->base_mac));
+	if (err) {
+		dev_err(mlxsw_sp->bus_info->dev, "Failed to initialize core CPU port\n");
+		goto err_core_cpu_port_init;
+	}
+
+	mlxsw_sp->ports[MLXSW_PORT_CPU_PORT] = mlxsw_sp_port;
+	return 0;
+
+err_core_cpu_port_init:
+	kfree(mlxsw_sp_port);
+	return err;
+}
+
+static void mlxsw_sp_cpu_port_remove(struct mlxsw_sp *mlxsw_sp)
+{
+	struct mlxsw_sp_port *mlxsw_sp_port =
+				mlxsw_sp->ports[MLXSW_PORT_CPU_PORT];
+
+	mlxsw_core_cpu_port_fini(mlxsw_sp->core);
+	mlxsw_sp->ports[MLXSW_PORT_CPU_PORT] = NULL;
+	kfree(mlxsw_sp_port);
+}
+
 static bool mlxsw_sp_port_created(struct mlxsw_sp *mlxsw_sp, u8 local_port)
 {
 	return mlxsw_sp->ports[local_port] != NULL;
@@ -3884,6 +3923,7 @@ static void mlxsw_sp_ports_remove(struct mlxsw_sp *mlxsw_sp)
 	for (i = 1; i < mlxsw_core_max_ports(mlxsw_sp->core); i++)
 		if (mlxsw_sp_port_created(mlxsw_sp, i))
 			mlxsw_sp_port_remove(mlxsw_sp, i);
+	mlxsw_sp_cpu_port_remove(mlxsw_sp);
 	kfree(mlxsw_sp->port_to_module);
 	kfree(mlxsw_sp->ports);
 }
@@ -3908,6 +3948,10 @@ static int mlxsw_sp_ports_create(struct mlxsw_sp *mlxsw_sp)
 		goto err_port_to_module_alloc;
 	}
 
+	err = mlxsw_sp_cpu_port_create(mlxsw_sp);
+	if (err)
+		goto err_cpu_port_create;
+
 	for (i = 1; i < max_ports; i++) {
 		/* Mark as invalid */
 		mlxsw_sp->port_to_module[i] = -1;
@@ -3931,6 +3975,8 @@ static int mlxsw_sp_ports_create(struct mlxsw_sp *mlxsw_sp)
 	for (i--; i >= 1; i--)
 		if (mlxsw_sp_port_created(mlxsw_sp, i))
 			mlxsw_sp_port_remove(mlxsw_sp, i);
+	mlxsw_sp_cpu_port_remove(mlxsw_sp);
+err_cpu_port_create:
 	kfree(mlxsw_sp->port_to_module);
 err_port_to_module_alloc:
 	kfree(mlxsw_sp->ports);
-- 
2.21.0


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

* [PATCH net-next v2 3/3] mlxsw: spectrum_buffers: Add the ability to query the CPU port's shared buffer
  2019-09-16  6:17 [PATCH net-next v2 0/3] mlxsw: spectrum_buffers: Add the ability to query the CPU port's shared buffer Ido Schimmel
  2019-09-16  6:17 ` [PATCH net-next v2 1/3] mlxsw: spectrum_buffers: Prevent changing CPU port's configuration Ido Schimmel
  2019-09-16  6:17 ` [PATCH net-next v2 2/3] mlxsw: spectrum: Register CPU port with devlink Ido Schimmel
@ 2019-09-16  6:17 ` Ido Schimmel
  2019-09-16  8:00   ` Jiri Pirko
  2019-09-16  8:14 ` [PATCH net-next v2 0/3] " Shalom Toledo
  3 siblings, 1 reply; 9+ messages in thread
From: Ido Schimmel @ 2019-09-16  6:17 UTC (permalink / raw)
  To: netdev; +Cc: davem, jiri, shalomt, mlxsw, Ido Schimmel

From: Shalom Toledo <shalomt@mellanox.com>

While debugging packet loss towards the CPU, it is useful to be able to
query the CPU port's shared buffer quotas and occupancy.

Since the CPU port has no ingress buffers, all the shared buffers ingress
information will be cleared.

Signed-off-by: Shalom Toledo <shalomt@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
---
 .../mellanox/mlxsw/spectrum_buffers.c         | 41 +++++++++++++++----
 1 file changed, 33 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c
index f1dbde73fa78..b9eeae37a4dc 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c
@@ -250,6 +250,10 @@ static int mlxsw_sp_sb_pm_occ_clear(struct mlxsw_sp *mlxsw_sp, u8 local_port,
 		&mlxsw_sp->sb_vals->pool_dess[pool_index];
 	char sbpm_pl[MLXSW_REG_SBPM_LEN];
 
+	if (local_port == MLXSW_PORT_CPU_PORT &&
+	    des->dir == MLXSW_REG_SBXX_DIR_INGRESS)
+		return 0;
+
 	mlxsw_reg_sbpm_pack(sbpm_pl, local_port, des->pool, des->dir,
 			    true, 0, 0);
 	return mlxsw_reg_trans_query(mlxsw_sp->core, MLXSW_REG(sbpm), sbpm_pl,
@@ -273,6 +277,10 @@ static int mlxsw_sp_sb_pm_occ_query(struct mlxsw_sp *mlxsw_sp, u8 local_port,
 	char sbpm_pl[MLXSW_REG_SBPM_LEN];
 	struct mlxsw_sp_sb_pm *pm;
 
+	if (local_port == MLXSW_PORT_CPU_PORT &&
+	    des->dir == MLXSW_REG_SBXX_DIR_INGRESS)
+		return 0;
+
 	pm = mlxsw_sp_sb_pm_get(mlxsw_sp, local_port, pool_index);
 	mlxsw_reg_sbpm_pack(sbpm_pl, local_port, des->pool, des->dir,
 			    false, 0, 0);
@@ -1197,6 +1205,11 @@ static void mlxsw_sp_sb_sr_occ_query_cb(struct mlxsw_core *mlxsw_core,
 	     local_port < mlxsw_core_max_ports(mlxsw_core); local_port++) {
 		if (!mlxsw_sp->ports[local_port])
 			continue;
+		if (local_port == MLXSW_PORT_CPU_PORT) {
+			/* Ingress quotas are not supported for the CPU port */
+			masked_count++;
+			continue;
+		}
 		for (i = 0; i < MLXSW_SP_SB_ING_TC_COUNT; i++) {
 			cm = mlxsw_sp_sb_cm_get(mlxsw_sp, local_port, i,
 						MLXSW_REG_SBXX_DIR_INGRESS);
@@ -1232,7 +1245,7 @@ int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core,
 	char *sbsr_pl;
 	u8 masked_count;
 	u8 local_port_1;
-	u8 local_port = 0;
+	u8 local_port;
 	int i;
 	int err;
 	int err2;
@@ -1241,8 +1254,8 @@ int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core,
 	if (!sbsr_pl)
 		return -ENOMEM;
 
+	local_port = MLXSW_PORT_CPU_PORT;
 next_batch:
-	local_port++;
 	local_port_1 = local_port;
 	masked_count = 0;
 	mlxsw_reg_sbsr_pack(sbsr_pl, false);
@@ -1253,7 +1266,11 @@ int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core,
 	for (; local_port < mlxsw_core_max_ports(mlxsw_core); local_port++) {
 		if (!mlxsw_sp->ports[local_port])
 			continue;
-		mlxsw_reg_sbsr_ingress_port_mask_set(sbsr_pl, local_port, 1);
+		if (local_port != MLXSW_PORT_CPU_PORT) {
+			/* Ingress quotas are not supported for the CPU port */
+			mlxsw_reg_sbsr_ingress_port_mask_set(sbsr_pl,
+							     local_port, 1);
+		}
 		mlxsw_reg_sbsr_egress_port_mask_set(sbsr_pl, local_port, 1);
 		for (i = 0; i < mlxsw_sp->sb_vals->pool_count; i++) {
 			err = mlxsw_sp_sb_pm_occ_query(mlxsw_sp, local_port, i,
@@ -1274,8 +1291,10 @@ int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core,
 				    cb_priv);
 	if (err)
 		goto out;
-	if (local_port < mlxsw_core_max_ports(mlxsw_core))
+	if (local_port < mlxsw_core_max_ports(mlxsw_core)) {
+		local_port++;
 		goto next_batch;
+	}
 
 out:
 	err2 = mlxsw_reg_trans_bulk_wait(&bulk_list);
@@ -1292,7 +1311,7 @@ int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core,
 	LIST_HEAD(bulk_list);
 	char *sbsr_pl;
 	unsigned int masked_count;
-	u8 local_port = 0;
+	u8 local_port;
 	int i;
 	int err;
 	int err2;
@@ -1301,8 +1320,8 @@ int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core,
 	if (!sbsr_pl)
 		return -ENOMEM;
 
+	local_port = MLXSW_PORT_CPU_PORT;
 next_batch:
-	local_port++;
 	masked_count = 0;
 	mlxsw_reg_sbsr_pack(sbsr_pl, true);
 	for (i = 0; i < MLXSW_SP_SB_ING_TC_COUNT; i++)
@@ -1312,7 +1331,11 @@ int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core,
 	for (; local_port < mlxsw_core_max_ports(mlxsw_core); local_port++) {
 		if (!mlxsw_sp->ports[local_port])
 			continue;
-		mlxsw_reg_sbsr_ingress_port_mask_set(sbsr_pl, local_port, 1);
+		if (local_port != MLXSW_PORT_CPU_PORT) {
+			/* Ingress quotas are not supported for the CPU port */
+			mlxsw_reg_sbsr_ingress_port_mask_set(sbsr_pl,
+							     local_port, 1);
+		}
 		mlxsw_reg_sbsr_egress_port_mask_set(sbsr_pl, local_port, 1);
 		for (i = 0; i < mlxsw_sp->sb_vals->pool_count; i++) {
 			err = mlxsw_sp_sb_pm_occ_clear(mlxsw_sp, local_port, i,
@@ -1329,8 +1352,10 @@ int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core,
 				    &bulk_list, NULL, 0);
 	if (err)
 		goto out;
-	if (local_port < mlxsw_core_max_ports(mlxsw_core))
+	if (local_port < mlxsw_core_max_ports(mlxsw_core)) {
+		local_port++;
 		goto next_batch;
+	}
 
 out:
 	err2 = mlxsw_reg_trans_bulk_wait(&bulk_list);
-- 
2.21.0


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

* Re: [PATCH net-next v2 1/3] mlxsw: spectrum_buffers: Prevent changing CPU port's configuration
  2019-09-16  6:17 ` [PATCH net-next v2 1/3] mlxsw: spectrum_buffers: Prevent changing CPU port's configuration Ido Schimmel
@ 2019-09-16  7:00   ` Jiri Pirko
  0 siblings, 0 replies; 9+ messages in thread
From: Jiri Pirko @ 2019-09-16  7:00 UTC (permalink / raw)
  To: Ido Schimmel; +Cc: netdev, davem, jiri, shalomt, mlxsw, Ido Schimmel

Mon, Sep 16, 2019 at 08:17:48AM CEST, idosch@idosch.org wrote:
>From: Shalom Toledo <shalomt@mellanox.com>
>
>Next patch is going to register the CPU port with devlink, but only so
>that the CPU port's shared buffer configuration and occupancy could be
>queried.
>
>Prevent changing CPU port's shared buffer threshold and binding
>configuration.
>
>Signed-off-by: Shalom Toledo <shalomt@mellanox.com>
>Signed-off-by: Ido Schimmel <idosch@mellanox.com>

Acked-by: Jiri Pirko <jiri@mellanox.com>

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

* Re: [PATCH net-next v2 2/3] mlxsw: spectrum: Register CPU port with devlink
  2019-09-16  6:17 ` [PATCH net-next v2 2/3] mlxsw: spectrum: Register CPU port with devlink Ido Schimmel
@ 2019-09-16  7:08   ` Jiri Pirko
  0 siblings, 0 replies; 9+ messages in thread
From: Jiri Pirko @ 2019-09-16  7:08 UTC (permalink / raw)
  To: Ido Schimmel; +Cc: netdev, davem, jiri, shalomt, mlxsw, Ido Schimmel

Mon, Sep 16, 2019 at 08:17:49AM CEST, idosch@idosch.org wrote:
>From: Shalom Toledo <shalomt@mellanox.com>
>
>Register CPU port with devlink.
>
>Signed-off-by: Shalom Toledo <shalomt@mellanox.com>
>Signed-off-by: Ido Schimmel <idosch@mellanox.com>
>---
> drivers/net/ethernet/mellanox/mlxsw/core.c    | 65 ++++++++++++++++---
> drivers/net/ethernet/mellanox/mlxsw/core.h    |  5 ++
> .../net/ethernet/mellanox/mlxsw/spectrum.c    | 46 +++++++++++++
> 3 files changed, 107 insertions(+), 9 deletions(-)
>
>diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c
>index 3fa96076e8a5..66354b05fd6c 100644
>--- a/drivers/net/ethernet/mellanox/mlxsw/core.c
>+++ b/drivers/net/ethernet/mellanox/mlxsw/core.c
>@@ -1864,11 +1864,13 @@ 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,
>-			 u32 port_number, bool split,
>-			 u32 split_port_subnumber,
>-			 const unsigned char *switch_id,
>-			 unsigned char switch_id_len)
>+static int
>+__mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port,
>+		       enum devlink_port_flavour flavour,
>+		       u32 port_number, bool split,
>+		       u32 split_port_subnumber,
>+		       const unsigned char *switch_id,
>+		       unsigned char switch_id_len)

No need to wrap after "static int":

static int __mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port,
				  enum devlink_port_flavour flavour,
				  u32 port_number, bool split,
				  u32 split_port_subnumber,
				  const unsigned char *switch_id,
				  unsigned char switch_id_len)


> {
> 	struct devlink *devlink = priv_to_devlink(mlxsw_core);
> 	struct mlxsw_core_port *mlxsw_core_port =
>@@ -1877,17 +1879,17 @@ 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,
>+	devlink_port_attrs_set(devlink_port, flavour, port_number,
>+			       split, split_port_subnumber,
> 			       switch_id, switch_id_len);
> 	err = devlink_port_register(devlink, devlink_port, local_port);
> 	if (err)
> 		memset(mlxsw_core_port, 0, sizeof(*mlxsw_core_port));
> 	return err;
> }
>-EXPORT_SYMBOL(mlxsw_core_port_init);
> 
>-void mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port)
>+static void
>+__mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port)

No need to wrap:

static void __mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port)


> {
> 	struct mlxsw_core_port *mlxsw_core_port =
> 					&mlxsw_core->ports[local_port];
>@@ -1896,8 +1898,53 @@ void mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port)
> 	devlink_port_unregister(devlink_port);
> 	memset(mlxsw_core_port, 0, sizeof(*mlxsw_core_port));
> }
>+
>+int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port,
>+			 u32 port_number, bool split,
>+			 u32 split_port_subnumber,
>+			 const unsigned char *switch_id,
>+			 unsigned char switch_id_len)
>+{
>+	return __mlxsw_core_port_init(mlxsw_core, local_port,
>+				      DEVLINK_PORT_FLAVOUR_PHYSICAL,
>+				      port_number, split, split_port_subnumber,
>+				      switch_id, switch_id_len);
>+}
>+EXPORT_SYMBOL(mlxsw_core_port_init);
>+
>+void mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port)
>+{
>+	__mlxsw_core_port_fini(mlxsw_core, local_port);
>+}
> EXPORT_SYMBOL(mlxsw_core_port_fini);
> 
>+int mlxsw_core_cpu_port_init(struct mlxsw_core *mlxsw_core,
>+			     void *port_driver_priv,
>+			     const unsigned char *switch_id,
>+			     unsigned char switch_id_len)
>+{
>+	struct mlxsw_core_port *mlxsw_core_port =
>+				&mlxsw_core->ports[MLXSW_PORT_CPU_PORT];
>+	int err;
>+
>+	err = __mlxsw_core_port_init(mlxsw_core, MLXSW_PORT_CPU_PORT,
>+				     DEVLINK_PORT_FLAVOUR_CPU,
>+				     0, false, 0,
>+				     switch_id, switch_id_len);
>+	if (err)
>+		return err;
>+
>+	mlxsw_core_port->port_driver_priv = port_driver_priv;

It is a bit confusing why this is done here comparing to physical ports,
where it is done during type set. But I didn't find better solution.


>+	return 0;
>+}
>+EXPORT_SYMBOL(mlxsw_core_cpu_port_init);
>+
>+void mlxsw_core_cpu_port_fini(struct mlxsw_core *mlxsw_core)
>+{
>+	__mlxsw_core_port_fini(mlxsw_core, MLXSW_PORT_CPU_PORT);
>+}
>+EXPORT_SYMBOL(mlxsw_core_cpu_port_fini);
>+
> void mlxsw_core_port_eth_set(struct mlxsw_core *mlxsw_core, u8 local_port,
> 			     void *port_driver_priv, struct net_device *dev)
> {
>diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.h b/drivers/net/ethernet/mellanox/mlxsw/core.h
>index b65a17d49e43..5d7d2ab6d155 100644
>--- a/drivers/net/ethernet/mellanox/mlxsw/core.h
>+++ b/drivers/net/ethernet/mellanox/mlxsw/core.h
>@@ -177,6 +177,11 @@ int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port,
> 			 const unsigned char *switch_id,
> 			 unsigned char switch_id_len);
> void mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port);
>+int mlxsw_core_cpu_port_init(struct mlxsw_core *mlxsw_core,
>+			     void *port_driver_priv,
>+			     const unsigned char *switch_id,
>+			     unsigned char switch_id_len);
>+void mlxsw_core_cpu_port_fini(struct mlxsw_core *mlxsw_core);
> void mlxsw_core_port_eth_set(struct mlxsw_core *mlxsw_core, u8 local_port,
> 			     void *port_driver_priv, struct net_device *dev);
> void mlxsw_core_port_ib_set(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 91e4792bb7e7..dd234cf7b39d 100644
>--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
>+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
>@@ -3872,6 +3872,45 @@ static void mlxsw_sp_port_remove(struct mlxsw_sp *mlxsw_sp, u8 local_port)
> 	mlxsw_core_port_fini(mlxsw_sp->core, local_port);
> }
> 
>+static int mlxsw_sp_cpu_port_create(struct mlxsw_sp *mlxsw_sp)
>+{
>+	struct mlxsw_sp_port *mlxsw_sp_port;
>+	int err;
>+
>+	mlxsw_sp_port = kzalloc(sizeof(*mlxsw_sp_port), GFP_KERNEL);
>+	if (!mlxsw_sp_port)
>+		return -ENOMEM;
>+
>+	mlxsw_sp_port->mlxsw_sp = mlxsw_sp;
>+	mlxsw_sp_port->local_port = MLXSW_PORT_CPU_PORT;
>+
>+	err = mlxsw_core_cpu_port_init(mlxsw_sp->core,
>+				       mlxsw_sp_port,
>+				       mlxsw_sp->base_mac,
>+				       sizeof(mlxsw_sp->base_mac));
>+	if (err) {
>+		dev_err(mlxsw_sp->bus_info->dev, "Failed to initialize core CPU port\n");
>+		goto err_core_cpu_port_init;
>+	}
>+
>+	mlxsw_sp->ports[MLXSW_PORT_CPU_PORT] = mlxsw_sp_port;
>+	return 0;
>+
>+err_core_cpu_port_init:
>+	kfree(mlxsw_sp_port);
>+	return err;
>+}
>+
>+static void mlxsw_sp_cpu_port_remove(struct mlxsw_sp *mlxsw_sp)
>+{
>+	struct mlxsw_sp_port *mlxsw_sp_port =
>+				mlxsw_sp->ports[MLXSW_PORT_CPU_PORT];
>+
>+	mlxsw_core_cpu_port_fini(mlxsw_sp->core);
>+	mlxsw_sp->ports[MLXSW_PORT_CPU_PORT] = NULL;
>+	kfree(mlxsw_sp_port);
>+}
>+
> static bool mlxsw_sp_port_created(struct mlxsw_sp *mlxsw_sp, u8 local_port)
> {
> 	return mlxsw_sp->ports[local_port] != NULL;
>@@ -3884,6 +3923,7 @@ static void mlxsw_sp_ports_remove(struct mlxsw_sp *mlxsw_sp)
> 	for (i = 1; i < mlxsw_core_max_ports(mlxsw_sp->core); i++)
> 		if (mlxsw_sp_port_created(mlxsw_sp, i))
> 			mlxsw_sp_port_remove(mlxsw_sp, i);
>+	mlxsw_sp_cpu_port_remove(mlxsw_sp);
> 	kfree(mlxsw_sp->port_to_module);
> 	kfree(mlxsw_sp->ports);
> }
>@@ -3908,6 +3948,10 @@ static int mlxsw_sp_ports_create(struct mlxsw_sp *mlxsw_sp)
> 		goto err_port_to_module_alloc;
> 	}
> 
>+	err = mlxsw_sp_cpu_port_create(mlxsw_sp);
>+	if (err)
>+		goto err_cpu_port_create;
>+
> 	for (i = 1; i < max_ports; i++) {
> 		/* Mark as invalid */
> 		mlxsw_sp->port_to_module[i] = -1;
>@@ -3931,6 +3975,8 @@ static int mlxsw_sp_ports_create(struct mlxsw_sp *mlxsw_sp)
> 	for (i--; i >= 1; i--)
> 		if (mlxsw_sp_port_created(mlxsw_sp, i))
> 			mlxsw_sp_port_remove(mlxsw_sp, i);
>+	mlxsw_sp_cpu_port_remove(mlxsw_sp);
>+err_cpu_port_create:
> 	kfree(mlxsw_sp->port_to_module);
> err_port_to_module_alloc:
> 	kfree(mlxsw_sp->ports);
>-- 
>2.21.0
>

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

* Re: [PATCH net-next v2 3/3] mlxsw: spectrum_buffers: Add the ability to query the CPU port's shared buffer
  2019-09-16  6:17 ` [PATCH net-next v2 3/3] mlxsw: spectrum_buffers: Add the ability to query the CPU port's shared buffer Ido Schimmel
@ 2019-09-16  8:00   ` Jiri Pirko
  0 siblings, 0 replies; 9+ messages in thread
From: Jiri Pirko @ 2019-09-16  8:00 UTC (permalink / raw)
  To: Ido Schimmel; +Cc: netdev, davem, jiri, shalomt, mlxsw, Ido Schimmel

Mon, Sep 16, 2019 at 08:17:50AM CEST, idosch@idosch.org wrote:
>From: Shalom Toledo <shalomt@mellanox.com>
>
>While debugging packet loss towards the CPU, it is useful to be able to
>query the CPU port's shared buffer quotas and occupancy.
>
>Since the CPU port has no ingress buffers, all the shared buffers ingress
>information will be cleared.
>
>Signed-off-by: Shalom Toledo <shalomt@mellanox.com>
>Signed-off-by: Ido Schimmel <idosch@mellanox.com>

Acked-by: Jiri Pirko <jiri@mellanox.com>

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

* Re: [PATCH net-next v2 0/3] mlxsw: spectrum_buffers: Add the ability to query the CPU port's shared buffer
  2019-09-16  6:17 [PATCH net-next v2 0/3] mlxsw: spectrum_buffers: Add the ability to query the CPU port's shared buffer Ido Schimmel
                   ` (2 preceding siblings ...)
  2019-09-16  6:17 ` [PATCH net-next v2 3/3] mlxsw: spectrum_buffers: Add the ability to query the CPU port's shared buffer Ido Schimmel
@ 2019-09-16  8:14 ` Shalom Toledo
  2019-09-16 13:59   ` David Miller
  3 siblings, 1 reply; 9+ messages in thread
From: Shalom Toledo @ 2019-09-16  8:14 UTC (permalink / raw)
  To: Ido Schimmel, netdev, davem; +Cc: Jiri Pirko, mlxsw, Ido Schimmel

Hi David,

I have v3 with all the fixes Jiri commented. Can I send it? Or should I wait
until net-next will be open again?

Thanks,
Shalom.

On 16/09/2019 9:17, Ido Schimmel wrote:
> From: Ido Schimmel <idosch@mellanox.com>
> 
> Shalom says:
> 
> While debugging packet loss towards the CPU, it is useful to be able to
> query the CPU port's shared buffer quotas and occupancy.
> 
> Patch #1 prevents changing the CPU port's threshold and binding.
> 
> Patch #2 registers the CPU port with devlink.
> 
> Patch #3 adds the ability to query the CPU port's shared buffer quotas and
> occupancy.
> 
> v2:
> 
> Patch #1:
> * s/0/MLXSW_PORT_CPU_PORT/
> * Assign "mlxsw_sp->ports[MLXSW_PORT_CPU_PORT" at the end of
>   mlxsw_sp_cpu_port_create() to avoid NULL assignment on error path
> * Add common functions for mlxsw_core_port_init/fini()
> 
> Patch #2:
> * Move "changing CPU port's threshold and binding" check to a separate
>   patch
> 
> Shalom Toledo (3):
>   mlxsw: spectrum_buffers: Prevent changing CPU port's configuration
>   mlxsw: spectrum: Register CPU port with devlink
>   mlxsw: spectrum_buffers: Add the ability to query the CPU port's
>     shared buffer
> 
>  drivers/net/ethernet/mellanox/mlxsw/core.c    | 65 ++++++++++++++++---
>  drivers/net/ethernet/mellanox/mlxsw/core.h    |  5 ++
>  .../net/ethernet/mellanox/mlxsw/spectrum.c    | 46 +++++++++++++
>  .../mellanox/mlxsw/spectrum_buffers.c         | 51 ++++++++++++---
>  4 files changed, 150 insertions(+), 17 deletions(-)
> 


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

* Re: [PATCH net-next v2 0/3] mlxsw: spectrum_buffers: Add the ability to query the CPU port's shared buffer
  2019-09-16  8:14 ` [PATCH net-next v2 0/3] " Shalom Toledo
@ 2019-09-16 13:59   ` David Miller
  0 siblings, 0 replies; 9+ messages in thread
From: David Miller @ 2019-09-16 13:59 UTC (permalink / raw)
  To: shalomt; +Cc: idosch, netdev, jiri, mlxsw, idosch

From: Shalom Toledo <shalomt@mellanox.com>
Date: Mon, 16 Sep 2019 08:14:47 +0000

> I have v3 with all the fixes Jiri commented. Can I send it? Or should I wait
> until net-next will be open again?

Just send it, thanks for asking.

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

end of thread, other threads:[~2019-09-16 14:00 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-09-16  6:17 [PATCH net-next v2 0/3] mlxsw: spectrum_buffers: Add the ability to query the CPU port's shared buffer Ido Schimmel
2019-09-16  6:17 ` [PATCH net-next v2 1/3] mlxsw: spectrum_buffers: Prevent changing CPU port's configuration Ido Schimmel
2019-09-16  7:00   ` Jiri Pirko
2019-09-16  6:17 ` [PATCH net-next v2 2/3] mlxsw: spectrum: Register CPU port with devlink Ido Schimmel
2019-09-16  7:08   ` Jiri Pirko
2019-09-16  6:17 ` [PATCH net-next v2 3/3] mlxsw: spectrum_buffers: Add the ability to query the CPU port's shared buffer Ido Schimmel
2019-09-16  8:00   ` Jiri Pirko
2019-09-16  8:14 ` [PATCH net-next v2 0/3] " Shalom Toledo
2019-09-16 13:59   ` David Miller

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.