All of lore.kernel.org
 help / color / mirror / Atom feed
* [patch net-next v3 00/10] net: allow user specify TC action HW stats type
@ 2020-03-06 13:28 Jiri Pirko
  2020-03-06 13:28 ` [patch net-next v3 01/10] flow_offload: Introduce offload of " Jiri Pirko
                   ` (9 more replies)
  0 siblings, 10 replies; 20+ messages in thread
From: Jiri Pirko @ 2020-03-06 13:28 UTC (permalink / raw)
  To: netdev
  Cc: davem, kuba, saeedm, leon, michael.chan, vishal,
	jeffrey.t.kirsher, idosch, aelior, peppe.cavallaro,
	alexandre.torgue, jhs, xiyou.wangcong, pablo, ecree, mlxsw

Currently, when user adds a TC action and the action gets offloaded,
the user expects the HW stats to be counted and included in stats dump.
However, since drivers may implement different types of counting, there
is no way to specify which one the user is interested in.

For example for mlx5, only delayed counters are available as the driver
periodically polls for updated stats.

In case of mlxsw, the counters are queried on dump time. However, the
HW resources for this type of counters is quite limited (couple of
thousands). This limits the amount of supported offloaded filters
significantly. Without counter assigned, the HW is capable to carry
millions of those.

On top of that, mlxsw HW is able to support delayed counters as well in
greater numbers. That is going to be added in a follow-up patch.

This patchset allows user to specify one of the following types of HW
stats for added action:
immediate - queried during dump time
delayed - polled from HW periodically or sent by HW in async manner
disabled - no stats needed

Note that if "hw_stats" option is not passed, user does not care about
the type, just expects any type of stats.

Examples:
$ tc filter add dev enp0s16np28 ingress proto ip handle 1 pref 1 flower skip_sw dst_ip 192.168.1.1 action drop hw_stats disabled
$ tc -s filter show dev enp0s16np28 ingress
filter protocol ip pref 1 flower chain 0 
filter protocol ip pref 1 flower chain 0 handle 0x1 
  eth_type ipv4
  dst_ip 192.168.1.1
  skip_sw
  in_hw in_hw_count 2
        action order 1: gact action drop
         random type none pass val 0
         index 1 ref 1 bind 1 installed 7 sec used 2 sec
        Action statistics:
        Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
        backlog 0b 0p requeues 0
        hw_stats disabled

$ tc filter add dev enp0s16np28 ingress proto ip handle 1 pref 1 flower skip_sw dst_ip 192.168.1.1 action drop hw_stats immediate
$ tc -s filter show dev enp0s16np28 ingress
filter protocol ip pref 1 flower chain 0
filter protocol ip pref 1 flower chain 0 handle 0x1
  eth_type ipv4
  dst_ip 192.168.1.1
  skip_sw
  in_hw in_hw_count 2
        action order 1: gact action drop
         random type none pass val 0
         index 1 ref 1 bind 1 installed 11 sec used 4 sec
        Action statistics:
        Sent 102 bytes 1 pkt (dropped 1, overlimits 0 requeues 0)
        Sent software 0 bytes 0 pkt
        Sent hardware 102 bytes 1 pkt
        backlog 0b 0p requeues 0
        hw_stats immediate

Jiri Pirko (10):
  flow_offload: Introduce offload of HW stats type
  ocelot_flower: use flow_offload_has_one_action() helper
  flow_offload: check for basic action hw stats type
  mlxsw: spectrum_flower: Do not allow mixing HW stats types for actions
  mlxsw: restrict supported HW stats type to "any"
  flow_offload: introduce "immediate" HW stats type and allow it in
    mlxsw
  flow_offload: introduce "delayed" HW stats type and allow it in mlx5
  mlxsw: spectrum_acl: Ask device for rule stats only if counter was
    created
  flow_offload: introduce "disabled" HW stats type and allow it in mlxsw
  sched: act: allow user to specify type of HW stats for a filter

 drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c  |  9 ++-
 .../ethernet/chelsio/cxgb4/cxgb4_tc_flower.c  |  8 ++-
 .../ethernet/chelsio/cxgb4/cxgb4_tc_flower.h  |  3 +-
 .../chelsio/cxgb4/cxgb4_tc_matchall.c         |  3 +-
 .../net/ethernet/marvell/mvpp2/mvpp2_cls.c    |  6 ++
 .../net/ethernet/mellanox/mlx5/core/en_tc.c   | 11 +++
 .../net/ethernet/mellanox/mlxsw/spectrum.h    |  3 +-
 .../ethernet/mellanox/mlxsw/spectrum_acl.c    | 26 ++++---
 .../ethernet/mellanox/mlxsw/spectrum_flower.c | 17 +++--
 drivers/net/ethernet/mscc/ocelot_flower.c     |  6 +-
 .../ethernet/netronome/nfp/flower/action.c    |  4 ++
 .../net/ethernet/qlogic/qede/qede_filter.c    | 10 ++-
 .../net/ethernet/stmicro/stmmac/stmmac_tc.c   |  9 ++-
 include/net/act_api.h                         |  4 ++
 include/net/flow_offload.h                    | 68 +++++++++++++++++++
 include/uapi/linux/pkt_cls.h                  | 22 ++++++
 net/dsa/slave.c                               |  4 ++
 net/sched/act_api.c                           | 36 ++++++++++
 net/sched/cls_api.c                           |  7 ++
 19 files changed, 230 insertions(+), 26 deletions(-)

-- 
2.21.1


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

* [patch net-next v3 01/10] flow_offload: Introduce offload of HW stats type
  2020-03-06 13:28 [patch net-next v3 00/10] net: allow user specify TC action HW stats type Jiri Pirko
@ 2020-03-06 13:28 ` Jiri Pirko
  2020-03-06 19:23   ` Jakub Kicinski
  2020-03-06 13:28 ` [patch net-next v3 02/10] ocelot_flower: use flow_offload_has_one_action() helper Jiri Pirko
                   ` (8 subsequent siblings)
  9 siblings, 1 reply; 20+ messages in thread
From: Jiri Pirko @ 2020-03-06 13:28 UTC (permalink / raw)
  To: netdev
  Cc: davem, kuba, saeedm, leon, michael.chan, vishal,
	jeffrey.t.kirsher, idosch, aelior, peppe.cavallaro,
	alexandre.torgue, jhs, xiyou.wangcong, pablo, ecree, mlxsw

From: Jiri Pirko <jiri@mellanox.com>

Initially, pass "ANY" (struct is zeroed) to the drivers as that is the
current implicit value coming down to flow_offload. Add a bool
indicating that entries have mixed HW stats type.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
v2->v3:
- moved to bitfield
- removed "mixed" bool
v1->v2:
- moved to actions
- add mixed bool
---
 include/net/flow_offload.h | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/include/net/flow_offload.h b/include/net/flow_offload.h
index cd3510ac66b0..3afd270eb135 100644
--- a/include/net/flow_offload.h
+++ b/include/net/flow_offload.h
@@ -154,6 +154,8 @@ enum flow_action_mangle_base {
 	FLOW_ACT_MANGLE_HDR_TYPE_UDP,
 };
 
+#define FLOW_ACTION_HW_STATS_TYPE_ANY 0
+
 typedef void (*action_destr)(void *priv);
 
 struct flow_action_cookie {
@@ -168,6 +170,7 @@ void flow_action_cookie_destroy(struct flow_action_cookie *cookie);
 
 struct flow_action_entry {
 	enum flow_action_id		id;
+	u8 hw_stats_type;
 	action_destr			destructor;
 	void				*destructor_priv;
 	union {
-- 
2.21.1


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

* [patch net-next v3 02/10] ocelot_flower: use flow_offload_has_one_action() helper
  2020-03-06 13:28 [patch net-next v3 00/10] net: allow user specify TC action HW stats type Jiri Pirko
  2020-03-06 13:28 ` [patch net-next v3 01/10] flow_offload: Introduce offload of " Jiri Pirko
@ 2020-03-06 13:28 ` Jiri Pirko
  2020-03-06 13:28 ` [patch net-next v3 03/10] flow_offload: check for basic action hw stats type Jiri Pirko
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 20+ messages in thread
From: Jiri Pirko @ 2020-03-06 13:28 UTC (permalink / raw)
  To: netdev
  Cc: davem, kuba, saeedm, leon, michael.chan, vishal,
	jeffrey.t.kirsher, idosch, aelior, peppe.cavallaro,
	alexandre.torgue, jhs, xiyou.wangcong, pablo, ecree, mlxsw

From: Jiri Pirko <jiri@mellanox.com>

Instead of directly checking number of action entries, use
flow_offload_has_one_action() helper.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Acked-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
v1->v2:
- new patch
---
 drivers/net/ethernet/mscc/ocelot_flower.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/mscc/ocelot_flower.c b/drivers/net/ethernet/mscc/ocelot_flower.c
index 8993dadf063c..8986f209e981 100644
--- a/drivers/net/ethernet/mscc/ocelot_flower.c
+++ b/drivers/net/ethernet/mscc/ocelot_flower.c
@@ -14,7 +14,7 @@ static int ocelot_flower_parse_action(struct flow_cls_offload *f,
 	const struct flow_action_entry *a;
 	int i;
 
-	if (f->rule->action.num_entries != 1)
+	if (!flow_offload_has_one_action(&f->rule->action))
 		return -EOPNOTSUPP;
 
 	flow_action_for_each(i, a, &f->rule->action) {
-- 
2.21.1


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

* [patch net-next v3 03/10] flow_offload: check for basic action hw stats type
  2020-03-06 13:28 [patch net-next v3 00/10] net: allow user specify TC action HW stats type Jiri Pirko
  2020-03-06 13:28 ` [patch net-next v3 01/10] flow_offload: Introduce offload of " Jiri Pirko
  2020-03-06 13:28 ` [patch net-next v3 02/10] ocelot_flower: use flow_offload_has_one_action() helper Jiri Pirko
@ 2020-03-06 13:28 ` Jiri Pirko
  2020-03-06 19:28   ` Jakub Kicinski
  2020-03-06 13:28 ` [patch net-next v3 04/10] mlxsw: spectrum_flower: Do not allow mixing HW stats types for actions Jiri Pirko
                   ` (6 subsequent siblings)
  9 siblings, 1 reply; 20+ messages in thread
From: Jiri Pirko @ 2020-03-06 13:28 UTC (permalink / raw)
  To: netdev
  Cc: davem, kuba, saeedm, leon, michael.chan, vishal,
	jeffrey.t.kirsher, idosch, aelior, peppe.cavallaro,
	alexandre.torgue, jhs, xiyou.wangcong, pablo, ecree, mlxsw

From: Jiri Pirko <jiri@mellanox.com>

Introduce flow_action_basic_hw_stats_types_check() helper and use it
in drivers. That sanitizes the drivers which do not have support
for action HW stats types.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
v2->v3:
- added flow_action_hw_stats_types_check() to pass allowed types
- "mixed" bool got remove, iterate entries in check
- added mlx5 checking instead of separate patches (will be changed by
  later patch to flow_action_hw_stats_types_check()
v1->v2:
- new patch
---
 drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c  |  9 ++-
 .../ethernet/chelsio/cxgb4/cxgb4_tc_flower.c  |  8 ++-
 .../ethernet/chelsio/cxgb4/cxgb4_tc_flower.h  |  3 +-
 .../chelsio/cxgb4/cxgb4_tc_matchall.c         |  3 +-
 .../net/ethernet/marvell/mvpp2/mvpp2_cls.c    |  6 ++
 .../net/ethernet/mellanox/mlx5/core/en_tc.c   |  9 +++
 drivers/net/ethernet/mscc/ocelot_flower.c     |  4 ++
 .../ethernet/netronome/nfp/flower/action.c    |  4 ++
 .../net/ethernet/qlogic/qede/qede_filter.c    | 10 ++-
 .../net/ethernet/stmicro/stmmac/stmmac_tc.c   |  9 ++-
 include/net/flow_offload.h                    | 61 +++++++++++++++++++
 net/dsa/slave.c                               |  4 ++
 12 files changed, 119 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c
index 9bec256b0934..523bf4be43cc 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c
@@ -279,7 +279,8 @@ bnxt_tc_parse_pedit(struct bnxt *bp, struct bnxt_tc_actions *actions,
 
 static int bnxt_tc_parse_actions(struct bnxt *bp,
 				 struct bnxt_tc_actions *actions,
-				 struct flow_action *flow_action)
+				 struct flow_action *flow_action,
+				 struct netlink_ext_ack *extack)
 {
 	/* Used to store the L2 rewrite mask for dmac (6 bytes) followed by
 	 * smac (6 bytes) if rewrite of both is specified, otherwise either
@@ -299,6 +300,9 @@ static int bnxt_tc_parse_actions(struct bnxt *bp,
 		return -EINVAL;
 	}
 
+	if (!flow_action_basic_hw_stats_types_check(flow_action, extack))
+		return -EOPNOTSUPP;
+
 	flow_action_for_each(i, act, flow_action) {
 		switch (act->id) {
 		case FLOW_ACTION_DROP:
@@ -491,7 +495,8 @@ static int bnxt_tc_parse_flow(struct bnxt *bp,
 		flow->tun_mask.tp_src = match.mask->src;
 	}
 
-	return bnxt_tc_parse_actions(bp, &flow->actions, &rule->action);
+	return bnxt_tc_parse_actions(bp, &flow->actions, &rule->action,
+				     tc_flow_cmd->common.extack);
 }
 
 static int bnxt_hwrm_cfa_flow_free(struct bnxt *bp,
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c
index bb5513bdd293..cc46277e98de 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c
@@ -544,7 +544,8 @@ static bool valid_pedit_action(struct net_device *dev,
 }
 
 int cxgb4_validate_flow_actions(struct net_device *dev,
-				struct flow_action *actions)
+				struct flow_action *actions,
+				struct netlink_ext_ack *extack)
 {
 	struct flow_action_entry *act;
 	bool act_redir = false;
@@ -552,6 +553,9 @@ int cxgb4_validate_flow_actions(struct net_device *dev,
 	bool act_vlan = false;
 	int i;
 
+	if (!flow_action_basic_hw_stats_types_check(actions, extack))
+		return -EOPNOTSUPP;
+
 	flow_action_for_each(i, act, actions) {
 		switch (act->id) {
 		case FLOW_ACTION_ACCEPT:
@@ -642,7 +646,7 @@ int cxgb4_tc_flower_replace(struct net_device *dev,
 	struct filter_ctx ctx;
 	int fidx, ret;
 
-	if (cxgb4_validate_flow_actions(dev, &rule->action))
+	if (cxgb4_validate_flow_actions(dev, &rule->action, extack))
 		return -EOPNOTSUPP;
 
 	if (cxgb4_validate_flow_match(dev, cls))
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.h
index e132516e9868..0a30c96b81ff 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.h
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.h
@@ -112,7 +112,8 @@ void cxgb4_process_flow_actions(struct net_device *in,
 				struct flow_action *actions,
 				struct ch_filter_specification *fs);
 int cxgb4_validate_flow_actions(struct net_device *dev,
-				struct flow_action *actions);
+				struct flow_action *actions,
+				struct netlink_ext_ack *extack);
 
 int cxgb4_tc_flower_replace(struct net_device *dev,
 			    struct flow_cls_offload *cls);
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_matchall.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_matchall.c
index 1b7681a4eb32..d80dee4d316d 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_matchall.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_matchall.c
@@ -286,7 +286,8 @@ int cxgb4_tc_matchall_replace(struct net_device *dev,
 		}
 
 		ret = cxgb4_validate_flow_actions(dev,
-						  &cls_matchall->rule->action);
+						  &cls_matchall->rule->action,
+						  extack);
 		if (ret)
 			return ret;
 
diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c
index 35478cba2aa5..0a0c6ec2336c 100644
--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c
+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c
@@ -1082,6 +1082,9 @@ static int mvpp2_port_c2_tcam_rule_add(struct mvpp2_port *port,
 	u8 qh, ql, pmap;
 	int index, ctx;
 
+	if (!flow_action_basic_hw_stats_types_check(&rule->flow->action, NULL))
+		return -EOPNOTSUPP;
+
 	memset(&c2, 0, sizeof(c2));
 
 	index = mvpp2_cls_c2_port_flow_index(port, rule->loc);
@@ -1305,6 +1308,9 @@ static int mvpp2_cls_rfs_parse_rule(struct mvpp2_rfs_rule *rule)
 	struct flow_rule *flow = rule->flow;
 	struct flow_action_entry *act;
 
+	if (!flow_action_basic_hw_stats_types_check(&rule->flow->action, NULL))
+		return -EOPNOTSUPP;
+
 	act = &flow->action.entries[0];
 	if (act->id != FLOW_ACTION_QUEUE && act->id != FLOW_ACTION_DROP)
 		return -EOPNOTSUPP;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
index 4eb2f2392d2d..cfe393cb4026 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
@@ -2878,6 +2878,9 @@ static int parse_tc_nic_actions(struct mlx5e_priv *priv,
 	if (!flow_action_has_entries(flow_action))
 		return -EINVAL;
 
+	if (!flow_action_basic_hw_stats_types_check(flow_action, extack))
+		return -EOPNOTSUPP;
+
 	attr->flow_tag = MLX5_FS_DEFAULT_FLOW_TAG;
 
 	flow_action_for_each(i, act, flow_action) {
@@ -3330,6 +3333,9 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
 	if (!flow_action_has_entries(flow_action))
 		return -EINVAL;
 
+	if (!flow_action_basic_hw_stats_types_check(flow_action, extack))
+		return -EOPNOTSUPP;
+
 	flow_action_for_each(i, act, flow_action) {
 		switch (act->id) {
 		case FLOW_ACTION_DROP:
@@ -4148,6 +4154,9 @@ static int scan_tc_matchall_fdb_actions(struct mlx5e_priv *priv,
 		return -EOPNOTSUPP;
 	}
 
+	if (!flow_action_basic_hw_stats_types_check(flow_action, extack))
+		return -EOPNOTSUPP;
+
 	flow_action_for_each(i, act, flow_action) {
 		switch (act->id) {
 		case FLOW_ACTION_POLICE:
diff --git a/drivers/net/ethernet/mscc/ocelot_flower.c b/drivers/net/ethernet/mscc/ocelot_flower.c
index 8986f209e981..6d84173373c7 100644
--- a/drivers/net/ethernet/mscc/ocelot_flower.c
+++ b/drivers/net/ethernet/mscc/ocelot_flower.c
@@ -17,6 +17,10 @@ static int ocelot_flower_parse_action(struct flow_cls_offload *f,
 	if (!flow_offload_has_one_action(&f->rule->action))
 		return -EOPNOTSUPP;
 
+	if (!flow_action_basic_hw_stats_types_check(&f->rule->action,
+						    f->common.extack))
+		return -EOPNOTSUPP;
+
 	flow_action_for_each(i, a, &f->rule->action) {
 		switch (a->id) {
 		case FLOW_ACTION_DROP:
diff --git a/drivers/net/ethernet/netronome/nfp/flower/action.c b/drivers/net/ethernet/netronome/nfp/flower/action.c
index c06600fb47ff..4aa7346cb040 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/action.c
+++ b/drivers/net/ethernet/netronome/nfp/flower/action.c
@@ -1207,6 +1207,10 @@ int nfp_flower_compile_action(struct nfp_app *app,
 	bool pkt_host = false;
 	u32 csum_updated = 0;
 
+	if (!flow_action_basic_hw_stats_types_check(&flow->rule->action,
+						    extack))
+		return -EOPNOTSUPP;
+
 	memset(nfp_flow->action_data, 0, NFP_FL_MAX_A_SIZ);
 	nfp_flow->meta.act_len = 0;
 	tun_type = NFP_FL_TUNNEL_NONE;
diff --git a/drivers/net/ethernet/qlogic/qede/qede_filter.c b/drivers/net/ethernet/qlogic/qede/qede_filter.c
index d1ce4531d01a..6505f7e2d1db 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_filter.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_filter.c
@@ -1746,7 +1746,8 @@ int qede_get_arfs_filter_count(struct qede_dev *edev)
 }
 
 static int qede_parse_actions(struct qede_dev *edev,
-			      struct flow_action *flow_action)
+			      struct flow_action *flow_action,
+			      struct netlink_ext_ack *extack)
 {
 	const struct flow_action_entry *act;
 	int i;
@@ -1756,6 +1757,9 @@ static int qede_parse_actions(struct qede_dev *edev,
 		return -EINVAL;
 	}
 
+	if (!flow_action_basic_hw_stats_types_check(flow_action, extack))
+		return -EOPNOTSUPP;
+
 	flow_action_for_each(i, act, flow_action) {
 		switch (act->id) {
 		case FLOW_ACTION_DROP:
@@ -1970,7 +1974,7 @@ int qede_add_tc_flower_fltr(struct qede_dev *edev, __be16 proto,
 	}
 
 	/* parse tc actions and get the vf_id */
-	if (qede_parse_actions(edev, &f->rule->action))
+	if (qede_parse_actions(edev, &f->rule->action, f->common.extack))
 		goto unlock;
 
 	if (qede_flow_find_fltr(edev, &t)) {
@@ -2038,7 +2042,7 @@ static int qede_flow_spec_validate(struct qede_dev *edev,
 		return -EINVAL;
 	}
 
-	if (qede_parse_actions(edev, flow_action))
+	if (qede_parse_actions(edev, flow_action, NULL))
 		return -EINVAL;
 
 	return 0;
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c
index 7a01dee2f9a8..a0e6118444b0 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c
@@ -367,7 +367,8 @@ static int tc_setup_cbs(struct stmmac_priv *priv,
 
 static int tc_parse_flow_actions(struct stmmac_priv *priv,
 				 struct flow_action *action,
-				 struct stmmac_flow_entry *entry)
+				 struct stmmac_flow_entry *entry,
+				 struct netlink_ext_ack *extack)
 {
 	struct flow_action_entry *act;
 	int i;
@@ -375,6 +376,9 @@ static int tc_parse_flow_actions(struct stmmac_priv *priv,
 	if (!flow_action_has_entries(action))
 		return -EINVAL;
 
+	if (!flow_action_basic_hw_stats_types_check(action, extack))
+		return -EOPNOTSUPP;
+
 	flow_action_for_each(i, act, action) {
 		switch (act->id) {
 		case FLOW_ACTION_DROP:
@@ -530,7 +534,8 @@ static int tc_add_flow(struct stmmac_priv *priv,
 			return -ENOENT;
 	}
 
-	ret = tc_parse_flow_actions(priv, &rule->action, entry);
+	ret = tc_parse_flow_actions(priv, &rule->action, entry,
+				    cls->common.extack);
 	if (ret)
 		return ret;
 
diff --git a/include/net/flow_offload.h b/include/net/flow_offload.h
index 3afd270eb135..2dc0332a44c3 100644
--- a/include/net/flow_offload.h
+++ b/include/net/flow_offload.h
@@ -3,6 +3,7 @@
 
 #include <linux/kernel.h>
 #include <linux/list.h>
+#include <linux/netlink.h>
 #include <net/flow_dissector.h>
 #include <linux/rhashtable.h>
 
@@ -251,6 +252,66 @@ static inline bool flow_offload_has_one_action(const struct flow_action *action)
 	return action->num_entries == 1;
 }
 
+static inline bool
+flow_action_mixed_hw_stats_types_check(const struct flow_action *action,
+				       struct netlink_ext_ack *extack)
+{
+	const struct flow_action_entry *action_entry;
+	u8 uninitialized_var(last_hw_stats_type);
+	int i;
+
+	if (flow_offload_has_one_action(action))
+		return true;
+
+	for (i = 0; i < action->num_entries; i++) {
+		action_entry = &action->entries[0];
+		if (i && action_entry->hw_stats_type != last_hw_stats_type) {
+			NL_SET_ERR_MSG_MOD(extack, "Mixing HW stats types for actions is not supported");
+			return false;
+		}
+		last_hw_stats_type = action_entry->hw_stats_type;
+	}
+	return true;
+}
+
+static inline const struct flow_action_entry *
+flow_action_first_entry_get(const struct flow_action *action)
+{
+	WARN_ON(!flow_action_has_entries(action));
+	return &action->entries[0];
+}
+
+static inline bool
+flow_action_hw_stats_types_check(const struct flow_action *action,
+				 struct netlink_ext_ack *extack,
+				 u8 allowed_hw_stats_type)
+{
+	const struct flow_action_entry *action_entry;
+
+	if (!flow_action_has_entries(action))
+		return true;
+	if (!flow_action_mixed_hw_stats_types_check(action, extack))
+		return false;
+	action_entry = flow_action_first_entry_get(action);
+	if (!allowed_hw_stats_type &&
+	    action_entry->hw_stats_type != FLOW_ACTION_HW_STATS_TYPE_ANY) {
+		NL_SET_ERR_MSG_MOD(extack, "Driver supports only default HW stats type \"any\"");
+		return false;
+	} else if (allowed_hw_stats_type &&
+		   action_entry->hw_stats_type != allowed_hw_stats_type) {
+		NL_SET_ERR_MSG_MOD(extack, "Driver does not support selected HW stats type");
+		return false;
+	}
+	return true;
+}
+
+static inline bool
+flow_action_basic_hw_stats_types_check(const struct flow_action *action,
+				       struct netlink_ext_ack *extack)
+{
+	return flow_action_hw_stats_types_check(action, extack, 0);
+}
+
 #define flow_action_for_each(__i, __act, __actions)			\
         for (__i = 0, __act = &(__actions)->entries[0]; __i < (__actions)->num_entries; __act = &(__actions)->entries[++__i])
 
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index 79d9b4384d7b..fca9bfa8437e 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -865,6 +865,10 @@ static int dsa_slave_add_cls_matchall(struct net_device *dev,
 	if (!flow_offload_has_one_action(&cls->rule->action))
 		return err;
 
+	if (!flow_action_basic_hw_stats_types_check(&cls->rule->action,
+						    cls->common.extack))
+		return err;
+
 	act = &cls->rule->action.entries[0];
 
 	if (act->id == FLOW_ACTION_MIRRED && protocol == htons(ETH_P_ALL)) {
-- 
2.21.1


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

* [patch net-next v3 04/10] mlxsw: spectrum_flower: Do not allow mixing HW stats types for actions
  2020-03-06 13:28 [patch net-next v3 00/10] net: allow user specify TC action HW stats type Jiri Pirko
                   ` (2 preceding siblings ...)
  2020-03-06 13:28 ` [patch net-next v3 03/10] flow_offload: check for basic action hw stats type Jiri Pirko
@ 2020-03-06 13:28 ` Jiri Pirko
  2020-03-06 13:28 ` [patch net-next v3 05/10] mlxsw: restrict supported HW stats type to "any" Jiri Pirko
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 20+ messages in thread
From: Jiri Pirko @ 2020-03-06 13:28 UTC (permalink / raw)
  To: netdev
  Cc: davem, kuba, saeedm, leon, michael.chan, vishal,
	jeffrey.t.kirsher, idosch, aelior, peppe.cavallaro,
	alexandre.torgue, jhs, xiyou.wangcong, pablo, ecree, mlxsw

From: Jiri Pirko <jiri@mellanox.com>

As there is one set of counters for the whole action chain, forbid to
mix the HW stats types.

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

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
index 0011a71114e3..7435629c9e65 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
@@ -26,6 +26,8 @@ static int mlxsw_sp_flower_parse_actions(struct mlxsw_sp *mlxsw_sp,
 
 	if (!flow_action_has_entries(flow_action))
 		return 0;
+	if (!flow_action_mixed_hw_stats_types_check(flow_action, extack))
+		return -EOPNOTSUPP;
 
 	/* Count action is inserted first */
 	err = mlxsw_sp_acl_rulei_act_count(mlxsw_sp, rulei, extack);
-- 
2.21.1


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

* [patch net-next v3 05/10] mlxsw: restrict supported HW stats type to "any"
  2020-03-06 13:28 [patch net-next v3 00/10] net: allow user specify TC action HW stats type Jiri Pirko
                   ` (3 preceding siblings ...)
  2020-03-06 13:28 ` [patch net-next v3 04/10] mlxsw: spectrum_flower: Do not allow mixing HW stats types for actions Jiri Pirko
@ 2020-03-06 13:28 ` Jiri Pirko
  2020-03-06 13:28 ` [patch net-next v3 06/10] flow_offload: introduce "immediate" HW stats type and allow it in mlxsw Jiri Pirko
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 20+ messages in thread
From: Jiri Pirko @ 2020-03-06 13:28 UTC (permalink / raw)
  To: netdev
  Cc: davem, kuba, saeedm, leon, michael.chan, vishal,
	jeffrey.t.kirsher, idosch, aelior, peppe.cavallaro,
	alexandre.torgue, jhs, xiyou.wangcong, pablo, ecree, mlxsw

From: Jiri Pirko <jiri@mellanox.com>

Currently don't allow actions with any other type to be inserted.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
v2->v3:
- moved to bitfield
v1->v2:
- move the code to the first action processing
---
 .../net/ethernet/mellanox/mlxsw/spectrum_flower.c  | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
index 7435629c9e65..588d374531cc 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
@@ -29,10 +29,16 @@ static int mlxsw_sp_flower_parse_actions(struct mlxsw_sp *mlxsw_sp,
 	if (!flow_action_mixed_hw_stats_types_check(flow_action, extack))
 		return -EOPNOTSUPP;
 
-	/* Count action is inserted first */
-	err = mlxsw_sp_acl_rulei_act_count(mlxsw_sp, rulei, extack);
-	if (err)
-		return err;
+	act = flow_action_first_entry_get(flow_action);
+	if (act->hw_stats_type == FLOW_ACTION_HW_STATS_TYPE_ANY) {
+		/* Count action is inserted first */
+		err = mlxsw_sp_acl_rulei_act_count(mlxsw_sp, rulei, extack);
+		if (err)
+			return err;
+	} else {
+		NL_SET_ERR_MSG_MOD(extack, "Unsupported action HW stats type");
+		return -EOPNOTSUPP;
+	}
 
 	flow_action_for_each(i, act, flow_action) {
 		switch (act->id) {
-- 
2.21.1


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

* [patch net-next v3 06/10] flow_offload: introduce "immediate" HW stats type and allow it in mlxsw
  2020-03-06 13:28 [patch net-next v3 00/10] net: allow user specify TC action HW stats type Jiri Pirko
                   ` (4 preceding siblings ...)
  2020-03-06 13:28 ` [patch net-next v3 05/10] mlxsw: restrict supported HW stats type to "any" Jiri Pirko
@ 2020-03-06 13:28 ` Jiri Pirko
  2020-03-06 13:28 ` [patch net-next v3 07/10] flow_offload: introduce "delayed" HW stats type and allow it in mlx5 Jiri Pirko
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 20+ messages in thread
From: Jiri Pirko @ 2020-03-06 13:28 UTC (permalink / raw)
  To: netdev
  Cc: davem, kuba, saeedm, leon, michael.chan, vishal,
	jeffrey.t.kirsher, idosch, aelior, peppe.cavallaro,
	alexandre.torgue, jhs, xiyou.wangcong, pablo, ecree, mlxsw

From: Jiri Pirko <jiri@mellanox.com>

Introduce new type for immediate HW stats and allow the value in
mlxsw offload.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
v2->v3:
- moved to bitfield
v1->v2:
- moved to action
---
 drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c | 3 ++-
 include/net/flow_offload.h                            | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
index 588d374531cc..4bf3ac1cb20d 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
@@ -30,7 +30,8 @@ static int mlxsw_sp_flower_parse_actions(struct mlxsw_sp *mlxsw_sp,
 		return -EOPNOTSUPP;
 
 	act = flow_action_first_entry_get(flow_action);
-	if (act->hw_stats_type == FLOW_ACTION_HW_STATS_TYPE_ANY) {
+	if (act->hw_stats_type == FLOW_ACTION_HW_STATS_TYPE_ANY ||
+	    act->hw_stats_type == FLOW_ACTION_HW_STATS_TYPE_IMMEDIATE) {
 		/* Count action is inserted first */
 		err = mlxsw_sp_acl_rulei_act_count(mlxsw_sp, rulei, extack);
 		if (err)
diff --git a/include/net/flow_offload.h b/include/net/flow_offload.h
index 2dc0332a44c3..e60100f9fa63 100644
--- a/include/net/flow_offload.h
+++ b/include/net/flow_offload.h
@@ -155,7 +155,8 @@ enum flow_action_mangle_base {
 	FLOW_ACT_MANGLE_HDR_TYPE_UDP,
 };
 
-#define FLOW_ACTION_HW_STATS_TYPE_ANY 0
+#define FLOW_ACTION_HW_STATS_TYPE_IMMEDIATE BIT(0)
+#define FLOW_ACTION_HW_STATS_TYPE_ANY FLOW_ACTION_HW_STATS_TYPE_IMMEDIATE
 
 typedef void (*action_destr)(void *priv);
 
-- 
2.21.1


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

* [patch net-next v3 07/10] flow_offload: introduce "delayed" HW stats type and allow it in mlx5
  2020-03-06 13:28 [patch net-next v3 00/10] net: allow user specify TC action HW stats type Jiri Pirko
                   ` (5 preceding siblings ...)
  2020-03-06 13:28 ` [patch net-next v3 06/10] flow_offload: introduce "immediate" HW stats type and allow it in mlxsw Jiri Pirko
@ 2020-03-06 13:28 ` Jiri Pirko
  2020-03-06 13:28 ` [patch net-next v3 08/10] mlxsw: spectrum_acl: Ask device for rule stats only if counter was created Jiri Pirko
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 20+ messages in thread
From: Jiri Pirko @ 2020-03-06 13:28 UTC (permalink / raw)
  To: netdev
  Cc: davem, kuba, saeedm, leon, michael.chan, vishal,
	jeffrey.t.kirsher, idosch, aelior, peppe.cavallaro,
	alexandre.torgue, jhs, xiyou.wangcong, pablo, ecree, mlxsw

From: Jiri Pirko <jiri@mellanox.com>

Introduce new type for delayed HW stats and allow the value in
mlx5 offload.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
v2->v3:
- converted to newly introduced flow_action_hw_stats_types_check()
- moved to bitfield
v1->v2:
- moved to action
- fixed c&p error in patch description
---
 drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 6 ++++--
 include/net/flow_offload.h                      | 4 +++-
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
index cfe393cb4026..cdc63dd59867 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
@@ -2878,7 +2878,8 @@ static int parse_tc_nic_actions(struct mlx5e_priv *priv,
 	if (!flow_action_has_entries(flow_action))
 		return -EINVAL;
 
-	if (!flow_action_basic_hw_stats_types_check(flow_action, extack))
+	if (!flow_action_hw_stats_types_check(flow_action, extack,
+					      FLOW_ACTION_HW_STATS_TYPE_DELAYED))
 		return -EOPNOTSUPP;
 
 	attr->flow_tag = MLX5_FS_DEFAULT_FLOW_TAG;
@@ -3333,7 +3334,8 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
 	if (!flow_action_has_entries(flow_action))
 		return -EINVAL;
 
-	if (!flow_action_basic_hw_stats_types_check(flow_action, extack))
+	if (!flow_action_hw_stats_types_check(flow_action, extack,
+					      FLOW_ACTION_HW_STATS_TYPE_DELAYED))
 		return -EOPNOTSUPP;
 
 	flow_action_for_each(i, act, flow_action) {
diff --git a/include/net/flow_offload.h b/include/net/flow_offload.h
index e60100f9fa63..d597d500a5df 100644
--- a/include/net/flow_offload.h
+++ b/include/net/flow_offload.h
@@ -156,7 +156,9 @@ enum flow_action_mangle_base {
 };
 
 #define FLOW_ACTION_HW_STATS_TYPE_IMMEDIATE BIT(0)
-#define FLOW_ACTION_HW_STATS_TYPE_ANY FLOW_ACTION_HW_STATS_TYPE_IMMEDIATE
+#define FLOW_ACTION_HW_STATS_TYPE_DELAYED BIT(1)
+#define FLOW_ACTION_HW_STATS_TYPE_ANY (FLOW_ACTION_HW_STATS_TYPE_IMMEDIATE | \
+				       FLOW_ACTION_HW_STATS_TYPE_DELAYED)
 
 typedef void (*action_destr)(void *priv);
 
-- 
2.21.1


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

* [patch net-next v3 08/10] mlxsw: spectrum_acl: Ask device for rule stats only if counter was created
  2020-03-06 13:28 [patch net-next v3 00/10] net: allow user specify TC action HW stats type Jiri Pirko
                   ` (6 preceding siblings ...)
  2020-03-06 13:28 ` [patch net-next v3 07/10] flow_offload: introduce "delayed" HW stats type and allow it in mlx5 Jiri Pirko
@ 2020-03-06 13:28 ` Jiri Pirko
  2020-03-06 13:28 ` [patch net-next v3 09/10] flow_offload: introduce "disabled" HW stats type and allow it in mlxsw Jiri Pirko
  2020-03-06 13:28 ` [patch net-next v3 10/10] sched: act: allow user to specify type of HW stats for a filter Jiri Pirko
  9 siblings, 0 replies; 20+ messages in thread
From: Jiri Pirko @ 2020-03-06 13:28 UTC (permalink / raw)
  To: netdev
  Cc: davem, kuba, saeedm, leon, michael.chan, vishal,
	jeffrey.t.kirsher, idosch, aelior, peppe.cavallaro,
	alexandre.torgue, jhs, xiyou.wangcong, pablo, ecree, mlxsw

From: Jiri Pirko <jiri@mellanox.com>

Set a flag in case rule counter was created. Only query the device for
stats of a rule, which has the valid counter assigned.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
v2->v3:
- init current values to 0 in case of disabled counters.
v1->v2:
- new patch
---
 .../net/ethernet/mellanox/mlxsw/spectrum.h    |  3 ++-
 .../ethernet/mellanox/mlxsw/spectrum_acl.c    | 26 ++++++++++++-------
 2 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
index ff61cad74bb0..81801c6fb941 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
@@ -641,7 +641,8 @@ struct mlxsw_sp_acl_rule_info {
 	struct mlxsw_afa_block *act_block;
 	u8 action_created:1,
 	   ingress_bind_blocker:1,
-	   egress_bind_blocker:1;
+	   egress_bind_blocker:1,
+	   counter_valid:1;
 	unsigned int counter_index;
 };
 
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl.c
index 36b264798f04..6f8d5005ff36 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl.c
@@ -642,8 +642,14 @@ int mlxsw_sp_acl_rulei_act_count(struct mlxsw_sp *mlxsw_sp,
 				 struct mlxsw_sp_acl_rule_info *rulei,
 				 struct netlink_ext_ack *extack)
 {
-	return mlxsw_afa_block_append_counter(rulei->act_block,
-					      &rulei->counter_index, extack);
+	int err;
+
+	err = mlxsw_afa_block_append_counter(rulei->act_block,
+					     &rulei->counter_index, extack);
+	if (err)
+		return err;
+	rulei->counter_valid = true;
+	return 0;
 }
 
 int mlxsw_sp_acl_rulei_act_fid_set(struct mlxsw_sp *mlxsw_sp,
@@ -857,16 +863,18 @@ int mlxsw_sp_acl_rule_get_stats(struct mlxsw_sp *mlxsw_sp,
 
 {
 	struct mlxsw_sp_acl_rule_info *rulei;
-	u64 current_packets;
-	u64 current_bytes;
+	u64 current_packets = 0;
+	u64 current_bytes = 0;
 	int err;
 
 	rulei = mlxsw_sp_acl_rule_rulei(rule);
-	err = mlxsw_sp_flow_counter_get(mlxsw_sp, rulei->counter_index,
-					&current_packets, &current_bytes);
-	if (err)
-		return err;
-
+	if (rulei->counter_valid) {
+		err = mlxsw_sp_flow_counter_get(mlxsw_sp, rulei->counter_index,
+						&current_packets,
+						&current_bytes);
+		if (err)
+			return err;
+	}
 	*packets = current_packets - rule->last_packets;
 	*bytes = current_bytes - rule->last_bytes;
 	*last_use = rule->last_used;
-- 
2.21.1


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

* [patch net-next v3 09/10] flow_offload: introduce "disabled" HW stats type and allow it in mlxsw
  2020-03-06 13:28 [patch net-next v3 00/10] net: allow user specify TC action HW stats type Jiri Pirko
                   ` (7 preceding siblings ...)
  2020-03-06 13:28 ` [patch net-next v3 08/10] mlxsw: spectrum_acl: Ask device for rule stats only if counter was created Jiri Pirko
@ 2020-03-06 13:28 ` Jiri Pirko
  2020-03-06 19:31   ` Jakub Kicinski
  2020-03-06 13:28 ` [patch net-next v3 10/10] sched: act: allow user to specify type of HW stats for a filter Jiri Pirko
  9 siblings, 1 reply; 20+ messages in thread
From: Jiri Pirko @ 2020-03-06 13:28 UTC (permalink / raw)
  To: netdev
  Cc: davem, kuba, saeedm, leon, michael.chan, vishal,
	jeffrey.t.kirsher, idosch, aelior, peppe.cavallaro,
	alexandre.torgue, jhs, xiyou.wangcong, pablo, ecree, mlxsw

From: Jiri Pirko <jiri@mellanox.com>

Introduce new type for disabled HW stats and allow the value in
mlxsw offload.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
v2->v3:
- moved to bitfield
v1->v2:
- moved to action
---
 drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c | 2 +-
 include/net/flow_offload.h                            | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
index 4bf3ac1cb20d..88aa554415df 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
@@ -36,7 +36,7 @@ static int mlxsw_sp_flower_parse_actions(struct mlxsw_sp *mlxsw_sp,
 		err = mlxsw_sp_acl_rulei_act_count(mlxsw_sp, rulei, extack);
 		if (err)
 			return err;
-	} else {
+	} else if (act->hw_stats_type != FLOW_ACTION_HW_STATS_TYPE_DISABLED) {
 		NL_SET_ERR_MSG_MOD(extack, "Unsupported action HW stats type");
 		return -EOPNOTSUPP;
 	}
diff --git a/include/net/flow_offload.h b/include/net/flow_offload.h
index d597d500a5df..b700c570f7f1 100644
--- a/include/net/flow_offload.h
+++ b/include/net/flow_offload.h
@@ -159,6 +159,7 @@ enum flow_action_mangle_base {
 #define FLOW_ACTION_HW_STATS_TYPE_DELAYED BIT(1)
 #define FLOW_ACTION_HW_STATS_TYPE_ANY (FLOW_ACTION_HW_STATS_TYPE_IMMEDIATE | \
 				       FLOW_ACTION_HW_STATS_TYPE_DELAYED)
+#define FLOW_ACTION_HW_STATS_TYPE_DISABLED 0
 
 typedef void (*action_destr)(void *priv);
 
-- 
2.21.1


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

* [patch net-next v3 10/10] sched: act: allow user to specify type of HW stats for a filter
  2020-03-06 13:28 [patch net-next v3 00/10] net: allow user specify TC action HW stats type Jiri Pirko
                   ` (8 preceding siblings ...)
  2020-03-06 13:28 ` [patch net-next v3 09/10] flow_offload: introduce "disabled" HW stats type and allow it in mlxsw Jiri Pirko
@ 2020-03-06 13:28 ` Jiri Pirko
  9 siblings, 0 replies; 20+ messages in thread
From: Jiri Pirko @ 2020-03-06 13:28 UTC (permalink / raw)
  To: netdev
  Cc: davem, kuba, saeedm, leon, michael.chan, vishal,
	jeffrey.t.kirsher, idosch, aelior, peppe.cavallaro,
	alexandre.torgue, jhs, xiyou.wangcong, pablo, ecree, mlxsw

From: Jiri Pirko <jiri@mellanox.com>

Currently, user who is adding an action expects HW to report stats,
however it does not have exact expectations about the stats types.
That is aligned with TCA_ACT_HW_STATS_TYPE_ANY.

Allow user to specify the type of HW stats for an action and require it.

Pass the information down to flow_offload layer.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
v2->v3:
- removed "mixed" bool init
- moved to bitfield
- removed "inline"
v1->v2:
- moved the stats attr from cls_flower (filter) to any action
- rebased on top of cookie offload changes
- adjusted the patch description a bit
---
 include/net/act_api.h        |  4 ++++
 include/uapi/linux/pkt_cls.h | 22 ++++++++++++++++++++++
 net/sched/act_api.c          | 36 ++++++++++++++++++++++++++++++++++++
 net/sched/cls_api.c          |  7 +++++++
 4 files changed, 69 insertions(+)

diff --git a/include/net/act_api.h b/include/net/act_api.h
index 71347a90a9d1..41337c7fc728 100644
--- a/include/net/act_api.h
+++ b/include/net/act_api.h
@@ -41,6 +41,7 @@ struct tc_action {
 	struct tc_cookie	__rcu *act_cookie;
 	struct tcf_chain	__rcu *goto_chain;
 	u32			tcfa_flags;
+	u8			hw_stats_type;
 };
 #define tcf_index	common.tcfa_index
 #define tcf_refcnt	common.tcfa_refcnt
@@ -52,6 +53,9 @@ struct tc_action {
 #define tcf_rate_est	common.tcfa_rate_est
 #define tcf_lock	common.tcfa_lock
 
+#define TCA_ACT_HW_STATS_TYPE_ANY (TCA_ACT_HW_STATS_TYPE_IMMEDIATE | \
+				   TCA_ACT_HW_STATS_TYPE_DELAYED)
+
 /* Update lastuse only if needed, to avoid dirtying a cache line.
  * We use a temp variable to avoid fetching jiffies twice.
  */
diff --git a/include/uapi/linux/pkt_cls.h b/include/uapi/linux/pkt_cls.h
index 449a63971451..81cc1a869588 100644
--- a/include/uapi/linux/pkt_cls.h
+++ b/include/uapi/linux/pkt_cls.h
@@ -17,6 +17,7 @@ enum {
 	TCA_ACT_PAD,
 	TCA_ACT_COOKIE,
 	TCA_ACT_FLAGS,
+	TCA_ACT_HW_STATS_TYPE,
 	__TCA_ACT_MAX
 };
 
@@ -24,6 +25,27 @@ enum {
 					 * actions stats.
 					 */
 
+/* tca HW stats type
+ * When user does not pass the attribute, he does not care.
+ * It is the same as if he would pass the attribute with
+ * all supported bits set.
+ * In case no bits are set, user is not interested in getting any HW statistics.
+ */
+#define TCA_ACT_HW_STATS_TYPE_IMMEDIATE (1 << 0) /* Means that in dump, user
+						  * gets the current HW stats
+						  * state from the device
+						  * queried at the dump time.
+						  */
+#define TCA_ACT_HW_STATS_TYPE_DELAYED (1 << 1) /* Means that in dump, user gets
+						* HW stats that might be out
+						* of date for some time, maybe
+						* couple of seconds. This is
+						* the case when driver polls
+						* stats updates periodically
+						* or when it gets async stats update
+						* from the device.
+						*/
+
 #define TCA_ACT_MAX __TCA_ACT_MAX
 #define TCA_OLD_COMPAT (TCA_ACT_MAX+1)
 #define TCA_ACT_MAX_PRIO 32
diff --git a/net/sched/act_api.c b/net/sched/act_api.c
index 8c466a712cda..aa7b737fed2e 100644
--- a/net/sched/act_api.c
+++ b/net/sched/act_api.c
@@ -185,6 +185,7 @@ static size_t tcf_action_shared_attrs_size(const struct tc_action *act)
 	return  nla_total_size(0) /* action number nested */
 		+ nla_total_size(IFNAMSIZ) /* TCA_ACT_KIND */
 		+ cookie_len /* TCA_ACT_COOKIE */
+		+ nla_total_size(sizeof(struct nla_bitfield32)) /* TCA_ACT_HW_STATS_TYPE */
 		+ nla_total_size(0) /* TCA_ACT_STATS nested */
 		+ nla_total_size(sizeof(struct nla_bitfield32)) /* TCA_ACT_FLAGS */
 		/* TCA_STATS_BASIC */
@@ -788,6 +789,17 @@ tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int bind, int ref)
 	}
 	rcu_read_unlock();
 
+	if (a->hw_stats_type != TCA_ACT_HW_STATS_TYPE_ANY) {
+		struct nla_bitfield32 hw_stats_type = {
+			a->hw_stats_type,
+			TCA_ACT_HW_STATS_TYPE_ANY,
+		};
+
+		if (nla_put(skb, TCA_ACT_HW_STATS_TYPE, sizeof(hw_stats_type),
+			    &hw_stats_type))
+			goto nla_put_failure;
+	}
+
 	if (a->tcfa_flags) {
 		struct nla_bitfield32 flags = { a->tcfa_flags,
 						a->tcfa_flags, };
@@ -854,7 +866,23 @@ static struct tc_cookie *nla_memdup_cookie(struct nlattr **tb)
 	return c;
 }
 
+static u8 tcf_action_hw_stats_type_get(struct nlattr *hw_stats_type_attr)
+{
+	struct nla_bitfield32 hw_stats_type_bf;
+
+	/* If the user did not pass the attr, that means he does
+	 * not care about the type. Return "any" in that case
+	 * which is setting on all supported types.
+	 */
+	if (!hw_stats_type_attr)
+		return TCA_ACT_HW_STATS_TYPE_ANY;
+	hw_stats_type_bf = nla_get_bitfield32(hw_stats_type_attr);
+	return hw_stats_type_bf.value;
+}
+
 static const u32 tca_act_flags_allowed = TCA_ACT_FLAGS_NO_PERCPU_STATS;
+static const u32 tca_act_hw_stats_type_allowed = TCA_ACT_HW_STATS_TYPE_ANY;
+
 static const struct nla_policy tcf_action_policy[TCA_ACT_MAX + 1] = {
 	[TCA_ACT_KIND]		= { .type = NLA_STRING },
 	[TCA_ACT_INDEX]		= { .type = NLA_U32 },
@@ -863,6 +891,8 @@ static const struct nla_policy tcf_action_policy[TCA_ACT_MAX + 1] = {
 	[TCA_ACT_OPTIONS]	= { .type = NLA_NESTED },
 	[TCA_ACT_FLAGS]		= { .type = NLA_BITFIELD32,
 				    .validation_data = &tca_act_flags_allowed },
+	[TCA_ACT_HW_STATS_TYPE]	= { .type = NLA_BITFIELD32,
+				    .validation_data = &tca_act_hw_stats_type_allowed },
 };
 
 struct tc_action *tcf_action_init_1(struct net *net, struct tcf_proto *tp,
@@ -871,6 +901,7 @@ struct tc_action *tcf_action_init_1(struct net *net, struct tcf_proto *tp,
 				    bool rtnl_held,
 				    struct netlink_ext_ack *extack)
 {
+	u8 hw_stats_type = TCA_ACT_HW_STATS_TYPE_ANY;
 	struct nla_bitfield32 flags = { 0, 0 };
 	struct tc_action *a;
 	struct tc_action_ops *a_o;
@@ -903,6 +934,8 @@ struct tc_action *tcf_action_init_1(struct net *net, struct tcf_proto *tp,
 				goto err_out;
 			}
 		}
+		hw_stats_type =
+			tcf_action_hw_stats_type_get(tb[TCA_ACT_HW_STATS_TYPE]);
 		if (tb[TCA_ACT_FLAGS])
 			flags = nla_get_bitfield32(tb[TCA_ACT_FLAGS]);
 	} else {
@@ -953,6 +986,9 @@ struct tc_action *tcf_action_init_1(struct net *net, struct tcf_proto *tp,
 	if (!name && tb[TCA_ACT_COOKIE])
 		tcf_set_action_cookie(&a->act_cookie, cookie);
 
+	if (!name)
+		a->hw_stats_type = hw_stats_type;
+
 	/* module count goes up only when brand new policy is created
 	 * if it exists and is only bound to in a_o->init() then
 	 * ACT_P_CREATED is not returned (a zero is).
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c
index 4e766c5ab77a..e91448640a4f 100644
--- a/net/sched/cls_api.c
+++ b/net/sched/cls_api.c
@@ -3464,6 +3464,10 @@ int tc_setup_flow_action(struct flow_action *flow_action,
 	struct tc_action *act;
 	int i, j, k, err = 0;
 
+	BUILD_BUG_ON(TCA_ACT_HW_STATS_TYPE_ANY != FLOW_ACTION_HW_STATS_TYPE_ANY);
+	BUILD_BUG_ON(TCA_ACT_HW_STATS_TYPE_IMMEDIATE != FLOW_ACTION_HW_STATS_TYPE_IMMEDIATE);
+	BUILD_BUG_ON(TCA_ACT_HW_STATS_TYPE_DELAYED != FLOW_ACTION_HW_STATS_TYPE_DELAYED);
+
 	if (!exts)
 		return 0;
 
@@ -3476,6 +3480,9 @@ int tc_setup_flow_action(struct flow_action *flow_action,
 		err = tcf_act_get_cookie(entry, act);
 		if (err)
 			goto err_out_locked;
+
+		entry->hw_stats_type = act->hw_stats_type;
+
 		if (is_tcf_gact_ok(act)) {
 			entry->id = FLOW_ACTION_ACCEPT;
 		} else if (is_tcf_gact_shot(act)) {
-- 
2.21.1


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

* Re: [patch net-next v3 01/10] flow_offload: Introduce offload of HW stats type
  2020-03-06 13:28 ` [patch net-next v3 01/10] flow_offload: Introduce offload of " Jiri Pirko
@ 2020-03-06 19:23   ` Jakub Kicinski
  0 siblings, 0 replies; 20+ messages in thread
From: Jakub Kicinski @ 2020-03-06 19:23 UTC (permalink / raw)
  To: Jiri Pirko
  Cc: netdev, davem, saeedm, leon, michael.chan, vishal,
	jeffrey.t.kirsher, idosch, aelior, peppe.cavallaro,
	alexandre.torgue, jhs, xiyou.wangcong, pablo, ecree, mlxsw

On Fri,  6 Mar 2020 14:28:47 +0100 Jiri Pirko wrote:
> @@ -168,6 +170,7 @@ void flow_action_cookie_destroy(struct flow_action_cookie *cookie);
>  
>  struct flow_action_entry {
>  	enum flow_action_id		id;
> +	u8 hw_stats_type;

nit: breaking with the funky member alignment here?

>  	action_destr			destructor;
>  	void				*destructor_priv;
>  	union {


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

* Re: [patch net-next v3 03/10] flow_offload: check for basic action hw stats type
  2020-03-06 13:28 ` [patch net-next v3 03/10] flow_offload: check for basic action hw stats type Jiri Pirko
@ 2020-03-06 19:28   ` Jakub Kicinski
  2020-03-07  6:59     ` Jiri Pirko
  0 siblings, 1 reply; 20+ messages in thread
From: Jakub Kicinski @ 2020-03-06 19:28 UTC (permalink / raw)
  To: Jiri Pirko
  Cc: netdev, davem, saeedm, leon, michael.chan, vishal,
	jeffrey.t.kirsher, idosch, aelior, peppe.cavallaro,
	alexandre.torgue, jhs, xiyou.wangcong, pablo, ecree, mlxsw

On Fri,  6 Mar 2020 14:28:49 +0100 Jiri Pirko wrote:
> @@ -251,6 +252,66 @@ static inline bool flow_offload_has_one_action(const struct flow_action *action)
>  	return action->num_entries == 1;
>  }
>  
> +static inline bool
> +flow_action_mixed_hw_stats_types_check(const struct flow_action *action,
> +				       struct netlink_ext_ack *extack)
> +{
> +	const struct flow_action_entry *action_entry;
> +	u8 uninitialized_var(last_hw_stats_type);

Perhaps just initialize before the loop to action 0 and start loop 
from 1?

> +	int i;
> +
> +	if (flow_offload_has_one_action(action))
> +		return true;
> +
> +	for (i = 0; i < action->num_entries; i++) {
> +		action_entry = &action->entries[0];

s/0/i/ ?

> +		if (i && action_entry->hw_stats_type != last_hw_stats_type) {
> +			NL_SET_ERR_MSG_MOD(extack, "Mixing HW stats types for actions is not supported");
> +			return false;
> +		}
> +		last_hw_stats_type = action_entry->hw_stats_type;
> +	}
> +	return true;
> +}
> +
> +static inline const struct flow_action_entry *
> +flow_action_first_entry_get(const struct flow_action *action)
> +{
> +	WARN_ON(!flow_action_has_entries(action));
> +	return &action->entries[0];
> +}
> +
> +static inline bool
> +flow_action_hw_stats_types_check(const struct flow_action *action,
> +				 struct netlink_ext_ack *extack,
> +				 u8 allowed_hw_stats_type)
> +{
> +	const struct flow_action_entry *action_entry;
> +
> +	if (!flow_action_has_entries(action))
> +		return true;
> +	if (!flow_action_mixed_hw_stats_types_check(action, extack))
> +		return false;
> +	action_entry = flow_action_first_entry_get(action);
> +	if (!allowed_hw_stats_type &&
> +	    action_entry->hw_stats_type != FLOW_ACTION_HW_STATS_TYPE_ANY) {
> +		NL_SET_ERR_MSG_MOD(extack, "Driver supports only default HW stats type \"any\"");
> +		return false;
> +	} else if (allowed_hw_stats_type &&
> +		   action_entry->hw_stats_type != allowed_hw_stats_type) {

Should this be an logical 'and' if we're doing it the bitfield way?

> +		NL_SET_ERR_MSG_MOD(extack, "Driver does not support selected HW stats type");
> +		return false;
> +	}
> +	return true;
> +}


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

* Re: [patch net-next v3 09/10] flow_offload: introduce "disabled" HW stats type and allow it in mlxsw
  2020-03-06 13:28 ` [patch net-next v3 09/10] flow_offload: introduce "disabled" HW stats type and allow it in mlxsw Jiri Pirko
@ 2020-03-06 19:31   ` Jakub Kicinski
  2020-03-07  6:56     ` Jiri Pirko
  0 siblings, 1 reply; 20+ messages in thread
From: Jakub Kicinski @ 2020-03-06 19:31 UTC (permalink / raw)
  To: Jiri Pirko
  Cc: netdev, davem, saeedm, leon, michael.chan, vishal,
	jeffrey.t.kirsher, idosch, aelior, peppe.cavallaro,
	alexandre.torgue, jhs, xiyou.wangcong, pablo, ecree, mlxsw

On Fri,  6 Mar 2020 14:28:55 +0100 Jiri Pirko wrote:
> From: Jiri Pirko <jiri@mellanox.com>
> 
> Introduce new type for disabled HW stats and allow the value in
> mlxsw offload.
> 
> Signed-off-by: Jiri Pirko <jiri@mellanox.com>
> ---
> v2->v3:
> - moved to bitfield
> v1->v2:
> - moved to action
> ---
>  drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c | 2 +-
>  include/net/flow_offload.h                            | 1 +
>  2 files changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
> index 4bf3ac1cb20d..88aa554415df 100644
> --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
> +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
> @@ -36,7 +36,7 @@ static int mlxsw_sp_flower_parse_actions(struct mlxsw_sp *mlxsw_sp,
>  		err = mlxsw_sp_acl_rulei_act_count(mlxsw_sp, rulei, extack);
>  		if (err)
>  			return err;
> -	} else {
> +	} else if (act->hw_stats_type != FLOW_ACTION_HW_STATS_TYPE_DISABLED) {
>  		NL_SET_ERR_MSG_MOD(extack, "Unsupported action HW stats type");
>  		return -EOPNOTSUPP;
>  	}
> diff --git a/include/net/flow_offload.h b/include/net/flow_offload.h
> index d597d500a5df..b700c570f7f1 100644
> --- a/include/net/flow_offload.h
> +++ b/include/net/flow_offload.h
> @@ -159,6 +159,7 @@ enum flow_action_mangle_base {
>  #define FLOW_ACTION_HW_STATS_TYPE_DELAYED BIT(1)
>  #define FLOW_ACTION_HW_STATS_TYPE_ANY (FLOW_ACTION_HW_STATS_TYPE_IMMEDIATE | \
>  				       FLOW_ACTION_HW_STATS_TYPE_DELAYED)
> +#define FLOW_ACTION_HW_STATS_TYPE_DISABLED 0

Would it fit better for the bitfield if disabled internally is 
BIT(last type + 1)? 

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

* Re: [patch net-next v3 09/10] flow_offload: introduce "disabled" HW stats type and allow it in mlxsw
  2020-03-06 19:31   ` Jakub Kicinski
@ 2020-03-07  6:56     ` Jiri Pirko
  2020-03-09 19:20       ` Jakub Kicinski
  0 siblings, 1 reply; 20+ messages in thread
From: Jiri Pirko @ 2020-03-07  6:56 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: netdev, davem, saeedm, leon, michael.chan, vishal,
	jeffrey.t.kirsher, idosch, aelior, peppe.cavallaro,
	alexandre.torgue, jhs, xiyou.wangcong, pablo, ecree, mlxsw

Fri, Mar 06, 2020 at 08:31:16PM CET, kuba@kernel.org wrote:
>On Fri,  6 Mar 2020 14:28:55 +0100 Jiri Pirko wrote:
>> From: Jiri Pirko <jiri@mellanox.com>
>> 
>> Introduce new type for disabled HW stats and allow the value in
>> mlxsw offload.
>> 
>> Signed-off-by: Jiri Pirko <jiri@mellanox.com>
>> ---
>> v2->v3:
>> - moved to bitfield
>> v1->v2:
>> - moved to action
>> ---
>>  drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c | 2 +-
>>  include/net/flow_offload.h                            | 1 +
>>  2 files changed, 2 insertions(+), 1 deletion(-)
>> 
>> diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
>> index 4bf3ac1cb20d..88aa554415df 100644
>> --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
>> +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
>> @@ -36,7 +36,7 @@ static int mlxsw_sp_flower_parse_actions(struct mlxsw_sp *mlxsw_sp,
>>  		err = mlxsw_sp_acl_rulei_act_count(mlxsw_sp, rulei, extack);
>>  		if (err)
>>  			return err;
>> -	} else {
>> +	} else if (act->hw_stats_type != FLOW_ACTION_HW_STATS_TYPE_DISABLED) {
>>  		NL_SET_ERR_MSG_MOD(extack, "Unsupported action HW stats type");
>>  		return -EOPNOTSUPP;
>>  	}
>> diff --git a/include/net/flow_offload.h b/include/net/flow_offload.h
>> index d597d500a5df..b700c570f7f1 100644
>> --- a/include/net/flow_offload.h
>> +++ b/include/net/flow_offload.h
>> @@ -159,6 +159,7 @@ enum flow_action_mangle_base {
>>  #define FLOW_ACTION_HW_STATS_TYPE_DELAYED BIT(1)
>>  #define FLOW_ACTION_HW_STATS_TYPE_ANY (FLOW_ACTION_HW_STATS_TYPE_IMMEDIATE | \
>>  				       FLOW_ACTION_HW_STATS_TYPE_DELAYED)
>> +#define FLOW_ACTION_HW_STATS_TYPE_DISABLED 0
>
>Would it fit better for the bitfield if disabled internally is 
>BIT(last type + 1)? 

I don't see why. Anyway, if needed, this can be always tweaked.

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

* Re: [patch net-next v3 03/10] flow_offload: check for basic action hw stats type
  2020-03-06 19:28   ` Jakub Kicinski
@ 2020-03-07  6:59     ` Jiri Pirko
  2020-03-09 19:17       ` Jakub Kicinski
  0 siblings, 1 reply; 20+ messages in thread
From: Jiri Pirko @ 2020-03-07  6:59 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: netdev, davem, saeedm, leon, michael.chan, vishal,
	jeffrey.t.kirsher, idosch, aelior, peppe.cavallaro,
	alexandre.torgue, jhs, xiyou.wangcong, pablo, ecree, mlxsw

Fri, Mar 06, 2020 at 08:28:51PM CET, kuba@kernel.org wrote:
>On Fri,  6 Mar 2020 14:28:49 +0100 Jiri Pirko wrote:
>> @@ -251,6 +252,66 @@ static inline bool flow_offload_has_one_action(const struct flow_action *action)
>>  	return action->num_entries == 1;
>>  }
>>  
>> +static inline bool
>> +flow_action_mixed_hw_stats_types_check(const struct flow_action *action,
>> +				       struct netlink_ext_ack *extack)
>> +{
>> +	const struct flow_action_entry *action_entry;
>> +	u8 uninitialized_var(last_hw_stats_type);
>
>Perhaps just initialize before the loop to action 0 and start loop 
>from 1?

Hmm, will check.


>
>> +	int i;
>> +
>> +	if (flow_offload_has_one_action(action))
>> +		return true;
>> +
>> +	for (i = 0; i < action->num_entries; i++) {
>> +		action_entry = &action->entries[0];
>
>s/0/i/ ?

Right, missed this.


>
>> +		if (i && action_entry->hw_stats_type != last_hw_stats_type) {
>> +			NL_SET_ERR_MSG_MOD(extack, "Mixing HW stats types for actions is not supported");
>> +			return false;
>> +		}
>> +		last_hw_stats_type = action_entry->hw_stats_type;
>> +	}
>> +	return true;
>> +}
>> +
>> +static inline const struct flow_action_entry *
>> +flow_action_first_entry_get(const struct flow_action *action)
>> +{
>> +	WARN_ON(!flow_action_has_entries(action));
>> +	return &action->entries[0];
>> +}
>> +
>> +static inline bool
>> +flow_action_hw_stats_types_check(const struct flow_action *action,
>> +				 struct netlink_ext_ack *extack,
>> +				 u8 allowed_hw_stats_type)
>> +{
>> +	const struct flow_action_entry *action_entry;
>> +
>> +	if (!flow_action_has_entries(action))
>> +		return true;
>> +	if (!flow_action_mixed_hw_stats_types_check(action, extack))
>> +		return false;
>> +	action_entry = flow_action_first_entry_get(action);
>> +	if (!allowed_hw_stats_type &&
>> +	    action_entry->hw_stats_type != FLOW_ACTION_HW_STATS_TYPE_ANY) {
>> +		NL_SET_ERR_MSG_MOD(extack, "Driver supports only default HW stats type \"any\"");
>> +		return false;
>> +	} else if (allowed_hw_stats_type &&
>> +		   action_entry->hw_stats_type != allowed_hw_stats_type) {
>
>Should this be an logical 'and' if we're doing it the bitfield way?

No. I driver passes allowed_hw_stats_type != 0, means that allowed_hw_stats_type
should be checked against action_entry->hw_stats_type.
With bitfield, this is a bit awkward, I didn't figure out to do it
better though.

>
>> +		NL_SET_ERR_MSG_MOD(extack, "Driver does not support selected HW stats type");
>> +		return false;
>> +	}
>> +	return true;
>> +}
>

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

* Re: [patch net-next v3 03/10] flow_offload: check for basic action hw stats type
  2020-03-07  6:59     ` Jiri Pirko
@ 2020-03-09 19:17       ` Jakub Kicinski
  2020-03-10 10:13         ` Jiri Pirko
  0 siblings, 1 reply; 20+ messages in thread
From: Jakub Kicinski @ 2020-03-09 19:17 UTC (permalink / raw)
  To: Jiri Pirko
  Cc: netdev, davem, saeedm, leon, michael.chan, vishal,
	jeffrey.t.kirsher, idosch, aelior, peppe.cavallaro,
	alexandre.torgue, jhs, xiyou.wangcong, pablo, ecree, mlxsw

On Sat, 7 Mar 2020 07:59:48 +0100 Jiri Pirko wrote:
> >> +static inline bool
> >> +flow_action_hw_stats_types_check(const struct flow_action *action,
> >> +				 struct netlink_ext_ack *extack,
> >> +				 u8 allowed_hw_stats_type)
> >> +{
> >> +	const struct flow_action_entry *action_entry;
> >> +
> >> +	if (!flow_action_has_entries(action))
> >> +		return true;
> >> +	if (!flow_action_mixed_hw_stats_types_check(action, extack))
> >> +		return false;
> >> +	action_entry = flow_action_first_entry_get(action);
> >> +	if (!allowed_hw_stats_type &&
> >> +	    action_entry->hw_stats_type != FLOW_ACTION_HW_STATS_TYPE_ANY) {
> >> +		NL_SET_ERR_MSG_MOD(extack, "Driver supports only default HW stats type \"any\"");
> >> +		return false;
> >> +	} else if (allowed_hw_stats_type &&
> >> +		   action_entry->hw_stats_type != allowed_hw_stats_type) {  
> >
> >Should this be an logical 'and' if we're doing it the bitfield way?  
> 
> No. I driver passes allowed_hw_stats_type != 0, means that allowed_hw_stats_type
> should be checked against action_entry->hw_stats_type.

Right, the "allowed_hw_stats_type &&" is fine.

> With bitfield, this is a bit awkward, I didn't figure out to do it
> better though.

The bitfield passed from user space means any of the set bits, right?

Condition would be better as:

allowed_hw_stats_type && (allowed_hw_stats_type & entry->hw_stats_type)

Otherwise passing more than one bit will not work well, no?

Driver can pass IMMEDIATE | DELAYED, action has IMMEDIATE, your
condition would reject it.. Same if driver has only one type and user
space asks for any of a few.

Drivers can't do a straight comparisons either, but:

if (act->stats & TYPE1) {
   /* preferred stats type*/
} else if (act->stats & TYPE2) {
   /* also supported, lower prio */
} else if (act->Stats & TYPE3) {
   /* lowest prio */
}

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

* Re: [patch net-next v3 09/10] flow_offload: introduce "disabled" HW stats type and allow it in mlxsw
  2020-03-07  6:56     ` Jiri Pirko
@ 2020-03-09 19:20       ` Jakub Kicinski
  2020-03-10 10:14         ` Jiri Pirko
  0 siblings, 1 reply; 20+ messages in thread
From: Jakub Kicinski @ 2020-03-09 19:20 UTC (permalink / raw)
  To: Jiri Pirko
  Cc: netdev, davem, saeedm, leon, michael.chan, vishal,
	jeffrey.t.kirsher, idosch, aelior, peppe.cavallaro,
	alexandre.torgue, jhs, xiyou.wangcong, pablo, ecree, mlxsw

On Sat, 7 Mar 2020 07:56:37 +0100 Jiri Pirko wrote:
> >Would it fit better for the bitfield if disabled internally is 
> >BIT(last type + 1)?   
> 
> I don't see why. Anyway, if needed, this can be always tweaked.

Because it makes it impossible for drivers to pass to
flow_action_hw_stats_types_check() that they support disabled.

I thought disabled means "must have no stats" but I think you may want
it to mean "no stats needed". Which probably makes more sense, right..

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

* Re: [patch net-next v3 03/10] flow_offload: check for basic action hw stats type
  2020-03-09 19:17       ` Jakub Kicinski
@ 2020-03-10 10:13         ` Jiri Pirko
  0 siblings, 0 replies; 20+ messages in thread
From: Jiri Pirko @ 2020-03-10 10:13 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: netdev, davem, saeedm, leon, michael.chan, vishal,
	jeffrey.t.kirsher, idosch, aelior, peppe.cavallaro,
	alexandre.torgue, jhs, xiyou.wangcong, pablo, ecree, mlxsw

Mon, Mar 09, 2020 at 08:17:22PM CET, kuba@kernel.org wrote:
>On Sat, 7 Mar 2020 07:59:48 +0100 Jiri Pirko wrote:
>> >> +static inline bool
>> >> +flow_action_hw_stats_types_check(const struct flow_action *action,
>> >> +				 struct netlink_ext_ack *extack,
>> >> +				 u8 allowed_hw_stats_type)
>> >> +{
>> >> +	const struct flow_action_entry *action_entry;
>> >> +
>> >> +	if (!flow_action_has_entries(action))
>> >> +		return true;
>> >> +	if (!flow_action_mixed_hw_stats_types_check(action, extack))
>> >> +		return false;
>> >> +	action_entry = flow_action_first_entry_get(action);
>> >> +	if (!allowed_hw_stats_type &&
>> >> +	    action_entry->hw_stats_type != FLOW_ACTION_HW_STATS_TYPE_ANY) {
>> >> +		NL_SET_ERR_MSG_MOD(extack, "Driver supports only default HW stats type \"any\"");
>> >> +		return false;
>> >> +	} else if (allowed_hw_stats_type &&
>> >> +		   action_entry->hw_stats_type != allowed_hw_stats_type) {  
>> >
>> >Should this be an logical 'and' if we're doing it the bitfield way?  
>> 
>> No. I driver passes allowed_hw_stats_type != 0, means that allowed_hw_stats_type
>> should be checked against action_entry->hw_stats_type.
>
>Right, the "allowed_hw_stats_type &&" is fine.
>
>> With bitfield, this is a bit awkward, I didn't figure out to do it
>> better though.
>
>The bitfield passed from user space means any of the set bits, right?
>
>Condition would be better as:
>
>allowed_hw_stats_type && (allowed_hw_stats_type & entry->hw_stats_type)
>
>Otherwise passing more than one bit will not work well, no?
>
>Driver can pass IMMEDIATE | DELAYED, action has IMMEDIATE, your

Yeah, this is something that made more sense for non-bitfield. Basically
this is for simple driver which supports only one type. If the driver
supports more types (like mlxsw), it should not call this function.


>condition would reject it.. Same if driver has only one type and user
>space asks for any of a few.
>
>Drivers can't do a straight comparisons either, but:
>
>if (act->stats & TYPE1) {
>   /* preferred stats type*/
>} else if (act->stats & TYPE2) {
>   /* also supported, lower prio */
>} else if (act->Stats & TYPE3) {
>   /* lowest prio */
>}

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

* Re: [patch net-next v3 09/10] flow_offload: introduce "disabled" HW stats type and allow it in mlxsw
  2020-03-09 19:20       ` Jakub Kicinski
@ 2020-03-10 10:14         ` Jiri Pirko
  0 siblings, 0 replies; 20+ messages in thread
From: Jiri Pirko @ 2020-03-10 10:14 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: netdev, davem, saeedm, leon, michael.chan, vishal,
	jeffrey.t.kirsher, idosch, aelior, peppe.cavallaro,
	alexandre.torgue, jhs, xiyou.wangcong, pablo, ecree, mlxsw

Mon, Mar 09, 2020 at 08:20:14PM CET, kuba@kernel.org wrote:
>On Sat, 7 Mar 2020 07:56:37 +0100 Jiri Pirko wrote:
>> >Would it fit better for the bitfield if disabled internally is 
>> >BIT(last type + 1)?   
>> 
>> I don't see why. Anyway, if needed, this can be always tweaked.
>
>Because it makes it impossible for drivers to pass to
>flow_action_hw_stats_types_check() that they support disabled.

Right, they should not call flow_action_hw_stats_types_check()


>
>I thought disabled means "must have no stats" but I think you may want
>it to mean "no stats needed". Which probably makes more sense, right..

Nope, means "must have no stats"


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

end of thread, other threads:[~2020-03-10 10:14 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-06 13:28 [patch net-next v3 00/10] net: allow user specify TC action HW stats type Jiri Pirko
2020-03-06 13:28 ` [patch net-next v3 01/10] flow_offload: Introduce offload of " Jiri Pirko
2020-03-06 19:23   ` Jakub Kicinski
2020-03-06 13:28 ` [patch net-next v3 02/10] ocelot_flower: use flow_offload_has_one_action() helper Jiri Pirko
2020-03-06 13:28 ` [patch net-next v3 03/10] flow_offload: check for basic action hw stats type Jiri Pirko
2020-03-06 19:28   ` Jakub Kicinski
2020-03-07  6:59     ` Jiri Pirko
2020-03-09 19:17       ` Jakub Kicinski
2020-03-10 10:13         ` Jiri Pirko
2020-03-06 13:28 ` [patch net-next v3 04/10] mlxsw: spectrum_flower: Do not allow mixing HW stats types for actions Jiri Pirko
2020-03-06 13:28 ` [patch net-next v3 05/10] mlxsw: restrict supported HW stats type to "any" Jiri Pirko
2020-03-06 13:28 ` [patch net-next v3 06/10] flow_offload: introduce "immediate" HW stats type and allow it in mlxsw Jiri Pirko
2020-03-06 13:28 ` [patch net-next v3 07/10] flow_offload: introduce "delayed" HW stats type and allow it in mlx5 Jiri Pirko
2020-03-06 13:28 ` [patch net-next v3 08/10] mlxsw: spectrum_acl: Ask device for rule stats only if counter was created Jiri Pirko
2020-03-06 13:28 ` [patch net-next v3 09/10] flow_offload: introduce "disabled" HW stats type and allow it in mlxsw Jiri Pirko
2020-03-06 19:31   ` Jakub Kicinski
2020-03-07  6:56     ` Jiri Pirko
2020-03-09 19:20       ` Jakub Kicinski
2020-03-10 10:14         ` Jiri Pirko
2020-03-06 13:28 ` [patch net-next v3 10/10] sched: act: allow user to specify type of HW stats for a filter Jiri Pirko

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