All of lore.kernel.org
 help / color / mirror / Atom feed
* [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11
@ 2018-12-11 23:23 Saeed Mahameed
  2018-12-11 23:23 ` [net-next 01/14] net/mlx5: Consider encapsulation properties when comparing destinations Saeed Mahameed
                   ` (14 more replies)
  0 siblings, 15 replies; 22+ messages in thread
From: Saeed Mahameed @ 2018-12-11 23:23 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Saeed Mahameed

Hi Dave,

This series includes three updates to mlx5e driver, 
- Eswitch remote mirroring support.
- CQE padding for ethernet CQs on PPC.
- FW monitor counters support.

For more information please see tag log bleow.

Please pull and let me know if there's any problem.

Thanks,
Saeed.

---

The following changes since commit 0bd72117fba2dd51a65eaa7b480adc0eea9a4409:

  bpf: fix up uapi helper description and sync bpf header with tools (2018-12-11 11:06:43 -0800)

are available in the Git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux.git tags/mlx5e-updates-2018-12-11

for you to fetch changes up to 5c7e8bbb025726f9cb9b2bc050509a94262426f8:

  net/mlx5e: Use monitor counters for update stats (2018-12-11 14:52:20 -0800)

----------------------------------------------------------------
mlx5e-updates-2018-12-11

>From Eli Britstein,
Patches 1-10 adds remote mirroring support.
Patches 1-4 refactor encap related code as pre-steps for using per
destination encapsulation properties.
Patches 5-7 use extended destination feature for single/multi
destination scenarios that have a single encap destination.
Patches 8-10 enable multiple encap destinations for a TC flow.

From, Daniel Jurgens,
Patch 11, Use CQE padding for Ethernet CQs, PPC showed up to a 24%
improvement in small packet throughput

>From Eyal Davidovich,
patches 12-14, FW monitor counter support
FW monitor counters feature came to solve the delayed reporting of
FW stats in the atomic get_stats64 ndo, since we can't access the
FW at that stage, this feature will enable immediate FW stats updates
in the driver via fw events on specific stats updates.

Patch 12, cleanup to avoid querying a FW counter when it is not
supported
Patch 13, Monitor counters FW commands support
Patch 14, Use monitor counters in ethernet netdevice to update FW
stats reported in the atomic get_stats64 ndo.

----------------------------------------------------------------
Daniel Jurgens (1):
      net/mlx5e: Use CQE padding for Ethernet CQs

Eli Britstein (10):
      net/mlx5: Consider encapsulation properties when comparing destinations
      net/mlx5: E-Switch, Rename esw attr mirror count field
      net/mlx5e: Refactor eswitch flow attr for destination specific properties
      net/mlx5e: Move flow attr reformat action bit to per dest flags
      net/mlx5e: Annul encap action ordering requirement
      net/mlx5e: Replace the split logic with extended destination
      net/mlx5e: Support header rewrite actions with remote port mirroring
      net/mlx5e: Change parse attr struct to accommodate multiple tunnel infos
      net/mlx5e: Allow association of a flow to multiple encaps
      net/mlx5e: Support multiple encapsulations for a TC flow

Eyal Davidovich (3):
      net/mlx5e: Avoid query PPCNT register if not supported by the device
      net/mlx5e: Monitor counters commands support
      net/mlx5e: Use monitor counters for update stats

 drivers/net/ethernet/mellanox/mlx5/core/Makefile   |   2 +-
 drivers/net/ethernet/mellanox/mlx5/core/en.h       |   3 +
 .../ethernet/mellanox/mlx5/core/en/monitor_stats.c | 169 +++++++++++++++++++
 .../ethernet/mellanox/mlx5/core/en/monitor_stats.h |  12 ++
 drivers/net/ethernet/mellanox/mlx5/core/en_main.c  |  16 +-
 drivers/net/ethernet/mellanox/mlx5/core/en_stats.c |  12 ++
 drivers/net/ethernet/mellanox/mlx5/core/en_tc.c    | 181 ++++++++++++++-------
 drivers/net/ethernet/mellanox/mlx5/core/eswitch.h  |  16 +-
 .../ethernet/mellanox/mlx5/core/eswitch_offloads.c |  44 +++--
 drivers/net/ethernet/mellanox/mlx5/core/fs_core.c  |   5 +-
 drivers/net/ethernet/mellanox/mlx5/core/wq.c       |   3 +-
 drivers/net/ethernet/mellanox/mlx5/core/wq.h       |   7 +-
 include/linux/mlx5/cq.h                            |  10 +-
 include/linux/mlx5/mlx5_ifc.h                      |   4 +-
 14 files changed, 393 insertions(+), 91 deletions(-)
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/en/monitor_stats.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/en/monitor_stats.h

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

* [net-next 01/14] net/mlx5: Consider encapsulation properties when comparing destinations
  2018-12-11 23:23 [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11 Saeed Mahameed
@ 2018-12-11 23:23 ` Saeed Mahameed
  2018-12-11 23:23 ` [net-next 02/14] net/mlx5: E-Switch, Rename esw attr mirror count field Saeed Mahameed
                   ` (13 subsequent siblings)
  14 siblings, 0 replies; 22+ messages in thread
From: Saeed Mahameed @ 2018-12-11 23:23 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Eli Britstein, Saeed Mahameed

From: Eli Britstein <elibr@mellanox.com>

Currently the driver identifies identical vport destinations by
comparing the vport ID. The FW extended destination feature enables the
driver to forward the packet to the same vport with multiple
encapsulation properties.

Change the vport destination comparison logic to compare
the encapsulation properties in addition to the vport ID.

Signed-off-by: Eli Britstein <elibr@mellanox.com>
Acked-by: Or Gerlitz <ogerlitz@mellanox.com>
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
index 9d73eb955f75..f21277e636a3 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
@@ -1373,7 +1373,10 @@ static bool mlx5_flow_dests_cmp(struct mlx5_flow_destination *d1,
 {
 	if (d1->type == d2->type) {
 		if ((d1->type == MLX5_FLOW_DESTINATION_TYPE_VPORT &&
-		     d1->vport.num == d2->vport.num) ||
+		     d1->vport.num == d2->vport.num &&
+		     d1->vport.flags == d2->vport.flags &&
+		     ((d1->vport.flags & MLX5_FLOW_DEST_VPORT_REFORMAT_ID) ?
+		      (d1->vport.reformat_id == d2->vport.reformat_id) : true)) ||
 		    (d1->type == MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE &&
 		     d1->ft == d2->ft) ||
 		    (d1->type == MLX5_FLOW_DESTINATION_TYPE_TIR &&
-- 
2.19.2

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

* [net-next 02/14] net/mlx5: E-Switch, Rename esw attr mirror count field
  2018-12-11 23:23 [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11 Saeed Mahameed
  2018-12-11 23:23 ` [net-next 01/14] net/mlx5: Consider encapsulation properties when comparing destinations Saeed Mahameed
@ 2018-12-11 23:23 ` Saeed Mahameed
  2018-12-11 23:23 ` [net-next 03/14] net/mlx5e: Refactor eswitch flow attr for destination specific properties Saeed Mahameed
                   ` (12 subsequent siblings)
  14 siblings, 0 replies; 22+ messages in thread
From: Saeed Mahameed @ 2018-12-11 23:23 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Eli Britstein, Saeed Mahameed

From: Eli Britstein <elibr@mellanox.com>

The mirror count esw attributes field is used to determine if splitting
the rule to two FTEs is required while programming e-switch mirroring.
Rename it to split count, making it clearer with no functional change.

Signed-off-by: Eli Britstein <elibr@mellanox.com>
Reviewed-by: Or Gerlitz <ogerlitz@mellanox.com>
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/en_tc.c    | 14 +++++++-------
 drivers/net/ethernet/mellanox/mlx5/core/eswitch.h  |  2 +-
 .../ethernet/mellanox/mlx5/core/eswitch_offloads.c | 14 +++++++-------
 3 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
index abc200947e84..342f807543a0 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
@@ -838,7 +838,7 @@ mlx5e_tc_offload_fdb_rules(struct mlx5_eswitch *esw,
 	if (IS_ERR(rule))
 		return rule;
 
-	if (attr->mirror_count) {
+	if (attr->split_count) {
 		flow->rule[1] = mlx5_eswitch_add_fwd_rule(esw, spec, attr);
 		if (IS_ERR(flow->rule[1])) {
 			mlx5_eswitch_del_offloaded_rule(esw, rule, attr);
@@ -857,7 +857,7 @@ mlx5e_tc_unoffload_fdb_rules(struct mlx5_eswitch *esw,
 {
 	flow->flags &= ~MLX5E_TC_FLOW_OFFLOADED;
 
-	if (attr->mirror_count)
+	if (attr->split_count)
 		mlx5_eswitch_del_fwd_rule(esw, flow->rule[1], attr);
 
 	mlx5_eswitch_del_offloaded_rule(esw, flow->rule[0], attr);
@@ -873,7 +873,7 @@ mlx5e_tc_offload_to_slow_path(struct mlx5_eswitch *esw,
 
 	memcpy(slow_attr, flow->esw_attr, sizeof(*slow_attr));
 	slow_attr->action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST,
-	slow_attr->mirror_count = 0,
+	slow_attr->split_count = 0,
 	slow_attr->dest_chain = FDB_SLOW_PATH_CHAIN,
 
 	rule = mlx5e_tc_offload_fdb_rules(esw, flow, spec, slow_attr);
@@ -2427,7 +2427,7 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
 				return err;
 
 			action |= MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;
-			attr->mirror_count = attr->out_count;
+			attr->split_count = attr->out_count;
 			continue;
 		}
 
@@ -2501,7 +2501,7 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
 				encap = true;
 			else
 				return -EOPNOTSUPP;
-			attr->mirror_count = attr->out_count;
+			attr->split_count = attr->out_count;
 			continue;
 		}
 
@@ -2511,7 +2511,7 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
 			if (err)
 				return err;
 
-			attr->mirror_count = attr->out_count;
+			attr->split_count = attr->out_count;
 			continue;
 		}
 
@@ -2546,7 +2546,7 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
 	if (!actions_match_supported(priv, exts, parse_attr, flow, extack))
 		return -EOPNOTSUPP;
 
-	if (attr->mirror_count > 0 && !mlx5_esw_has_fwd_fdb(priv->mdev)) {
+	if (attr->split_count > 0 && !mlx5_esw_has_fwd_fdb(priv->mdev)) {
 		NL_SET_ERR_MSG_MOD(extack,
 				   "current firmware doesn't support split rule for port mirroring");
 		netdev_warn_once(priv->netdev, "current firmware doesn't support split rule for port mirroring\n");
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
index 480ffa294867..c28ff6487dfd 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
@@ -287,7 +287,7 @@ struct mlx5_esw_flow_attr {
 	struct mlx5_core_dev	*out_mdev[MLX5_MAX_FLOW_FWD_VPORTS];
 	struct mlx5_core_dev	*in_mdev;
 
-	int mirror_count;
+	int split_count;
 	int out_count;
 
 	int	action;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
index 4d7b65df32ef..63ac9d3d1690 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
@@ -81,7 +81,7 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
 {
 	struct mlx5_flow_destination dest[MLX5_MAX_FLOW_FWD_VPORTS + 1] = {};
 	struct mlx5_flow_act flow_act = { .flags = FLOW_ACT_NO_APPEND, };
-	bool mirror = !!(attr->mirror_count);
+	bool split = !!(attr->split_count);
 	struct mlx5_flow_handle *rule;
 	struct mlx5_flow_table *fdb;
 	int j, i = 0;
@@ -120,7 +120,7 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
 			dest[i].ft = ft;
 			i++;
 		} else {
-			for (j = attr->mirror_count; j < attr->out_count; j++) {
+			for (j = attr->split_count; j < attr->out_count; j++) {
 				dest[i].type = MLX5_FLOW_DESTINATION_TYPE_VPORT;
 				dest[i].vport.num = attr->out_rep[j]->vport;
 				dest[i].vport.vhca_id =
@@ -167,7 +167,7 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
 	if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT)
 		flow_act.reformat_id = attr->encap_id;
 
-	fdb = esw_get_prio_table(esw, attr->chain, attr->prio, !!mirror);
+	fdb = esw_get_prio_table(esw, attr->chain, attr->prio, !!split);
 	if (IS_ERR(fdb)) {
 		rule = ERR_CAST(fdb);
 		goto err_esw_get;
@@ -182,7 +182,7 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
 	return rule;
 
 err_add_rule:
-	esw_put_prio_table(esw, attr->chain, attr->prio, !!mirror);
+	esw_put_prio_table(esw, attr->chain, attr->prio, !!split);
 err_esw_get:
 	if (attr->dest_chain)
 		esw_put_prio_table(esw, attr->dest_chain, 1, 0);
@@ -216,7 +216,7 @@ mlx5_eswitch_add_fwd_rule(struct mlx5_eswitch *esw,
 	}
 
 	flow_act.action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
-	for (i = 0; i < attr->mirror_count; i++) {
+	for (i = 0; i < attr->split_count; i++) {
 		dest[i].type = MLX5_FLOW_DESTINATION_TYPE_VPORT;
 		dest[i].vport.num = attr->out_rep[i]->vport;
 		dest[i].vport.vhca_id =
@@ -270,7 +270,7 @@ __mlx5_eswitch_del_rule(struct mlx5_eswitch *esw,
 			struct mlx5_esw_flow_attr *attr,
 			bool fwd_rule)
 {
-	bool mirror = (attr->mirror_count > 0);
+	bool split = (attr->split_count > 0);
 
 	mlx5_del_flow_rules(rule);
 	esw->offloads.num_flows--;
@@ -279,7 +279,7 @@ __mlx5_eswitch_del_rule(struct mlx5_eswitch *esw,
 		esw_put_prio_table(esw, attr->chain, attr->prio, 1);
 		esw_put_prio_table(esw, attr->chain, attr->prio, 0);
 	} else {
-		esw_put_prio_table(esw, attr->chain, attr->prio, !!mirror);
+		esw_put_prio_table(esw, attr->chain, attr->prio, !!split);
 		if (attr->dest_chain)
 			esw_put_prio_table(esw, attr->dest_chain, 1, 0);
 	}
-- 
2.19.2

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

* [net-next 03/14] net/mlx5e: Refactor eswitch flow attr for destination specific properties
  2018-12-11 23:23 [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11 Saeed Mahameed
  2018-12-11 23:23 ` [net-next 01/14] net/mlx5: Consider encapsulation properties when comparing destinations Saeed Mahameed
  2018-12-11 23:23 ` [net-next 02/14] net/mlx5: E-Switch, Rename esw attr mirror count field Saeed Mahameed
@ 2018-12-11 23:23 ` Saeed Mahameed
  2018-12-12  0:21   ` Cong Wang
  2018-12-11 23:23 ` [net-next 04/14] net/mlx5e: Move flow attr reformat action bit to per dest flags Saeed Mahameed
                   ` (11 subsequent siblings)
  14 siblings, 1 reply; 22+ messages in thread
From: Saeed Mahameed @ 2018-12-11 23:23 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Eli Britstein, Saeed Mahameed

From: Eli Britstein <elibr@mellanox.com>

Currently the eswitch flow attr structure stores each destination
specific property in its own specific array.
Group them in an array of destination structures as a pre-step towards
adding additional destination specific field properties.

Signed-off-by: Eli Britstein <elibr@mellanox.com>
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/en_tc.c  | 13 ++++++++-----
 .../net/ethernet/mellanox/mlx5/core/eswitch.h    |  6 ++++--
 .../mellanox/mlx5/core/eswitch_offloads.c        | 16 ++++++++--------
 3 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
index 342f807543a0..b24b758f467d 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
@@ -939,8 +939,8 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
 		}
 		out_priv = netdev_priv(encap_dev);
 		rpriv = out_priv->ppriv;
-		attr->out_rep[attr->out_count] = rpriv->rep;
-		attr->out_mdev[attr->out_count++] = out_priv->mdev;
+		attr->dests[attr->out_count].rep = rpriv->rep;
+		attr->dests[attr->out_count++].mdev = out_priv->mdev;
 	}
 
 	err = mlx5_eswitch_add_vlan_action(esw, attr);
@@ -2468,8 +2468,9 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
 					  MLX5_FLOW_CONTEXT_ACTION_COUNT;
 				out_priv = netdev_priv(out_dev);
 				rpriv = out_priv->ppriv;
-				attr->out_rep[attr->out_count] = rpriv->rep;
-				attr->out_mdev[attr->out_count++] = out_priv->mdev;
+				attr->dests[attr->out_count].rep = rpriv->rep;
+				attr->dests[attr->out_count].mdev = out_priv->mdev;
+				attr->out_count++;
 			} else if (encap) {
 				parse_attr->mirred_ifindex = out_dev->ifindex;
 				parse_attr->tun_info = *info;
@@ -2477,7 +2478,9 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
 				action |= MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT |
 					  MLX5_FLOW_CONTEXT_ACTION_FWD_DEST |
 					  MLX5_FLOW_CONTEXT_ACTION_COUNT;
-				/* attr->out_rep is resolved when we handle encap */
+				/* attr->dests[].rep is resolved when we
+				 * handle encap
+				 */
 			} else if (parse_attr->filter_dev != priv->netdev) {
 				/* All mlx5 devices are called to configure
 				 * high level device filters. Therefore, the
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
index c28ff6487dfd..5468975a1bdb 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
@@ -283,8 +283,6 @@ enum mlx5_flow_match_level {
 
 struct mlx5_esw_flow_attr {
 	struct mlx5_eswitch_rep *in_rep;
-	struct mlx5_eswitch_rep *out_rep[MLX5_MAX_FLOW_FWD_VPORTS];
-	struct mlx5_core_dev	*out_mdev[MLX5_MAX_FLOW_FWD_VPORTS];
 	struct mlx5_core_dev	*in_mdev;
 
 	int split_count;
@@ -297,6 +295,10 @@ struct mlx5_esw_flow_attr {
 	u8	total_vlan;
 	bool	vlan_handled;
 	u32	encap_id;
+	struct {
+		struct mlx5_eswitch_rep *rep;
+		struct mlx5_core_dev *mdev;
+	} dests[MLX5_MAX_FLOW_FWD_VPORTS];
 	u32	mod_hdr_id;
 	u8	match_level;
 	struct mlx5_fc *counter;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
index 63ac9d3d1690..7cbe602129b7 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
@@ -122,9 +122,9 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
 		} else {
 			for (j = attr->split_count; j < attr->out_count; j++) {
 				dest[i].type = MLX5_FLOW_DESTINATION_TYPE_VPORT;
-				dest[i].vport.num = attr->out_rep[j]->vport;
+				dest[i].vport.num = attr->dests[j].rep->vport;
 				dest[i].vport.vhca_id =
-					MLX5_CAP_GEN(attr->out_mdev[j], vhca_id);
+					MLX5_CAP_GEN(attr->dests[j].mdev, vhca_id);
 				if (MLX5_CAP_ESW(esw->dev, merged_eswitch))
 					dest[i].vport.flags |=
 						MLX5_FLOW_DEST_VPORT_VHCA_ID;
@@ -218,9 +218,9 @@ mlx5_eswitch_add_fwd_rule(struct mlx5_eswitch *esw,
 	flow_act.action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
 	for (i = 0; i < attr->split_count; i++) {
 		dest[i].type = MLX5_FLOW_DESTINATION_TYPE_VPORT;
-		dest[i].vport.num = attr->out_rep[i]->vport;
+		dest[i].vport.num = attr->dests[i].rep->vport;
 		dest[i].vport.vhca_id =
-			MLX5_CAP_GEN(attr->out_mdev[i], vhca_id);
+			MLX5_CAP_GEN(attr->dests[i].mdev, vhca_id);
 		if (MLX5_CAP_ESW(esw->dev, merged_eswitch))
 			dest[i].vport.flags |= MLX5_FLOW_DEST_VPORT_VHCA_ID;
 	}
@@ -327,7 +327,7 @@ esw_vlan_action_get_vport(struct mlx5_esw_flow_attr *attr, bool push, bool pop)
 	struct mlx5_eswitch_rep *in_rep, *out_rep, *vport = NULL;
 
 	in_rep  = attr->in_rep;
-	out_rep = attr->out_rep[0];
+	out_rep = attr->dests[0].rep;
 
 	if (push)
 		vport = in_rep;
@@ -348,7 +348,7 @@ static int esw_add_vlan_action_check(struct mlx5_esw_flow_attr *attr,
 		goto out_notsupp;
 
 	in_rep  = attr->in_rep;
-	out_rep = attr->out_rep[0];
+	out_rep = attr->dests[0].rep;
 
 	if (push && in_rep->vport == FDB_UPLINK_VPORT)
 		goto out_notsupp;
@@ -400,7 +400,7 @@ int mlx5_eswitch_add_vlan_action(struct mlx5_eswitch *esw,
 
 	if (!push && !pop && fwd) {
 		/* tracks VF --> wire rules without vlan push action */
-		if (attr->out_rep[0]->vport == FDB_UPLINK_VPORT) {
+		if (attr->dests[0].rep->vport == FDB_UPLINK_VPORT) {
 			vport->vlan_refcount++;
 			attr->vlan_handled = true;
 		}
@@ -460,7 +460,7 @@ int mlx5_eswitch_del_vlan_action(struct mlx5_eswitch *esw,
 
 	if (!push && !pop && fwd) {
 		/* tracks VF --> wire rules without vlan push action */
-		if (attr->out_rep[0]->vport == FDB_UPLINK_VPORT)
+		if (attr->dests[0].rep->vport == FDB_UPLINK_VPORT)
 			vport->vlan_refcount--;
 
 		return 0;
-- 
2.19.2

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

* [net-next 04/14] net/mlx5e: Move flow attr reformat action bit to per dest flags
  2018-12-11 23:23 [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11 Saeed Mahameed
                   ` (2 preceding siblings ...)
  2018-12-11 23:23 ` [net-next 03/14] net/mlx5e: Refactor eswitch flow attr for destination specific properties Saeed Mahameed
@ 2018-12-11 23:23 ` Saeed Mahameed
  2018-12-11 23:24 ` [net-next 05/14] net/mlx5e: Annul encap action ordering requirement Saeed Mahameed
                   ` (10 subsequent siblings)
  14 siblings, 0 replies; 22+ messages in thread
From: Saeed Mahameed @ 2018-12-11 23:23 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Eli Britstein, Saeed Mahameed

From: Eli Britstein <elibr@mellanox.com>

Flow attr reformat action bit is moved from the global action bits to a
per destination flags field, as a pre-step for adding additional flags
to support encapsulation properties per destination, with no
functionality change.

Signed-off-by: Eli Britstein <elibr@mellanox.com>
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 .../net/ethernet/mellanox/mlx5/core/en_tc.c   | 37 +++++++++++--------
 .../net/ethernet/mellanox/mlx5/core/eswitch.h |  5 +++
 .../mellanox/mlx5/core/eswitch_offloads.c     |  7 ++--
 3 files changed, 30 insertions(+), 19 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
index b24b758f467d..e48fbb7d9735 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
@@ -908,6 +908,7 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
 	struct mlx5e_rep_priv *rpriv;
 	struct mlx5e_priv *out_priv;
 	int err = 0, encap_err = 0;
+	int out_index;
 
 	/* if prios are not supported, keep the old behaviour of using same prio
 	 * for all offloaded rules.
@@ -927,7 +928,10 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
 		goto err_max_prio_chain;
 	}
 
-	if (attr->action & MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT) {
+	for (out_index = 0; out_index < MLX5_MAX_FLOW_FWD_VPORTS; out_index++) {
+		if (!(attr->dests[out_index].flags & MLX5_ESW_DEST_ENCAP))
+			continue;
+
 		out_dev = __dev_get_by_index(dev_net(priv->netdev),
 					     attr->parse_attr->mirred_ifindex);
 		encap_err = mlx5e_attach_encap(priv, &parse_attr->tun_info,
@@ -991,8 +995,11 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
 err_mod_hdr:
 	mlx5_eswitch_del_vlan_action(esw, attr);
 err_add_vlan:
-	if (attr->action & MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT)
-		mlx5e_detach_encap(priv, flow);
+	for (out_index = 0; out_index < MLX5_MAX_FLOW_FWD_VPORTS; out_index++)
+		if (attr->dests[out_index].flags & MLX5_ESW_DEST_ENCAP) {
+			mlx5e_detach_encap(priv, flow);
+			break;
+		}
 err_attach_encap:
 err_max_prio_chain:
 	return err;
@@ -1004,6 +1011,7 @@ static void mlx5e_tc_del_fdb_flow(struct mlx5e_priv *priv,
 	struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
 	struct mlx5_esw_flow_attr *attr = flow->esw_attr;
 	struct mlx5_esw_flow_attr slow_attr;
+	int out_index;
 
 	if (flow->flags & MLX5E_TC_FLOW_OFFLOADED) {
 		if (flow->flags & MLX5E_TC_FLOW_SLOW)
@@ -1014,10 +1022,12 @@ static void mlx5e_tc_del_fdb_flow(struct mlx5e_priv *priv,
 
 	mlx5_eswitch_del_vlan_action(esw, attr);
 
-	if (attr->action & MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT) {
-		mlx5e_detach_encap(priv, flow);
-		kvfree(attr->parse_attr);
-	}
+	for (out_index = 0; out_index < MLX5_MAX_FLOW_FWD_VPORTS; out_index++)
+		if (attr->dests[out_index].flags & MLX5_ESW_DEST_ENCAP) {
+			mlx5e_detach_encap(priv, flow);
+			break;
+		}
+	kvfree(attr->parse_attr);
 
 	if (attr->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR)
 		mlx5e_detach_mod_hdr(priv, flow);
@@ -2461,11 +2471,11 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
 				return -EOPNOTSUPP;
 			}
 
+			action |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST |
+				  MLX5_FLOW_CONTEXT_ACTION_COUNT;
 			if (switchdev_port_same_parent_id(priv->netdev,
 							  out_dev) ||
 			    is_merged_eswitch_dev(priv, out_dev)) {
-				action |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST |
-					  MLX5_FLOW_CONTEXT_ACTION_COUNT;
 				out_priv = netdev_priv(out_dev);
 				rpriv = out_priv->ppriv;
 				attr->dests[attr->out_count].rep = rpriv->rep;
@@ -2475,9 +2485,8 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
 				parse_attr->mirred_ifindex = out_dev->ifindex;
 				parse_attr->tun_info = *info;
 				attr->parse_attr = parse_attr;
-				action |= MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT |
-					  MLX5_FLOW_CONTEXT_ACTION_FWD_DEST |
-					  MLX5_FLOW_CONTEXT_ACTION_COUNT;
+				attr->dests[attr->out_count].flags |=
+					MLX5_ESW_DEST_ENCAP;
 				/* attr->dests[].rep is resolved when we
 				 * handle encap
 				 */
@@ -2657,10 +2666,6 @@ mlx5e_add_fdb_flow(struct mlx5e_priv *priv,
 	if (err)
 		goto err_free;
 
-	if (!(flow->esw_attr->action &
-	      MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT))
-		kvfree(parse_attr);
-
 	*__flow = flow;
 
 	return 0;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
index 5468975a1bdb..39363d4662b3 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
@@ -281,6 +281,10 @@ enum mlx5_flow_match_level {
 /* current maximum for flow based vport multicasting */
 #define MLX5_MAX_FLOW_FWD_VPORTS 2
 
+enum {
+	MLX5_ESW_DEST_ENCAP         = BIT(0),
+};
+
 struct mlx5_esw_flow_attr {
 	struct mlx5_eswitch_rep *in_rep;
 	struct mlx5_core_dev	*in_mdev;
@@ -296,6 +300,7 @@ struct mlx5_esw_flow_attr {
 	bool	vlan_handled;
 	u32	encap_id;
 	struct {
+		u32 flags;
 		struct mlx5_eswitch_rep *rep;
 		struct mlx5_core_dev *mdev;
 	} dests[MLX5_MAX_FLOW_FWD_VPORTS];
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
index 7cbe602129b7..0387b5068be6 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
@@ -128,6 +128,10 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
 				if (MLX5_CAP_ESW(esw->dev, merged_eswitch))
 					dest[i].vport.flags |=
 						MLX5_FLOW_DEST_VPORT_VHCA_ID;
+				if (attr->dests[j].flags & MLX5_ESW_DEST_ENCAP) {
+					flow_act.action |= MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT;
+					flow_act.reformat_id = attr->encap_id;
+				}
 				i++;
 			}
 		}
@@ -164,9 +168,6 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
 	if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR)
 		flow_act.modify_id = attr->mod_hdr_id;
 
-	if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT)
-		flow_act.reformat_id = attr->encap_id;
-
 	fdb = esw_get_prio_table(esw, attr->chain, attr->prio, !!split);
 	if (IS_ERR(fdb)) {
 		rule = ERR_CAST(fdb);
-- 
2.19.2

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

* [net-next 05/14] net/mlx5e: Annul encap action ordering requirement
  2018-12-11 23:23 [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11 Saeed Mahameed
                   ` (3 preceding siblings ...)
  2018-12-11 23:23 ` [net-next 04/14] net/mlx5e: Move flow attr reformat action bit to per dest flags Saeed Mahameed
@ 2018-12-11 23:24 ` Saeed Mahameed
  2018-12-11 23:24 ` [net-next 06/14] net/mlx5e: Replace the split logic with extended destination Saeed Mahameed
                   ` (9 subsequent siblings)
  14 siblings, 0 replies; 22+ messages in thread
From: Saeed Mahameed @ 2018-12-11 23:24 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Eli Britstein, Saeed Mahameed

From: Eli Britstein <elibr@mellanox.com>

Currently a FW syndrome is emitted if the driver configures a
multi-destination FTE where the first destination is a tunneled uplink
port and the second destination is a local vPort.

Support this scenario by creating a multi-destination FTE using the
firmware's extended destination capabilities.

Signed-off-by: Eli Britstein <elibr@mellanox.com>
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
index 0387b5068be6..bb96c4661e26 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
@@ -131,6 +131,8 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
 				if (attr->dests[j].flags & MLX5_ESW_DEST_ENCAP) {
 					flow_act.action |= MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT;
 					flow_act.reformat_id = attr->encap_id;
+					dest[i].vport.flags |= MLX5_FLOW_DEST_VPORT_REFORMAT_ID;
+					dest[i].vport.reformat_id = attr->encap_id;
 				}
 				i++;
 			}
-- 
2.19.2

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

* [net-next 06/14] net/mlx5e: Replace the split logic with extended destination
  2018-12-11 23:23 [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11 Saeed Mahameed
                   ` (4 preceding siblings ...)
  2018-12-11 23:24 ` [net-next 05/14] net/mlx5e: Annul encap action ordering requirement Saeed Mahameed
@ 2018-12-11 23:24 ` Saeed Mahameed
  2018-12-11 23:24 ` [net-next 07/14] net/mlx5e: Support header rewrite actions with remote port mirroring Saeed Mahameed
                   ` (8 subsequent siblings)
  14 siblings, 0 replies; 22+ messages in thread
From: Saeed Mahameed @ 2018-12-11 23:24 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Eli Britstein, Saeed Mahameed

From: Eli Britstein <elibr@mellanox.com>

Currently the FTE encap flag applies to all destinations.
To support mirroring encapsulated traffic to a local port the driver
split the two destinations to two flow table entries:
Table#0: - FWD to the local vport
         - Goto table#1
Table#1: - Encap and FWD to wire
The firmware extended destination capabilities enable the driver to set
an encapsulation flag per destination.

Remove the split logic and use the extended destination mechanism
instead.

Note that split technique is still required for pedit and VLAN push
scenarios.

Signed-off-by: Eli Britstein <elibr@mellanox.com>
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
index e48fbb7d9735..1e3688a0c4f9 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
@@ -2513,7 +2513,6 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
 				encap = true;
 			else
 				return -EOPNOTSUPP;
-			attr->split_count = attr->out_count;
 			continue;
 		}
 
-- 
2.19.2

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

* [net-next 07/14] net/mlx5e: Support header rewrite actions with remote port mirroring
  2018-12-11 23:23 [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11 Saeed Mahameed
                   ` (5 preceding siblings ...)
  2018-12-11 23:24 ` [net-next 06/14] net/mlx5e: Replace the split logic with extended destination Saeed Mahameed
@ 2018-12-11 23:24 ` Saeed Mahameed
  2018-12-11 23:24 ` [net-next 08/14] net/mlx5e: Change parse attr struct to accommodate multiple tunnel infos Saeed Mahameed
                   ` (7 subsequent siblings)
  14 siblings, 0 replies; 22+ messages in thread
From: Saeed Mahameed @ 2018-12-11 23:24 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Eli Britstein, Saeed Mahameed

From: Eli Britstein <elibr@mellanox.com>

A rule with the following actions is split to a two level FDB:
1. Forward to local mirror vport
2. Header rewrite
3. Forward to local vport
In the first level flow table, forward the packet to the local port and
forward the packet to the second level flow table for header rewrite and
local port forwarding. This configuration fails when mirroring to a
remote encapsulated destination because currently an FTE cannot support
encap and table destinations.

Use the extended destination capabilities to configure the first level
flow table with a multi-destination FTE to the uplink and second level
table and the second level flow table for the header rewrite and local
port forwarding.

Signed-off-by: Eli Britstein <elibr@mellanox.com>
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/en_tc.c            | 5 +++--
 drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c | 4 ++++
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
index 1e3688a0c4f9..4030462f56dc 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
@@ -943,8 +943,8 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
 		}
 		out_priv = netdev_priv(encap_dev);
 		rpriv = out_priv->ppriv;
-		attr->dests[attr->out_count].rep = rpriv->rep;
-		attr->dests[attr->out_count++].mdev = out_priv->mdev;
+		attr->dests[out_index].rep = rpriv->rep;
+		attr->dests[out_index].mdev = out_priv->mdev;
 	}
 
 	err = mlx5_eswitch_add_vlan_action(esw, attr);
@@ -2487,6 +2487,7 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
 				attr->parse_attr = parse_attr;
 				attr->dests[attr->out_count].flags |=
 					MLX5_ESW_DEST_ENCAP;
+				attr->out_count++;
 				/* attr->dests[].rep is resolved when we
 				 * handle encap
 				 */
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
index bb96c4661e26..b0652e44a68d 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
@@ -226,6 +226,10 @@ mlx5_eswitch_add_fwd_rule(struct mlx5_eswitch *esw,
 			MLX5_CAP_GEN(attr->dests[i].mdev, vhca_id);
 		if (MLX5_CAP_ESW(esw->dev, merged_eswitch))
 			dest[i].vport.flags |= MLX5_FLOW_DEST_VPORT_VHCA_ID;
+		if (attr->dests[i].flags & MLX5_ESW_DEST_ENCAP) {
+			dest[i].vport.flags |= MLX5_FLOW_DEST_VPORT_REFORMAT_ID;
+			dest[i].vport.reformat_id = attr->encap_id;
+		}
 	}
 	dest[i].type = MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE;
 	dest[i].ft = fwd_fdb,
-- 
2.19.2

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

* [net-next 08/14] net/mlx5e: Change parse attr struct to accommodate multiple tunnel infos
  2018-12-11 23:23 [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11 Saeed Mahameed
                   ` (6 preceding siblings ...)
  2018-12-11 23:24 ` [net-next 07/14] net/mlx5e: Support header rewrite actions with remote port mirroring Saeed Mahameed
@ 2018-12-11 23:24 ` Saeed Mahameed
  2018-12-12  0:49   ` Cong Wang
  2018-12-11 23:24 ` [net-next 09/14] net/mlx5e: Allow association of a flow to multiple encaps Saeed Mahameed
                   ` (6 subsequent siblings)
  14 siblings, 1 reply; 22+ messages in thread
From: Saeed Mahameed @ 2018-12-11 23:24 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Eli Britstein, Saeed Mahameed

From: Eli Britstein <elibr@mellanox.com>

Currently the driver can support only a single TC tunnel_set action.
Change the tunnel info fields to arrays, as a pre-step to support
multiple encapsulations for a single flow, with no functional change.

Signed-off-by: Eli Britstein <elibr@mellanox.com>
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
index 4030462f56dc..67b3c6f1aeae 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
@@ -94,12 +94,12 @@ struct mlx5e_tc_flow {
 };
 
 struct mlx5e_tc_flow_parse_attr {
-	struct ip_tunnel_info tun_info;
+	struct ip_tunnel_info tun_info[MLX5_MAX_FLOW_FWD_VPORTS];
 	struct net_device *filter_dev;
 	struct mlx5_flow_spec spec;
 	int num_mod_hdr_actions;
 	void *mod_hdr_actions;
-	int mirred_ifindex;
+	int mirred_ifindex[MLX5_MAX_FLOW_FWD_VPORTS];
 };
 
 #define MLX5E_TC_TABLE_NUM_GROUPS 4
@@ -571,7 +571,7 @@ static int mlx5e_hairpin_flow_add(struct mlx5e_priv *priv,
 				  struct mlx5e_tc_flow_parse_attr *parse_attr,
 				  struct netlink_ext_ack *extack)
 {
-	int peer_ifindex = parse_attr->mirred_ifindex;
+	int peer_ifindex = parse_attr->mirred_ifindex[0];
 	struct mlx5_hairpin_params params;
 	struct mlx5_core_dev *peer_mdev;
 	struct mlx5e_hairpin_entry *hpe;
@@ -933,8 +933,8 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
 			continue;
 
 		out_dev = __dev_get_by_index(dev_net(priv->netdev),
-					     attr->parse_attr->mirred_ifindex);
-		encap_err = mlx5e_attach_encap(priv, &parse_attr->tun_info,
+					     attr->parse_attr->mirred_ifindex[0]);
+		encap_err = mlx5e_attach_encap(priv, &parse_attr->tun_info[0],
 					       out_dev, &encap_dev, flow,
 					       extack);
 		if (encap_err && encap_err != -EAGAIN) {
@@ -2220,7 +2220,7 @@ static int parse_tc_nic_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
 
 			if (priv->netdev->netdev_ops == peer_dev->netdev_ops &&
 			    same_hw_devs(priv, netdev_priv(peer_dev))) {
-				parse_attr->mirred_ifindex = peer_dev->ifindex;
+				parse_attr->mirred_ifindex[0] = peer_dev->ifindex;
 				flow->flags |= MLX5E_TC_FLOW_HAIRPIN;
 				action |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST |
 					  MLX5_FLOW_CONTEXT_ACTION_COUNT;
@@ -2482,8 +2482,8 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
 				attr->dests[attr->out_count].mdev = out_priv->mdev;
 				attr->out_count++;
 			} else if (encap) {
-				parse_attr->mirred_ifindex = out_dev->ifindex;
-				parse_attr->tun_info = *info;
+				parse_attr->mirred_ifindex[0] = out_dev->ifindex;
+				parse_attr->tun_info[0] = *info;
 				attr->parse_attr = parse_attr;
 				attr->dests[attr->out_count].flags |=
 					MLX5_ESW_DEST_ENCAP;
-- 
2.19.2

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

* [net-next 09/14] net/mlx5e: Allow association of a flow to multiple encaps
  2018-12-11 23:23 [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11 Saeed Mahameed
                   ` (7 preceding siblings ...)
  2018-12-11 23:24 ` [net-next 08/14] net/mlx5e: Change parse attr struct to accommodate multiple tunnel infos Saeed Mahameed
@ 2018-12-11 23:24 ` Saeed Mahameed
  2018-12-11 23:24 ` [net-next 10/14] net/mlx5e: Support multiple encapsulations for a TC flow Saeed Mahameed
                   ` (5 subsequent siblings)
  14 siblings, 0 replies; 22+ messages in thread
From: Saeed Mahameed @ 2018-12-11 23:24 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Eli Britstein, Saeed Mahameed

From: Eli Britstein <elibr@mellanox.com>

Currently a flow can be associated with a single encap entry. The
extended destination feature enables the driver to configure multiple
encap entries per flow.

Change the encap flow association field to array as a pre-step towards
supporting multiple encap destinations. Use only the first array
element, with no functional change.

Signed-off-by: Eli Britstein <elibr@mellanox.com>
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 .../net/ethernet/mellanox/mlx5/core/en_tc.c   | 48 ++++++++++++++++---
 1 file changed, 41 insertions(+), 7 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
index 67b3c6f1aeae..58b83489a6d6 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
@@ -78,13 +78,39 @@ enum {
 
 #define MLX5E_TC_MAX_SPLITS 1
 
+/* Helper struct for accessing a struct containing list_head array.
+ * Containing struct
+ *   |- Helper array
+ *      [0] Helper item 0
+ *          |- list_head item 0
+ *          |- index (0)
+ *      [1] Helper item 1
+ *          |- list_head item 1
+ *          |- index (1)
+ * To access the containing struct from one of the list_head items:
+ * 1. Get the helper item from the list_head item using
+ *    helper item =
+ *        container_of(list_head item, helper struct type, list_head field)
+ * 2. Get the contining struct from the helper item and its index in the array:
+ *    containing struct =
+ *        container_of(helper item, containing struct type, helper field[index])
+ */
+struct encap_flow_item {
+	struct list_head list;
+	int index;
+};
+
 struct mlx5e_tc_flow {
 	struct rhash_head	node;
 	struct mlx5e_priv	*priv;
 	u64			cookie;
 	u16			flags;
 	struct mlx5_flow_handle *rule[MLX5E_TC_MAX_SPLITS + 1];
-	struct list_head	encap;   /* flows sharing the same encap ID */
+	/* Flow can be associated with multiple encap IDs.
+	 * The number of encaps is bounded by the number of supported
+	 * destinations.
+	 */
+	struct encap_flow_item encaps[MLX5_MAX_FLOW_FWD_VPORTS];
 	struct list_head	mod_hdr; /* flows sharing the same mod hdr ID */
 	struct list_head	hairpin; /* flows sharing the same hairpin */
 	union {
@@ -1043,6 +1069,7 @@ void mlx5e_tc_encap_flows_add(struct mlx5e_priv *priv,
 	struct mlx5_esw_flow_attr slow_attr, *esw_attr;
 	struct mlx5_flow_handle *rule;
 	struct mlx5_flow_spec *spec;
+	struct encap_flow_item *efi;
 	struct mlx5e_tc_flow *flow;
 	int err;
 
@@ -1059,7 +1086,8 @@ void mlx5e_tc_encap_flows_add(struct mlx5e_priv *priv,
 	e->flags |= MLX5_ENCAP_ENTRY_VALID;
 	mlx5e_rep_queue_neigh_stats_work(priv);
 
-	list_for_each_entry(flow, &e->flows, encap) {
+	list_for_each_entry(efi, &e->flows, list) {
+		flow = container_of(efi, struct mlx5e_tc_flow, encaps[efi->index]);
 		esw_attr = flow->esw_attr;
 		esw_attr->encap_id = e->encap_id;
 		spec = &esw_attr->parse_attr->spec;
@@ -1086,10 +1114,12 @@ void mlx5e_tc_encap_flows_del(struct mlx5e_priv *priv,
 	struct mlx5_esw_flow_attr slow_attr;
 	struct mlx5_flow_handle *rule;
 	struct mlx5_flow_spec *spec;
+	struct encap_flow_item *efi;
 	struct mlx5e_tc_flow *flow;
 	int err;
 
-	list_for_each_entry(flow, &e->flows, encap) {
+	list_for_each_entry(efi, &e->flows, list) {
+		flow = container_of(efi, struct mlx5e_tc_flow, encaps[efi->index]);
 		spec = &flow->esw_attr->parse_attr->spec;
 
 		/* update from encap rule to slow path rule */
@@ -1142,9 +1172,12 @@ void mlx5e_tc_update_neigh_used_value(struct mlx5e_neigh_hash_entry *nhe)
 		return;
 
 	list_for_each_entry(e, &nhe->encap_list, encap_list) {
+		struct encap_flow_item *efi;
 		if (!(e->flags & MLX5_ENCAP_ENTRY_VALID))
 			continue;
-		list_for_each_entry(flow, &e->flows, encap) {
+		list_for_each_entry(efi, &e->flows, list) {
+			flow = container_of(efi, struct mlx5e_tc_flow,
+					    encaps[efi->index]);
 			if (flow->flags & MLX5E_TC_FLOW_OFFLOADED) {
 				counter = mlx5e_tc_get_counter(flow);
 				mlx5_fc_query_cached(counter, &bytes, &packets, &lastuse);
@@ -1176,9 +1209,9 @@ void mlx5e_tc_update_neigh_used_value(struct mlx5e_neigh_hash_entry *nhe)
 static void mlx5e_detach_encap(struct mlx5e_priv *priv,
 			       struct mlx5e_tc_flow *flow)
 {
-	struct list_head *next = flow->encap.next;
+	struct list_head *next = flow->encaps[0].list.next;
 
-	list_del(&flow->encap);
+	list_del(&flow->encaps[0].list);
 	if (list_empty(next)) {
 		struct mlx5e_encap_entry *e;
 
@@ -2338,7 +2371,8 @@ static int mlx5e_attach_encap(struct mlx5e_priv *priv,
 	hash_add_rcu(esw->offloads.encap_tbl, &e->encap_hlist, hash_key);
 
 attach_flow:
-	list_add(&flow->encap, &e->flows);
+	list_add(&flow->encaps[0].list, &e->flows);
+	flow->encaps[0].index = 0;
 	*encap_dev = e->out_dev;
 	if (e->flags & MLX5_ENCAP_ENTRY_VALID)
 		attr->encap_id = e->encap_id;
-- 
2.19.2

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

* [net-next 10/14] net/mlx5e: Support multiple encapsulations for a TC flow
  2018-12-11 23:23 [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11 Saeed Mahameed
                   ` (8 preceding siblings ...)
  2018-12-11 23:24 ` [net-next 09/14] net/mlx5e: Allow association of a flow to multiple encaps Saeed Mahameed
@ 2018-12-11 23:24 ` Saeed Mahameed
  2018-12-11 23:24 ` [net-next 11/14] net/mlx5e: Use CQE padding for Ethernet CQs Saeed Mahameed
                   ` (4 subsequent siblings)
  14 siblings, 0 replies; 22+ messages in thread
From: Saeed Mahameed @ 2018-12-11 23:24 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Eli Britstein, Saeed Mahameed

From: Eli Britstein <elibr@mellanox.com>

Currently a flow is associated with a single encap structure. The FW
extended destination features enables the driver to associate a flow
with multiple encap instances.

Change the encap id field from a flow scope to a per destination value
in the flow attributes struct. Use the encaps array to associate a flow
table entry with multiple encap entries.

Update the neigh logic to offload only if all encapsulations used in a
flow are connected, and un-offload upon the first one disconnected.

Note that the driver can now support up to two encap destinations.

Signed-off-by: Eli Britstein <elibr@mellanox.com>
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 .../net/ethernet/mellanox/mlx5/core/en_tc.c   | 85 ++++++++++++-------
 .../net/ethernet/mellanox/mlx5/core/eswitch.h |  3 +-
 .../mellanox/mlx5/core/eswitch_offloads.c     |  7 +-
 3 files changed, 62 insertions(+), 33 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
index 58b83489a6d6..0921213561cb 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
@@ -843,14 +843,15 @@ static void mlx5e_tc_del_nic_flow(struct mlx5e_priv *priv,
 }
 
 static void mlx5e_detach_encap(struct mlx5e_priv *priv,
-			       struct mlx5e_tc_flow *flow);
+			       struct mlx5e_tc_flow *flow, int out_index);
 
 static int mlx5e_attach_encap(struct mlx5e_priv *priv,
 			      struct ip_tunnel_info *tun_info,
 			      struct net_device *mirred_dev,
 			      struct net_device **encap_dev,
 			      struct mlx5e_tc_flow *flow,
-			      struct netlink_ext_ack *extack);
+			      struct netlink_ext_ack *extack,
+			      int out_index);
 
 static struct mlx5_flow_handle *
 mlx5e_tc_offload_fdb_rules(struct mlx5_eswitch *esw,
@@ -955,18 +956,22 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
 	}
 
 	for (out_index = 0; out_index < MLX5_MAX_FLOW_FWD_VPORTS; out_index++) {
+		int mirred_ifindex;
+
 		if (!(attr->dests[out_index].flags & MLX5_ESW_DEST_ENCAP))
 			continue;
 
+		mirred_ifindex = attr->parse_attr->mirred_ifindex[out_index];
 		out_dev = __dev_get_by_index(dev_net(priv->netdev),
-					     attr->parse_attr->mirred_ifindex[0]);
-		encap_err = mlx5e_attach_encap(priv, &parse_attr->tun_info[0],
-					       out_dev, &encap_dev, flow,
-					       extack);
-		if (encap_err && encap_err != -EAGAIN) {
-			err = encap_err;
+					     mirred_ifindex);
+		err = mlx5e_attach_encap(priv,
+					 &parse_attr->tun_info[out_index],
+					 out_dev, &encap_dev, flow,
+					 extack, out_index);
+		if (err && err != -EAGAIN)
 			goto err_attach_encap;
-		}
+		if (err == -EAGAIN)
+			encap_err = err;
 		out_priv = netdev_priv(encap_dev);
 		rpriv = out_priv->ppriv;
 		attr->dests[out_index].rep = rpriv->rep;
@@ -1022,10 +1027,8 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
 	mlx5_eswitch_del_vlan_action(esw, attr);
 err_add_vlan:
 	for (out_index = 0; out_index < MLX5_MAX_FLOW_FWD_VPORTS; out_index++)
-		if (attr->dests[out_index].flags & MLX5_ESW_DEST_ENCAP) {
-			mlx5e_detach_encap(priv, flow);
-			break;
-		}
+		if (attr->dests[out_index].flags & MLX5_ESW_DEST_ENCAP)
+			mlx5e_detach_encap(priv, flow, out_index);
 err_attach_encap:
 err_max_prio_chain:
 	return err;
@@ -1049,10 +1052,8 @@ static void mlx5e_tc_del_fdb_flow(struct mlx5e_priv *priv,
 	mlx5_eswitch_del_vlan_action(esw, attr);
 
 	for (out_index = 0; out_index < MLX5_MAX_FLOW_FWD_VPORTS; out_index++)
-		if (attr->dests[out_index].flags & MLX5_ESW_DEST_ENCAP) {
-			mlx5e_detach_encap(priv, flow);
-			break;
-		}
+		if (attr->dests[out_index].flags & MLX5_ESW_DEST_ENCAP)
+			mlx5e_detach_encap(priv, flow, out_index);
 	kvfree(attr->parse_attr);
 
 	if (attr->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR)
@@ -1087,11 +1088,30 @@ void mlx5e_tc_encap_flows_add(struct mlx5e_priv *priv,
 	mlx5e_rep_queue_neigh_stats_work(priv);
 
 	list_for_each_entry(efi, &e->flows, list) {
+		bool all_flow_encaps_valid = true;
+		int i;
+
 		flow = container_of(efi, struct mlx5e_tc_flow, encaps[efi->index]);
 		esw_attr = flow->esw_attr;
-		esw_attr->encap_id = e->encap_id;
 		spec = &esw_attr->parse_attr->spec;
 
+		esw_attr->dests[efi->index].encap_id = e->encap_id;
+		esw_attr->dests[efi->index].flags |= MLX5_ESW_DEST_ENCAP_VALID;
+		/* Flow can be associated with multiple encap entries.
+		 * Before offloading the flow verify that all of them have
+		 * a valid neighbour.
+		 */
+		for (i = 0; i < MLX5_MAX_FLOW_FWD_VPORTS; i++) {
+			if (!(esw_attr->dests[i].flags & MLX5_ESW_DEST_ENCAP))
+				continue;
+			if (!(esw_attr->dests[i].flags & MLX5_ESW_DEST_ENCAP_VALID)) {
+				all_flow_encaps_valid = false;
+				break;
+			}
+		}
+		/* Do not offload flows with unresolved neighbors */
+		if (!all_flow_encaps_valid)
+			continue;
 		/* update from slow path rule to encap rule */
 		rule = mlx5e_tc_offload_fdb_rules(esw, flow, spec, esw_attr);
 		if (IS_ERR(rule)) {
@@ -1124,6 +1144,8 @@ void mlx5e_tc_encap_flows_del(struct mlx5e_priv *priv,
 
 		/* update from encap rule to slow path rule */
 		rule = mlx5e_tc_offload_to_slow_path(esw, flow, spec, &slow_attr);
+		/* mark the flow's encap dest as non-valid */
+		flow->esw_attr->dests[efi->index].flags &= ~MLX5_ESW_DEST_ENCAP_VALID;
 
 		if (IS_ERR(rule)) {
 			err = PTR_ERR(rule);
@@ -1207,11 +1229,11 @@ void mlx5e_tc_update_neigh_used_value(struct mlx5e_neigh_hash_entry *nhe)
 }
 
 static void mlx5e_detach_encap(struct mlx5e_priv *priv,
-			       struct mlx5e_tc_flow *flow)
+			       struct mlx5e_tc_flow *flow, int out_index)
 {
-	struct list_head *next = flow->encaps[0].list.next;
+	struct list_head *next = flow->encaps[out_index].list.next;
 
-	list_del(&flow->encaps[0].list);
+	list_del(&flow->encaps[out_index].list);
 	if (list_empty(next)) {
 		struct mlx5e_encap_entry *e;
 
@@ -2324,7 +2346,8 @@ static int mlx5e_attach_encap(struct mlx5e_priv *priv,
 			      struct net_device *mirred_dev,
 			      struct net_device **encap_dev,
 			      struct mlx5e_tc_flow *flow,
-			      struct netlink_ext_ack *extack)
+			      struct netlink_ext_ack *extack,
+			      int out_index)
 {
 	struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
 	unsigned short family = ip_tunnel_info_af(tun_info);
@@ -2371,13 +2394,15 @@ static int mlx5e_attach_encap(struct mlx5e_priv *priv,
 	hash_add_rcu(esw->offloads.encap_tbl, &e->encap_hlist, hash_key);
 
 attach_flow:
-	list_add(&flow->encaps[0].list, &e->flows);
-	flow->encaps[0].index = 0;
+	list_add(&flow->encaps[out_index].list, &e->flows);
+	flow->encaps[out_index].index = out_index;
 	*encap_dev = e->out_dev;
-	if (e->flags & MLX5_ENCAP_ENTRY_VALID)
-		attr->encap_id = e->encap_id;
-	else
+	if (e->flags & MLX5_ENCAP_ENTRY_VALID) {
+		attr->dests[out_index].encap_id = e->encap_id;
+		attr->dests[out_index].flags |= MLX5_ESW_DEST_ENCAP_VALID;
+	} else {
 		err = -EAGAIN;
+	}
 
 	return err;
 
@@ -2516,8 +2541,10 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
 				attr->dests[attr->out_count].mdev = out_priv->mdev;
 				attr->out_count++;
 			} else if (encap) {
-				parse_attr->mirred_ifindex[0] = out_dev->ifindex;
-				parse_attr->tun_info[0] = *info;
+				parse_attr->mirred_ifindex[attr->out_count] =
+					out_dev->ifindex;
+				parse_attr->tun_info[attr->out_count] = *info;
+				encap = false;
 				attr->parse_attr = parse_attr;
 				attr->dests[attr->out_count].flags |=
 					MLX5_ESW_DEST_ENCAP;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
index 39363d4662b3..87c9dea9bccf 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
@@ -283,6 +283,7 @@ enum mlx5_flow_match_level {
 
 enum {
 	MLX5_ESW_DEST_ENCAP         = BIT(0),
+	MLX5_ESW_DEST_ENCAP_VALID   = BIT(1),
 };
 
 struct mlx5_esw_flow_attr {
@@ -298,11 +299,11 @@ struct mlx5_esw_flow_attr {
 	u8	vlan_prio[MLX5_FS_VLAN_DEPTH];
 	u8	total_vlan;
 	bool	vlan_handled;
-	u32	encap_id;
 	struct {
 		u32 flags;
 		struct mlx5_eswitch_rep *rep;
 		struct mlx5_core_dev *mdev;
+		u32 encap_id;
 	} dests[MLX5_MAX_FLOW_FWD_VPORTS];
 	u32	mod_hdr_id;
 	u8	match_level;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
index b0652e44a68d..bde1fb8c284b 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
@@ -130,9 +130,10 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
 						MLX5_FLOW_DEST_VPORT_VHCA_ID;
 				if (attr->dests[j].flags & MLX5_ESW_DEST_ENCAP) {
 					flow_act.action |= MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT;
-					flow_act.reformat_id = attr->encap_id;
+					flow_act.reformat_id = attr->dests[j].encap_id;
 					dest[i].vport.flags |= MLX5_FLOW_DEST_VPORT_REFORMAT_ID;
-					dest[i].vport.reformat_id = attr->encap_id;
+					dest[i].vport.reformat_id =
+						attr->dests[j].encap_id;
 				}
 				i++;
 			}
@@ -228,7 +229,7 @@ mlx5_eswitch_add_fwd_rule(struct mlx5_eswitch *esw,
 			dest[i].vport.flags |= MLX5_FLOW_DEST_VPORT_VHCA_ID;
 		if (attr->dests[i].flags & MLX5_ESW_DEST_ENCAP) {
 			dest[i].vport.flags |= MLX5_FLOW_DEST_VPORT_REFORMAT_ID;
-			dest[i].vport.reformat_id = attr->encap_id;
+			dest[i].vport.reformat_id = attr->dests[i].encap_id;
 		}
 	}
 	dest[i].type = MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE;
-- 
2.19.2

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

* [net-next 11/14] net/mlx5e: Use CQE padding for Ethernet CQs
  2018-12-11 23:23 [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11 Saeed Mahameed
                   ` (9 preceding siblings ...)
  2018-12-11 23:24 ` [net-next 10/14] net/mlx5e: Support multiple encapsulations for a TC flow Saeed Mahameed
@ 2018-12-11 23:24 ` Saeed Mahameed
  2018-12-11 23:24 ` [net-next 12/14] net/mlx5e: Avoid query PPCNT register if not supported by the device Saeed Mahameed
                   ` (3 subsequent siblings)
  14 siblings, 0 replies; 22+ messages in thread
From: Saeed Mahameed @ 2018-12-11 23:24 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Daniel Jurgens, Saeed Mahameed

From: Daniel Jurgens <danielj@mellanox.com>

Writing 64B CQEs to 128B cache lines results in a RMW operation. Padding
the CQEs to 128B if possible improves performance on 128B cache line
systems like PPC.

Testing on PPC showed up to a 24% improvement in small packet throughput
vs the default behavior, depending on the workload and system topology.

Signed-off-by: Daniel Jurgens <danielj@mellanox.com>
Reviewed-by: Tariq Toukan <tariqt@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/en_main.c |  2 ++
 drivers/net/ethernet/mellanox/mlx5/core/wq.c      |  3 ++-
 drivers/net/ethernet/mellanox/mlx5/core/wq.h      |  7 ++++++-
 include/linux/mlx5/cq.h                           | 10 +++++-----
 4 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index 88116a4750b0..2188e5ba908f 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@ -2224,6 +2224,8 @@ static void mlx5e_build_common_cq_param(struct mlx5e_priv *priv,
 	void *cqc = param->cqc;
 
 	MLX5_SET(cqc, cqc, uar_page, priv->mdev->priv.uar->index);
+	if (MLX5_CAP_GEN(priv->mdev, cqe_128_always) && cache_line_size() >= 128)
+		MLX5_SET(cqc, cqc, cqe_sz, CQE_STRIDE_128_PAD);
 }
 
 static void mlx5e_build_rx_cq_param(struct mlx5e_priv *priv,
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/wq.c b/drivers/net/ethernet/mellanox/mlx5/core/wq.c
index 2dcbf1ebfd6a..953cc8efba69 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/wq.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/wq.c
@@ -155,7 +155,8 @@ int mlx5_cqwq_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param,
 		     void *cqc, struct mlx5_cqwq *wq,
 		     struct mlx5_wq_ctrl *wq_ctrl)
 {
-	u8 log_wq_stride = MLX5_GET(cqc, cqc, cqe_sz) + 6;
+	/* CQE_STRIDE_128 and CQE_STRIDE_128_PAD both mean 128B stride */
+	u8 log_wq_stride = MLX5_GET(cqc, cqc, cqe_sz) == CQE_STRIDE_64 ? 6 : 7;
 	u8 log_wq_sz     = MLX5_GET(cqc, cqc, log_cq_size);
 	int err;
 
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/wq.h b/drivers/net/ethernet/mellanox/mlx5/core/wq.h
index 9bc2184a46bc..ea934a48c90a 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/wq.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/wq.h
@@ -179,7 +179,12 @@ static inline u32 mlx5_cqwq_get_ci(struct mlx5_cqwq *wq)
 
 static inline struct mlx5_cqe64 *mlx5_cqwq_get_wqe(struct mlx5_cqwq *wq, u32 ix)
 {
-	return mlx5_frag_buf_get_wqe(&wq->fbc, ix);
+	struct mlx5_cqe64 *cqe = mlx5_frag_buf_get_wqe(&wq->fbc, ix);
+
+	/* For 128B CQEs the data is in the last 64B */
+	cqe += wq->fbc.log_stride == 7;
+
+	return cqe;
 }
 
 static inline u32 mlx5_cqwq_get_ctr_wrap_cnt(struct mlx5_cqwq *wq, u32 ctr)
diff --git a/include/linux/mlx5/cq.h b/include/linux/mlx5/cq.h
index 28b757a64029..612c8c2f2466 100644
--- a/include/linux/mlx5/cq.h
+++ b/include/linux/mlx5/cq.h
@@ -125,9 +125,9 @@ struct mlx5_cq_modify_params {
 };
 
 enum {
-	CQE_SIZE_64 = 0,
-	CQE_SIZE_128 = 1,
-	CQE_SIZE_128_PAD = 2,
+	CQE_STRIDE_64 = 0,
+	CQE_STRIDE_128 = 1,
+	CQE_STRIDE_128_PAD = 2,
 };
 
 #define MLX5_MAX_CQ_PERIOD (BIT(__mlx5_bit_sz(cqc, cq_period)) - 1)
@@ -135,8 +135,8 @@ enum {
 
 static inline int cqe_sz_to_mlx_sz(u8 size, int padding_128_en)
 {
-	return padding_128_en ? CQE_SIZE_128_PAD :
-				size == 64 ? CQE_SIZE_64 : CQE_SIZE_128;
+	return padding_128_en ? CQE_STRIDE_128_PAD :
+				size == 64 ? CQE_STRIDE_64 : CQE_STRIDE_128;
 }
 
 static inline void mlx5_cq_set_ci(struct mlx5_core_cq *cq)
-- 
2.19.2

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

* [net-next 12/14] net/mlx5e: Avoid query PPCNT register if not supported by the device
  2018-12-11 23:23 [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11 Saeed Mahameed
                   ` (10 preceding siblings ...)
  2018-12-11 23:24 ` [net-next 11/14] net/mlx5e: Use CQE padding for Ethernet CQs Saeed Mahameed
@ 2018-12-11 23:24 ` Saeed Mahameed
  2018-12-11 23:24 ` [net-next 13/14] net/mlx5e: Monitor counters commands support Saeed Mahameed
                   ` (2 subsequent siblings)
  14 siblings, 0 replies; 22+ messages in thread
From: Saeed Mahameed @ 2018-12-11 23:24 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Eyal Davidovich, Saeed Mahameed

From: Eyal Davidovich <eyald@mellanox.com>

PPCNT is not supported if PCAM access reg is supported and ppcnt bit is clear.

Signed-off-by: Eyal Davidovich <eyald@mellanox.com>
Reviewed-by: Eran Ben Elisha <eranbe@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/en_stats.c | 12 ++++++++++++
 include/linux/mlx5/mlx5_ifc.h                      |  4 +++-
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c
index 75d30fa637d6..8224f1e062a8 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c
@@ -483,6 +483,9 @@ static int mlx5e_grp_802_3_fill_stats(struct mlx5e_priv *priv, u64 *data,
 	return idx;
 }
 
+#define MLX5_BASIC_PPCNT_SUPPORTED(mdev) \
+	(MLX5_CAP_GEN(mdev, pcam_reg) ? MLX5_CAP_PCAM_REG(mdev, ppcnt) : 1)
+
 static void mlx5e_grp_802_3_update_stats(struct mlx5e_priv *priv)
 {
 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
@@ -491,6 +494,9 @@ static void mlx5e_grp_802_3_update_stats(struct mlx5e_priv *priv)
 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
 	void *out;
 
+	if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev))
+		return;
+
 	MLX5_SET(ppcnt_reg, in, local_port, 1);
 	out = pstats->IEEE_802_3_counters;
 	MLX5_SET(ppcnt_reg, in, grp, MLX5_IEEE_802_3_COUNTERS_GROUP);
@@ -603,6 +609,9 @@ static void mlx5e_grp_2819_update_stats(struct mlx5e_priv *priv)
 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
 	void *out;
 
+	if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev))
+		return;
+
 	MLX5_SET(ppcnt_reg, in, local_port, 1);
 	out = pstats->RFC_2819_counters;
 	MLX5_SET(ppcnt_reg, in, grp, MLX5_RFC_2819_COUNTERS_GROUP);
@@ -1078,6 +1087,9 @@ static void mlx5e_grp_per_prio_update_stats(struct mlx5e_priv *priv)
 	int prio;
 	void *out;
 
+	if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev))
+		return;
+
 	MLX5_SET(ppcnt_reg, in, local_port, 1);
 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PER_PRIORITY_COUNTERS_GROUP);
 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h
index 60c1d49eb40c..c12b0dec2889 100644
--- a/include/linux/mlx5/mlx5_ifc.h
+++ b/include/linux/mlx5/mlx5_ifc.h
@@ -8283,7 +8283,9 @@ struct mlx5_ifc_pcam_regs_5000_to_507f_bits {
 	u8         port_access_reg_cap_mask_31_to_13[0x13];
 	u8         pbmc[0x1];
 	u8         pptb[0x1];
-	u8         port_access_reg_cap_mask_10_to_0[0xb];
+	u8         port_access_reg_cap_mask_10_to_09[0x2];
+	u8         ppcnt[0x1];
+	u8         port_access_reg_cap_mask_07_to_00[0x8];
 };
 
 struct mlx5_ifc_pcam_reg_bits {
-- 
2.19.2

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

* [net-next 13/14] net/mlx5e: Monitor counters commands support
  2018-12-11 23:23 [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11 Saeed Mahameed
                   ` (11 preceding siblings ...)
  2018-12-11 23:24 ` [net-next 12/14] net/mlx5e: Avoid query PPCNT register if not supported by the device Saeed Mahameed
@ 2018-12-11 23:24 ` Saeed Mahameed
  2018-12-11 23:24 ` [net-next 14/14] net/mlx5e: Use monitor counters for update stats Saeed Mahameed
  2018-12-13  1:32 ` [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11 Saeed Mahameed
  14 siblings, 0 replies; 22+ messages in thread
From: Saeed Mahameed @ 2018-12-11 23:24 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Eyal Davidovich, Saeed Mahameed

From: Eyal Davidovich <eyald@mellanox.com>

new file monitor_stats.c for the new API.
add arm_monitor_counter new command support.
add set_monitor_counter new command support.

The device can monitor specific counters and provide an event to notify
when these counters are changed.
The monitoring is done in best effort manner where the minimum
notification period is 200 ms, however when the device is loaded, the
notification might be delayed.
To configure the required counters to be monitored, the
SET_MONITOR_COUNTER command shall be used with a list of counters to be
monitored.
The device firmware can monitor up to HCA_CAP.max_num_of_monitor_counters.
The configuration is done based on counter type (such as ppcnt, q counter,
etc) and additional param according to the type of counter selected.
Upon monitor counter change, the device will generate
Monitor_Counter_Change event.
The device will not generate new events unless the driver re-arms the
monitoring functionality, using the ARM_MONITOR_COUNTER command.

Signed-off-by: Eyal Davidovich <eyald@mellanox.com>
Reviewed-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 .../net/ethernet/mellanox/mlx5/core/Makefile  |   2 +-
 .../mellanox/mlx5/core/en/monitor_stats.c     | 126 ++++++++++++++++++
 .../mellanox/mlx5/core/en/monitor_stats.h     |  12 ++
 3 files changed, 139 insertions(+), 1 deletion(-)
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/en/monitor_stats.c
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/en/monitor_stats.h

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/Makefile b/drivers/net/ethernet/mellanox/mlx5/core/Makefile
index 40764d87413a..9678051b8ff1 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/Makefile
+++ b/drivers/net/ethernet/mellanox/mlx5/core/Makefile
@@ -22,7 +22,7 @@ mlx5_core-y :=	main.o cmd.o debugfs.o fw.o eq.o uar.o pagealloc.o \
 #
 mlx5_core-$(CONFIG_MLX5_CORE_EN) += en_main.o en_common.o en_fs.o en_ethtool.o \
 		en_tx.o en_rx.o en_dim.o en_txrx.o en/xdp.o en_stats.o \
-		en_selftest.o en/port.o
+		en_selftest.o en/port.o en/monitor_stats.o
 
 #
 # Netdev extra
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/monitor_stats.c b/drivers/net/ethernet/mellanox/mlx5/core/en/monitor_stats.c
new file mode 100644
index 000000000000..0f010efa1375
--- /dev/null
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/monitor_stats.c
@@ -0,0 +1,126 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/* Copyright (c) 2018 Mellanox Technologies. */
+
+#include "en.h"
+#include "monitor_stats.h"
+
+/* Driver will set the following watch counters list:
+ * Ppcnt.802_3:
+ * a_in_range_length_errors      Type: 0x0, Counter:  0x0, group_id = N/A
+ * a_out_of_range_length_field   Type: 0x0, Counter:  0x1, group_id = N/A
+ * a_frame_too_long_errors       Type: 0x0, Counter:  0x2, group_id = N/A
+ * a_frame_check_sequence_errors Type: 0x0, Counter:  0x3, group_id = N/A
+ * a_alignment_errors            Type: 0x0, Counter:  0x4, group_id = N/A
+ * if_out_discards               Type: 0x0, Counter:  0x5, group_id = N/A
+ * Q_Counters:
+ * Q[index].rx_out_of_buffer   Type: 0x1, Counter:  0x4, group_id = counter_ix
+ */
+
+#define NUM_REQ_PPCNT_COUNTER_S1 MLX5_CMD_SET_MONITOR_NUM_PPCNT_COUNTER_SET1
+#define NUM_REQ_Q_COUNTERS_S1    MLX5_CMD_SET_MONITOR_NUM_Q_COUNTERS_SET1
+
+int mlx5e_monitor_counter_supported(struct mlx5e_priv *priv)
+{
+	struct mlx5_core_dev *mdev = priv->mdev;
+
+	if (!MLX5_CAP_GEN(mdev, max_num_of_monitor_counters))
+		return false;
+	if (MLX5_CAP_PCAM_REG(mdev, ppcnt) &&
+	    MLX5_CAP_GEN(mdev, num_ppcnt_monitor_counters) <
+	    NUM_REQ_PPCNT_COUNTER_S1)
+		return false;
+	if (MLX5_CAP_GEN(mdev, num_q_monitor_counters) <
+	    NUM_REQ_Q_COUNTERS_S1)
+		return false;
+	return true;
+}
+
+void mlx5e_monitor_counter_arm(struct mlx5e_priv *priv)
+{
+	u32  in[MLX5_ST_SZ_DW(arm_monitor_counter_in)]  = {};
+	u32 out[MLX5_ST_SZ_DW(arm_monitor_counter_out)] = {};
+
+	MLX5_SET(arm_monitor_counter_in, in, opcode,
+		 MLX5_CMD_OP_ARM_MONITOR_COUNTER);
+	mlx5_cmd_exec(priv->mdev, in, sizeof(in), out, sizeof(out));
+}
+
+static int fill_monitor_counter_ppcnt_set1(int cnt, u32 *in)
+{
+	enum mlx5_monitor_counter_ppcnt ppcnt_cnt;
+
+	for (ppcnt_cnt = 0;
+	     ppcnt_cnt < NUM_REQ_PPCNT_COUNTER_S1;
+	     ppcnt_cnt++, cnt++) {
+		MLX5_SET(set_monitor_counter_in, in,
+			 monitor_counter[cnt].type,
+			 MLX5_QUERY_MONITOR_CNT_TYPE_PPCNT);
+		MLX5_SET(set_monitor_counter_in, in,
+			 monitor_counter[cnt].counter,
+			 ppcnt_cnt);
+	}
+	return ppcnt_cnt;
+}
+
+static int fill_monitor_counter_q_counter_set1(int cnt, int q_counter, u32 *in)
+{
+	MLX5_SET(set_monitor_counter_in, in,
+		 monitor_counter[cnt].type,
+		 MLX5_QUERY_MONITOR_CNT_TYPE_Q_COUNTER);
+	MLX5_SET(set_monitor_counter_in, in,
+		 monitor_counter[cnt].counter,
+		 MLX5_QUERY_MONITOR_Q_COUNTER_RX_OUT_OF_BUFFER);
+	MLX5_SET(set_monitor_counter_in, in,
+		 monitor_counter[cnt].counter_group_id,
+		 q_counter);
+	return 1;
+}
+
+/* check if mlx5e_monitor_counter_supported before calling this function*/
+static void mlx5e_set_monitor_counter(struct mlx5e_priv *priv)
+{
+	struct mlx5_core_dev *mdev = priv->mdev;
+	int max_num_of_counters = MLX5_CAP_GEN(mdev, max_num_of_monitor_counters);
+	int num_q_counters      = MLX5_CAP_GEN(mdev, num_q_monitor_counters);
+	int num_ppcnt_counters  = !MLX5_CAP_PCAM_REG(mdev, ppcnt) ? 0 :
+				  MLX5_CAP_GEN(mdev, num_ppcnt_monitor_counters);
+	u32  in[MLX5_ST_SZ_DW(set_monitor_counter_in)]  = {};
+	u32 out[MLX5_ST_SZ_DW(set_monitor_counter_out)] = {};
+	int q_counter = priv->q_counter;
+	int cnt	= 0;
+
+	if (num_ppcnt_counters  >=  NUM_REQ_PPCNT_COUNTER_S1 &&
+	    max_num_of_counters >= (NUM_REQ_PPCNT_COUNTER_S1 + cnt))
+		cnt += fill_monitor_counter_ppcnt_set1(cnt, in);
+
+	if (num_q_counters      >=  NUM_REQ_Q_COUNTERS_S1 &&
+	    max_num_of_counters >= (NUM_REQ_Q_COUNTERS_S1 + cnt) &&
+	    q_counter)
+		cnt += fill_monitor_counter_q_counter_set1(cnt, q_counter, in);
+
+	MLX5_SET(set_monitor_counter_in, in, num_of_counters, cnt);
+	MLX5_SET(set_monitor_counter_in, in, opcode,
+		 MLX5_CMD_OP_SET_MONITOR_COUNTER);
+
+	mlx5_cmd_exec(mdev, in, sizeof(in), out, sizeof(out));
+}
+
+/* check if mlx5e_monitor_counter_supported before calling this function*/
+void mlx5e_monitor_counter_init(struct mlx5e_priv *priv)
+{
+	mlx5e_set_monitor_counter(priv);
+	mlx5e_monitor_counter_arm(priv);
+}
+
+/* check if mlx5e_monitor_counter_supported before calling this function*/
+void mlx5e_monitor_counter_cleanup(struct mlx5e_priv *priv)
+{
+	u32  in[MLX5_ST_SZ_DW(set_monitor_counter_in)]  = {};
+	u32 out[MLX5_ST_SZ_DW(set_monitor_counter_out)] = {};
+
+	MLX5_SET(set_monitor_counter_in, in, num_of_counters, 0);
+	MLX5_SET(set_monitor_counter_in, in, opcode,
+		 MLX5_CMD_OP_SET_MONITOR_COUNTER);
+
+	mlx5_cmd_exec(priv->mdev, in, sizeof(in), out, sizeof(out));
+}
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/monitor_stats.h b/drivers/net/ethernet/mellanox/mlx5/core/en/monitor_stats.h
new file mode 100644
index 000000000000..e1ac4b3d22fb
--- /dev/null
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/monitor_stats.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
+/* Copyright (c) 2018 Mellanox Technologies. */
+
+#ifndef __MLX5_MONITOR_H__
+#define __MLX5_MONITOR_H__
+
+int  mlx5e_monitor_counter_supported(struct mlx5e_priv *priv);
+void mlx5e_monitor_counter_init(struct mlx5e_priv *priv);
+void mlx5e_monitor_counter_cleanup(struct mlx5e_priv *priv);
+void mlx5e_monitor_counter_arm(struct mlx5e_priv *priv);
+
+#endif /* __MLX5_MONITOR_H__ */
-- 
2.19.2

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

* [net-next 14/14] net/mlx5e: Use monitor counters for update stats
  2018-12-11 23:23 [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11 Saeed Mahameed
                   ` (12 preceding siblings ...)
  2018-12-11 23:24 ` [net-next 13/14] net/mlx5e: Monitor counters commands support Saeed Mahameed
@ 2018-12-11 23:24 ` Saeed Mahameed
  2018-12-13  1:32 ` [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11 Saeed Mahameed
  14 siblings, 0 replies; 22+ messages in thread
From: Saeed Mahameed @ 2018-12-11 23:24 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Eyal Davidovich, Saeed Mahameed

From: Eyal Davidovich <eyald@mellanox.com>

- Adding new notifier block (struct mlx5_nb) monitor_counters_nb
  for handeling MONITOR_COUNTER new event type.
- Adding work queue element: monitor_counters_work for re-arm and
  update stats.
- We re-queue the update stat work, only when working over firmware
  that doesn't support the monitored counters.

Signed-off-by: Eyal Davidovich <eyald@mellanox.com>
Reviewed-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/en.h  |  3 ++
 .../mellanox/mlx5/core/en/monitor_stats.c     | 47 ++++++++++++++++++-
 .../net/ethernet/mellanox/mlx5/core/en_main.c | 14 ++++--
 3 files changed, 59 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h
index 9ea0f853c3bb..1c4e033b7509 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h
@@ -685,6 +685,8 @@ struct mlx5e_priv {
 	struct work_struct         set_rx_mode_work;
 	struct work_struct         tx_timeout_work;
 	struct work_struct         update_stats_work;
+	struct work_struct         monitor_counters_work;
+	struct mlx5_nb             monitor_counters_nb;
 
 	struct mlx5_core_dev      *mdev;
 	struct net_device         *netdev;
@@ -940,6 +942,7 @@ int mlx5e_create_tises(struct mlx5e_priv *priv);
 void mlx5e_cleanup_nic_tx(struct mlx5e_priv *priv);
 int mlx5e_close(struct net_device *netdev);
 int mlx5e_open(struct net_device *netdev);
+void mlx5e_update_ndo_stats(struct mlx5e_priv *priv);
 
 void mlx5e_queue_update_stats(struct mlx5e_priv *priv);
 int mlx5e_bits_invert(unsigned long a, int size);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/monitor_stats.c b/drivers/net/ethernet/mellanox/mlx5/core/en/monitor_stats.c
index 0f010efa1375..2ce420851e77 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/monitor_stats.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/monitor_stats.c
@@ -3,6 +3,7 @@
 
 #include "en.h"
 #include "monitor_stats.h"
+#include "lib/eq.h"
 
 /* Driver will set the following watch counters list:
  * Ppcnt.802_3:
@@ -45,6 +46,39 @@ void mlx5e_monitor_counter_arm(struct mlx5e_priv *priv)
 	mlx5_cmd_exec(priv->mdev, in, sizeof(in), out, sizeof(out));
 }
 
+static void mlx5e_monitor_counters_work(struct work_struct *work)
+{
+	struct mlx5e_priv *priv = container_of(work, struct mlx5e_priv,
+					       monitor_counters_work);
+
+	mutex_lock(&priv->state_lock);
+	mlx5e_update_ndo_stats(priv);
+	mutex_unlock(&priv->state_lock);
+	mlx5e_monitor_counter_arm(priv);
+}
+
+static int mlx5e_monitor_event_handler(struct notifier_block *nb,
+				       unsigned long event, void *eqe)
+{
+	struct mlx5e_priv *priv = mlx5_nb_cof(nb, struct mlx5e_priv,
+					      monitor_counters_nb);
+	queue_work(priv->wq, &priv->monitor_counters_work);
+	return NOTIFY_OK;
+}
+
+void mlx5e_monitor_counter_start(struct mlx5e_priv *priv)
+{
+	MLX5_NB_INIT(&priv->monitor_counters_nb, mlx5e_monitor_event_handler,
+		     MONITOR_COUNTER);
+	mlx5_eq_notifier_register(priv->mdev, &priv->monitor_counters_nb);
+}
+
+static void mlx5e_monitor_counter_stop(struct mlx5e_priv *priv)
+{
+	mlx5_eq_notifier_unregister(priv->mdev, &priv->monitor_counters_nb);
+	cancel_work_sync(&priv->monitor_counters_work);
+}
+
 static int fill_monitor_counter_ppcnt_set1(int cnt, u32 *in)
 {
 	enum mlx5_monitor_counter_ppcnt ppcnt_cnt;
@@ -108,12 +142,14 @@ static void mlx5e_set_monitor_counter(struct mlx5e_priv *priv)
 /* check if mlx5e_monitor_counter_supported before calling this function*/
 void mlx5e_monitor_counter_init(struct mlx5e_priv *priv)
 {
+	INIT_WORK(&priv->monitor_counters_work, mlx5e_monitor_counters_work);
+	mlx5e_monitor_counter_start(priv);
 	mlx5e_set_monitor_counter(priv);
 	mlx5e_monitor_counter_arm(priv);
+	queue_work(priv->wq, &priv->update_stats_work);
 }
 
-/* check if mlx5e_monitor_counter_supported before calling this function*/
-void mlx5e_monitor_counter_cleanup(struct mlx5e_priv *priv)
+static void mlx5e_monitor_counter_disable(struct mlx5e_priv *priv)
 {
 	u32  in[MLX5_ST_SZ_DW(set_monitor_counter_in)]  = {};
 	u32 out[MLX5_ST_SZ_DW(set_monitor_counter_out)] = {};
@@ -124,3 +160,10 @@ void mlx5e_monitor_counter_cleanup(struct mlx5e_priv *priv)
 
 	mlx5_cmd_exec(priv->mdev, in, sizeof(in), out, sizeof(out));
 }
+
+/* check if mlx5e_monitor_counter_supported before calling this function*/
+void mlx5e_monitor_counter_cleanup(struct mlx5e_priv *priv)
+{
+	mlx5e_monitor_counter_disable(priv);
+	mlx5e_monitor_counter_stop(priv);
+}
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index 2188e5ba908f..59745851b5ba 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@ -50,6 +50,7 @@
 #include "en/port.h"
 #include "en/xdp.h"
 #include "lib/eq.h"
+#include "en/monitor_stats.h"
 
 struct mlx5e_rq_param {
 	u32			rqc[MLX5_ST_SZ_DW(rqc)];
@@ -263,7 +264,7 @@ void mlx5e_update_stats(struct mlx5e_priv *priv)
 			mlx5e_stats_grps[i].update_stats(priv);
 }
 
-static void mlx5e_update_ndo_stats(struct mlx5e_priv *priv)
+void mlx5e_update_ndo_stats(struct mlx5e_priv *priv)
 {
 	int i;
 
@@ -3459,8 +3460,10 @@ mlx5e_get_stats(struct net_device *dev, struct rtnl_link_stats64 *stats)
 	struct mlx5e_vport_stats *vstats = &priv->stats.vport;
 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
 
-	/* update HW stats in background for next time */
-	mlx5e_queue_update_stats(priv);
+	if (!mlx5e_monitor_counter_supported(priv)) {
+		/* update HW stats in background for next time */
+		mlx5e_queue_update_stats(priv);
+	}
 
 	if (mlx5e_is_uplink_rep(priv)) {
 		stats->rx_packets = PPORT_802_3_GET(pstats, a_frames_received_ok);
@@ -4901,6 +4904,8 @@ static void mlx5e_nic_enable(struct mlx5e_priv *priv)
 	mlx5_lag_add(mdev, netdev);
 
 	mlx5e_enable_async_events(priv);
+	if (mlx5e_monitor_counter_supported(priv))
+		mlx5e_monitor_counter_init(priv);
 
 	if (MLX5_ESWITCH_MANAGER(priv->mdev))
 		mlx5e_register_vport_reps(priv);
@@ -4940,6 +4945,9 @@ static void mlx5e_nic_disable(struct mlx5e_priv *priv)
 	if (MLX5_ESWITCH_MANAGER(priv->mdev))
 		mlx5e_unregister_vport_reps(priv);
 
+	if (mlx5e_monitor_counter_supported(priv))
+		mlx5e_monitor_counter_cleanup(priv);
+
 	mlx5e_disable_async_events(priv);
 	mlx5_lag_remove(mdev);
 }
-- 
2.19.2

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

* Re: [net-next 03/14] net/mlx5e: Refactor eswitch flow attr for destination specific properties
  2018-12-11 23:23 ` [net-next 03/14] net/mlx5e: Refactor eswitch flow attr for destination specific properties Saeed Mahameed
@ 2018-12-12  0:21   ` Cong Wang
  2018-12-12  1:05     ` Saeed Mahameed
  0 siblings, 1 reply; 22+ messages in thread
From: Cong Wang @ 2018-12-12  0:21 UTC (permalink / raw)
  To: Saeed Mahameed; +Cc: David Miller, Linux Kernel Network Developers, elibr

On Tue, Dec 11, 2018 at 3:27 PM Saeed Mahameed <saeedm@mellanox.com> wrote:
> @@ -939,8 +939,8 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
>                 }
>                 out_priv = netdev_priv(encap_dev);
>                 rpriv = out_priv->ppriv;
> -               attr->out_rep[attr->out_count] = rpriv->rep;
> -               attr->out_mdev[attr->out_count++] = out_priv->mdev;
> +               attr->dests[attr->out_count].rep = rpriv->rep;
> +               attr->dests[attr->out_count++].mdev = out_priv->mdev;
>         }
>
>         err = mlx5_eswitch_add_vlan_action(esw, attr);
> @@ -2468,8 +2468,9 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
>                                           MLX5_FLOW_CONTEXT_ACTION_COUNT;
>                                 out_priv = netdev_priv(out_dev);
>                                 rpriv = out_priv->ppriv;
> -                               attr->out_rep[attr->out_count] = rpriv->rep;
> -                               attr->out_mdev[attr->out_count++] = out_priv->mdev;
> +                               attr->dests[attr->out_count].rep = rpriv->rep;
> +                               attr->dests[attr->out_count].mdev = out_priv->mdev;
> +                               attr->out_count++;

It would be nicer if you can use either of these two patterns consistently.

Either

a[i++] = j;

or

a[i] = j;
i++;

The latter is slightly more readable for me, but I don't have any
preference.

Thanks.

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

* Re: [net-next 08/14] net/mlx5e: Change parse attr struct to accommodate multiple tunnel infos
  2018-12-11 23:24 ` [net-next 08/14] net/mlx5e: Change parse attr struct to accommodate multiple tunnel infos Saeed Mahameed
@ 2018-12-12  0:49   ` Cong Wang
  2018-12-12  1:04     ` Saeed Mahameed
  0 siblings, 1 reply; 22+ messages in thread
From: Cong Wang @ 2018-12-12  0:49 UTC (permalink / raw)
  To: Saeed Mahameed; +Cc: David Miller, Linux Kernel Network Developers, elibr

On Tue, Dec 11, 2018 at 3:28 PM Saeed Mahameed <saeedm@mellanox.com> wrote:
>  struct mlx5e_tc_flow_parse_attr {
> -       struct ip_tunnel_info tun_info;
> +       struct ip_tunnel_info tun_info[MLX5_MAX_FLOW_FWD_VPORTS];
>         struct net_device *filter_dev;
>         struct mlx5_flow_spec spec;
>         int num_mod_hdr_actions;
>         void *mod_hdr_actions;
> -       int mirred_ifindex;
> +       int mirred_ifindex[MLX5_MAX_FLOW_FWD_VPORTS];
>  };

Perhaps 'mirred_ifindexes' (or indices) is more readable here, while you
are on it...

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

* Re: [net-next 08/14] net/mlx5e: Change parse attr struct to accommodate multiple tunnel infos
  2018-12-12  0:49   ` Cong Wang
@ 2018-12-12  1:04     ` Saeed Mahameed
  0 siblings, 0 replies; 22+ messages in thread
From: Saeed Mahameed @ 2018-12-12  1:04 UTC (permalink / raw)
  To: Cong Wang; +Cc: Saeed Mahameed, David S. Miller, Linux Netdev List, elibr

On Tue, Dec 11, 2018 at 4:49 PM Cong Wang <xiyou.wangcong@gmail.com> wrote:
>
> On Tue, Dec 11, 2018 at 3:28 PM Saeed Mahameed <saeedm@mellanox.com> wrote:
> >  struct mlx5e_tc_flow_parse_attr {
> > -       struct ip_tunnel_info tun_info;
> > +       struct ip_tunnel_info tun_info[MLX5_MAX_FLOW_FWD_VPORTS];
> >         struct net_device *filter_dev;
> >         struct mlx5_flow_spec spec;
> >         int num_mod_hdr_actions;
> >         void *mod_hdr_actions;
> > -       int mirred_ifindex;
> > +       int mirred_ifindex[MLX5_MAX_FLOW_FWD_VPORTS];
> >  };
>
> Perhaps 'mirred_ifindexes' (or indices) is more readable here, while you
> are on it...

Hi Cong, I actually prefer array names to reflect single entries:
mirred_ifindex[vport]; is more readable
just like when you give a name to a table column, you don't use the plural form.

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

* Re: [net-next 03/14] net/mlx5e: Refactor eswitch flow attr for destination specific properties
  2018-12-12  0:21   ` Cong Wang
@ 2018-12-12  1:05     ` Saeed Mahameed
  2018-12-12  1:16       ` Saeed Mahameed
  0 siblings, 1 reply; 22+ messages in thread
From: Saeed Mahameed @ 2018-12-12  1:05 UTC (permalink / raw)
  To: Cong Wang; +Cc: Saeed Mahameed, David S. Miller, Linux Netdev List, elibr

On Tue, Dec 11, 2018 at 4:21 PM Cong Wang <xiyou.wangcong@gmail.com> wrote:
>
> On Tue, Dec 11, 2018 at 3:27 PM Saeed Mahameed <saeedm@mellanox.com> wrote:
> > @@ -939,8 +939,8 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
> >                 }
> >                 out_priv = netdev_priv(encap_dev);
> >                 rpriv = out_priv->ppriv;
> > -               attr->out_rep[attr->out_count] = rpriv->rep;
> > -               attr->out_mdev[attr->out_count++] = out_priv->mdev;
> > +               attr->dests[attr->out_count].rep = rpriv->rep;
> > +               attr->dests[attr->out_count++].mdev = out_priv->mdev;
> >         }
> >
> >         err = mlx5_eswitch_add_vlan_action(esw, attr);
> > @@ -2468,8 +2468,9 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
> >                                           MLX5_FLOW_CONTEXT_ACTION_COUNT;
> >                                 out_priv = netdev_priv(out_dev);
> >                                 rpriv = out_priv->ppriv;
> > -                               attr->out_rep[attr->out_count] = rpriv->rep;
> > -                               attr->out_mdev[attr->out_count++] = out_priv->mdev;
> > +                               attr->dests[attr->out_count].rep = rpriv->rep;
> > +                               attr->dests[attr->out_count].mdev = out_priv->mdev;
> > +                               attr->out_count++;
>
> It would be nicer if you can use either of these two patterns consistently.
>
> Either
>
> a[i++] = j;
>
> or
>
> a[i] = j;
> i++;
>
> The latter is slightly more readable for me, but I don't have any
> preference.
>
> Thanks.

Sure, will fix this in V2, thanks Cong.

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

* Re: [net-next 03/14] net/mlx5e: Refactor eswitch flow attr for destination specific properties
  2018-12-12  1:05     ` Saeed Mahameed
@ 2018-12-12  1:16       ` Saeed Mahameed
  0 siblings, 0 replies; 22+ messages in thread
From: Saeed Mahameed @ 2018-12-12  1:16 UTC (permalink / raw)
  To: Cong Wang; +Cc: Saeed Mahameed, David S. Miller, Linux Netdev List, elibr

On Tue, Dec 11, 2018 at 5:05 PM Saeed Mahameed
<saeedm@dev.mellanox.co.il> wrote:
>
> On Tue, Dec 11, 2018 at 4:21 PM Cong Wang <xiyou.wangcong@gmail.com> wrote:
> >
> > On Tue, Dec 11, 2018 at 3:27 PM Saeed Mahameed <saeedm@mellanox.com> wrote:
> > > @@ -939,8 +939,8 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
> > >                 }
> > >                 out_priv = netdev_priv(encap_dev);
> > >                 rpriv = out_priv->ppriv;
> > > -               attr->out_rep[attr->out_count] = rpriv->rep;
> > > -               attr->out_mdev[attr->out_count++] = out_priv->mdev;
> > > +               attr->dests[attr->out_count].rep = rpriv->rep;
> > > +               attr->dests[attr->out_count++].mdev = out_priv->mdev;
> > >         }
> > >
> > >         err = mlx5_eswitch_add_vlan_action(esw, attr);
> > > @@ -2468,8 +2468,9 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
> > >                                           MLX5_FLOW_CONTEXT_ACTION_COUNT;
> > >                                 out_priv = netdev_priv(out_dev);
> > >                                 rpriv = out_priv->ppriv;
> > > -                               attr->out_rep[attr->out_count] = rpriv->rep;
> > > -                               attr->out_mdev[attr->out_count++] = out_priv->mdev;
> > > +                               attr->dests[attr->out_count].rep = rpriv->rep;
> > > +                               attr->dests[attr->out_count].mdev = out_priv->mdev;
> > > +                               attr->out_count++;
> >
> > It would be nicer if you can use either of these two patterns consistently.
> >
> > Either
> >
> > a[i++] = j;
> >
> > or
> >
> > a[i] = j;
> > i++;
> >
> > The latter is slightly more readable for me, but I don't have any
> > preference.
> >
> > Thanks.
>
> Sure, will fix this in V2, thanks Cong.

Actually this is going to be changed in downstream patch:
"net/mlx5e: Support header rewrite actions with remote port mirroring"
To:
+               attr->dests[out_index].rep = rpriv->rep;
+               attr->dests[out_index].mdev = out_priv->mdev;

So no need to change anything here, I will stick to this version.

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

* Re: [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11
  2018-12-11 23:23 [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11 Saeed Mahameed
                   ` (13 preceding siblings ...)
  2018-12-11 23:24 ` [net-next 14/14] net/mlx5e: Use monitor counters for update stats Saeed Mahameed
@ 2018-12-13  1:32 ` Saeed Mahameed
  2018-12-13  6:23   ` David Miller
  14 siblings, 1 reply; 22+ messages in thread
From: Saeed Mahameed @ 2018-12-13  1:32 UTC (permalink / raw)
  To: davem; +Cc: netdev

On Tue, 2018-12-11 at 15:23 -0800, Saeed Mahameed wrote:
> Hi Dave,
> 
> This series includes three updates to mlx5e driver, 
> - Eswitch remote mirroring support.
> - CQE padding for ethernet CQs on PPC.
> - FW monitor counters support.
> 
> For more information please see tag log bleow.
> 
> Please pull and let me know if there's any problem.
> 

Hi Dave, the series status in patchworks is "Changes Requested"
 
but I already addressed Cong's comments, i agree with one of them but
after double checking I found out that the code in question is going to
be changed anyways in downstream patch, so i decided to keep the code
as is in patch #3.

see my last comment:
https://patchwork.ozlabs.org/patch/1011429/
 

> Thanks,
> Saeed.
> 
> ---
> 
> The following changes since commit
> 0bd72117fba2dd51a65eaa7b480adc0eea9a4409:
> 
>   bpf: fix up uapi helper description and sync bpf header with tools
> (2018-12-11 11:06:43 -0800)
> 
> are available in the Git repository at:
> 
>   git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux.git
> tags/mlx5e-updates-2018-12-11
> 
> for you to fetch changes up to
> 5c7e8bbb025726f9cb9b2bc050509a94262426f8:
> 
>   net/mlx5e: Use monitor counters for update stats (2018-12-11
> 14:52:20 -0800)
> 
> ----------------------------------------------------------------
> mlx5e-updates-2018-12-11
> 
> From Eli Britstein,
> Patches 1-10 adds remote mirroring support.
> Patches 1-4 refactor encap related code as pre-steps for using per
> destination encapsulation properties.
> Patches 5-7 use extended destination feature for single/multi
> destination scenarios that have a single encap destination.
> Patches 8-10 enable multiple encap destinations for a TC flow.
> 
> From, Daniel Jurgens,
> Patch 11, Use CQE padding for Ethernet CQs, PPC showed up to a 24%
> improvement in small packet throughput
> 
> From Eyal Davidovich,
> patches 12-14, FW monitor counter support
> FW monitor counters feature came to solve the delayed reporting of
> FW stats in the atomic get_stats64 ndo, since we can't access the
> FW at that stage, this feature will enable immediate FW stats updates
> in the driver via fw events on specific stats updates.
> 
> Patch 12, cleanup to avoid querying a FW counter when it is not
> supported
> Patch 13, Monitor counters FW commands support
> Patch 14, Use monitor counters in ethernet netdevice to update FW
> stats reported in the atomic get_stats64 ndo.
> 
> ----------------------------------------------------------------
> Daniel Jurgens (1):
>       net/mlx5e: Use CQE padding for Ethernet CQs
> 
> Eli Britstein (10):
>       net/mlx5: Consider encapsulation properties when comparing
> destinations
>       net/mlx5: E-Switch, Rename esw attr mirror count field
>       net/mlx5e: Refactor eswitch flow attr for destination specific
> properties
>       net/mlx5e: Move flow attr reformat action bit to per dest flags
>       net/mlx5e: Annul encap action ordering requirement
>       net/mlx5e: Replace the split logic with extended destination
>       net/mlx5e: Support header rewrite actions with remote port
> mirroring
>       net/mlx5e: Change parse attr struct to accommodate multiple
> tunnel infos
>       net/mlx5e: Allow association of a flow to multiple encaps
>       net/mlx5e: Support multiple encapsulations for a TC flow
> 
> Eyal Davidovich (3):
>       net/mlx5e: Avoid query PPCNT register if not supported by the
> device
>       net/mlx5e: Monitor counters commands support
>       net/mlx5e: Use monitor counters for update stats
> 
>  drivers/net/ethernet/mellanox/mlx5/core/Makefile   |   2 +-
>  drivers/net/ethernet/mellanox/mlx5/core/en.h       |   3 +
>  .../ethernet/mellanox/mlx5/core/en/monitor_stats.c | 169
> +++++++++++++++++++
>  .../ethernet/mellanox/mlx5/core/en/monitor_stats.h |  12 ++
>  drivers/net/ethernet/mellanox/mlx5/core/en_main.c  |  16 +-
>  drivers/net/ethernet/mellanox/mlx5/core/en_stats.c |  12 ++
>  drivers/net/ethernet/mellanox/mlx5/core/en_tc.c    | 181
> ++++++++++++++-------
>  drivers/net/ethernet/mellanox/mlx5/core/eswitch.h  |  16 +-
>  .../ethernet/mellanox/mlx5/core/eswitch_offloads.c |  44 +++--
>  drivers/net/ethernet/mellanox/mlx5/core/fs_core.c  |   5 +-
>  drivers/net/ethernet/mellanox/mlx5/core/wq.c       |   3 +-
>  drivers/net/ethernet/mellanox/mlx5/core/wq.h       |   7 +-
>  include/linux/mlx5/cq.h                            |  10 +-
>  include/linux/mlx5/mlx5_ifc.h                      |   4 +-
>  14 files changed, 393 insertions(+), 91 deletions(-)
>  create mode 100644
> drivers/net/ethernet/mellanox/mlx5/core/en/monitor_stats.c
>  create mode 100644
> drivers/net/ethernet/mellanox/mlx5/core/en/monitor_stats.h

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

* Re: [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11
  2018-12-13  1:32 ` [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11 Saeed Mahameed
@ 2018-12-13  6:23   ` David Miller
  0 siblings, 0 replies; 22+ messages in thread
From: David Miller @ 2018-12-13  6:23 UTC (permalink / raw)
  To: saeedm; +Cc: netdev

From: Saeed Mahameed <saeedm@mellanox.com>
Date: Thu, 13 Dec 2018 01:32:42 +0000

> On Tue, 2018-12-11 at 15:23 -0800, Saeed Mahameed wrote:
>> Hi Dave,
>> 
>> This series includes three updates to mlx5e driver, 
>> - Eswitch remote mirroring support.
>> - CQE padding for ethernet CQs on PPC.
>> - FW monitor counters support.
>> 
>> For more information please see tag log bleow.
>> 
>> Please pull and let me know if there's any problem.
>> 
> 
> Hi Dave, the series status in patchworks is "Changes Requested"
>  
> but I already addressed Cong's comments, i agree with one of them but
> after double checking I found out that the code in question is going to
> be changed anyways in downstream patch, so i decided to keep the code
> as is in patch #3.
> 
> see my last comment:
> https://patchwork.ozlabs.org/patch/1011429/

I see, thanks for explaining.

Pulled, thanks.

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

end of thread, other threads:[~2018-12-13  6:23 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-12-11 23:23 [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11 Saeed Mahameed
2018-12-11 23:23 ` [net-next 01/14] net/mlx5: Consider encapsulation properties when comparing destinations Saeed Mahameed
2018-12-11 23:23 ` [net-next 02/14] net/mlx5: E-Switch, Rename esw attr mirror count field Saeed Mahameed
2018-12-11 23:23 ` [net-next 03/14] net/mlx5e: Refactor eswitch flow attr for destination specific properties Saeed Mahameed
2018-12-12  0:21   ` Cong Wang
2018-12-12  1:05     ` Saeed Mahameed
2018-12-12  1:16       ` Saeed Mahameed
2018-12-11 23:23 ` [net-next 04/14] net/mlx5e: Move flow attr reformat action bit to per dest flags Saeed Mahameed
2018-12-11 23:24 ` [net-next 05/14] net/mlx5e: Annul encap action ordering requirement Saeed Mahameed
2018-12-11 23:24 ` [net-next 06/14] net/mlx5e: Replace the split logic with extended destination Saeed Mahameed
2018-12-11 23:24 ` [net-next 07/14] net/mlx5e: Support header rewrite actions with remote port mirroring Saeed Mahameed
2018-12-11 23:24 ` [net-next 08/14] net/mlx5e: Change parse attr struct to accommodate multiple tunnel infos Saeed Mahameed
2018-12-12  0:49   ` Cong Wang
2018-12-12  1:04     ` Saeed Mahameed
2018-12-11 23:24 ` [net-next 09/14] net/mlx5e: Allow association of a flow to multiple encaps Saeed Mahameed
2018-12-11 23:24 ` [net-next 10/14] net/mlx5e: Support multiple encapsulations for a TC flow Saeed Mahameed
2018-12-11 23:24 ` [net-next 11/14] net/mlx5e: Use CQE padding for Ethernet CQs Saeed Mahameed
2018-12-11 23:24 ` [net-next 12/14] net/mlx5e: Avoid query PPCNT register if not supported by the device Saeed Mahameed
2018-12-11 23:24 ` [net-next 13/14] net/mlx5e: Monitor counters commands support Saeed Mahameed
2018-12-11 23:24 ` [net-next 14/14] net/mlx5e: Use monitor counters for update stats Saeed Mahameed
2018-12-13  1:32 ` [pull request][net-next 00/14] Mellanox, mlx5e updates 2018-12-11 Saeed Mahameed
2018-12-13  6:23   ` 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.