sched: add helper for updating statistics on all actions
authorJakub Kicinski <jakub.kicinski@netronome.com>
Wed, 31 May 2017 15:06:43 +0000 (08:06 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 31 May 2017 21:58:13 +0000 (17:58 -0400)
Forgetting to disable preemption around tcf_action_stats_update()
seems to be a common mistake.  Add a helper function for updating
stats on all actions of a filter.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
drivers/net/ethernet/netronome/nfp/nfp_net_offload.c
include/net/pkt_cls.h

index d2f90ba..7914a32 100644 (file)
@@ -1863,9 +1863,7 @@ int mlx5e_stats_flower(struct mlx5e_priv *priv,
 {
        struct mlx5e_tc_table *tc = &priv->fs.tc;
        struct mlx5e_tc_flow *flow;
-       struct tc_action *a;
        struct mlx5_fc *counter;
-       LIST_HEAD(actions);
        u64 bytes;
        u64 packets;
        u64 lastuse;
@@ -1884,13 +1882,7 @@ int mlx5e_stats_flower(struct mlx5e_priv *priv,
 
        mlx5_fc_query_cached(counter, &bytes, &packets, &lastuse);
 
-       preempt_disable();
-
-       tcf_exts_to_list(f->exts, &actions);
-       list_for_each_entry(a, &actions, list)
-               tcf_action_stats_update(a, bytes, packets, lastuse);
-
-       preempt_enable();
+       tcf_exts_stats_update(f->exts, bytes, packets, lastuse);
 
        return 0;
 }
index ed75c6a..13af8e3 100644 (file)
@@ -397,8 +397,6 @@ int mlxsw_sp_flower_stats(struct mlxsw_sp_port *mlxsw_sp_port, bool ingress,
        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
        struct mlxsw_sp_acl_ruleset *ruleset;
        struct mlxsw_sp_acl_rule *rule;
-       struct tc_action *a;
-       LIST_HEAD(actions);
        u64 packets;
        u64 lastuse;
        u64 bytes;
@@ -419,13 +417,7 @@ int mlxsw_sp_flower_stats(struct mlxsw_sp_port *mlxsw_sp_port, bool ingress,
        if (err)
                goto err_rule_get_stats;
 
-       preempt_disable();
-
-       tcf_exts_to_list(f->exts, &actions);
-       list_for_each_entry(a, &actions, list)
-               tcf_action_stats_update(a, bytes, packets, lastuse);
-
-       preempt_enable();
+       tcf_exts_stats_update(f->exts, bytes, packets, lastuse);
 
        mlxsw_sp_acl_ruleset_put(mlxsw_sp, ruleset);
        return 0;
index cc823df..2fa7b67 100644 (file)
@@ -84,8 +84,6 @@ static void nfp_net_bpf_stats_reset(struct nfp_net *nn)
 static int
 nfp_net_bpf_stats_update(struct nfp_net *nn, struct tc_cls_bpf_offload *cls_bpf)
 {
-       struct tc_action *a;
-       LIST_HEAD(actions);
        u64 bytes, pkts;
 
        pkts = nn->rx_filter.pkts - nn->rx_filter_prev.pkts;
@@ -94,13 +92,8 @@ nfp_net_bpf_stats_update(struct nfp_net *nn, struct tc_cls_bpf_offload *cls_bpf)
 
        nn->rx_filter_prev = nn->rx_filter;
 
-       preempt_disable();
-
-       tcf_exts_to_list(cls_bpf->exts, &actions);
-       list_for_each_entry(a, &actions, list)
-               tcf_action_stats_update(a, bytes, pkts, nn->rx_filter_change);
-
-       preempt_enable();
+       tcf_exts_stats_update(cls_bpf->exts,
+                             bytes, pkts, nn->rx_filter_change);
 
        return 0;
 }
index f776229..537d0a0 100644 (file)
@@ -157,6 +157,25 @@ static inline void tcf_exts_to_list(const struct tcf_exts *exts,
 #endif
 }
 
+static inline void
+tcf_exts_stats_update(const struct tcf_exts *exts,
+                     u64 bytes, u64 packets, u64 lastuse)
+{
+#ifdef CONFIG_NET_CLS_ACT
+       int i;
+
+       preempt_disable();
+
+       for (i = 0; i < exts->nr_actions; i++) {
+               struct tc_action *a = exts->actions[i];
+
+               tcf_action_stats_update(a, bytes, packets, lastuse);
+       }
+
+       preempt_enable();
+#endif
+}
+
 /**
  * tcf_exts_exec - execute tc filter extensions
  * @skb: socket buffer