Commit 3b1903ef authored by Pablo Neira Ayuso's avatar Pablo Neira Ayuso Committed by David S. Miller

flow_offload: add statistics retrieval infrastructure and use it

This patch provides the flow_stats structure that acts as container for
tc_cls_flower_offload, then we can use to restore the statistics on the
existing TC actions. Hence, tcf_exts_stats_update() is not used from
drivers anymore.
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3a7b6861
...@@ -1396,7 +1396,7 @@ static int bnxt_tc_get_flow_stats(struct bnxt *bp, ...@@ -1396,7 +1396,7 @@ static int bnxt_tc_get_flow_stats(struct bnxt *bp,
lastused = flow->lastused; lastused = flow->lastused;
spin_unlock(&flow->stats_lock); spin_unlock(&flow->stats_lock);
tcf_exts_stats_update(tc_flow_cmd->exts, stats.bytes, stats.packets, flow_stats_update(&tc_flow_cmd->stats, stats.bytes, stats.packets,
lastused); lastused);
return 0; return 0;
} }
......
...@@ -807,7 +807,7 @@ int cxgb4_tc_flower_stats(struct net_device *dev, ...@@ -807,7 +807,7 @@ int cxgb4_tc_flower_stats(struct net_device *dev,
if (ofld_stats->packet_count != packets) { if (ofld_stats->packet_count != packets) {
if (ofld_stats->prev_packet_count != packets) if (ofld_stats->prev_packet_count != packets)
ofld_stats->last_used = jiffies; ofld_stats->last_used = jiffies;
tcf_exts_stats_update(cls->exts, bytes - ofld_stats->byte_count, flow_stats_update(&cls->stats, bytes - ofld_stats->byte_count,
packets - ofld_stats->packet_count, packets - ofld_stats->packet_count,
ofld_stats->last_used); ofld_stats->last_used);
......
...@@ -3071,7 +3071,7 @@ int mlx5e_stats_flower(struct net_device *dev, struct mlx5e_priv *priv, ...@@ -3071,7 +3071,7 @@ int mlx5e_stats_flower(struct net_device *dev, struct mlx5e_priv *priv,
mlx5_devcom_release_peer_data(devcom, MLX5_DEVCOM_ESW_OFFLOADS); mlx5_devcom_release_peer_data(devcom, MLX5_DEVCOM_ESW_OFFLOADS);
out: out:
tcf_exts_stats_update(f->exts, bytes, packets, lastuse); flow_stats_update(&f->stats, bytes, packets, lastuse);
return 0; return 0;
} }
......
...@@ -460,7 +460,7 @@ int mlxsw_sp_flower_stats(struct mlxsw_sp *mlxsw_sp, ...@@ -460,7 +460,7 @@ int mlxsw_sp_flower_stats(struct mlxsw_sp *mlxsw_sp,
if (err) if (err)
goto err_rule_get_stats; goto err_rule_get_stats;
tcf_exts_stats_update(f->exts, bytes, packets, lastuse); flow_stats_update(&f->stats, bytes, packets, lastuse);
mlxsw_sp_acl_ruleset_put(mlxsw_sp, ruleset); mlxsw_sp_acl_ruleset_put(mlxsw_sp, ruleset);
return 0; return 0;
......
...@@ -554,9 +554,8 @@ nfp_flower_get_stats(struct nfp_app *app, struct net_device *netdev, ...@@ -554,9 +554,8 @@ nfp_flower_get_stats(struct nfp_app *app, struct net_device *netdev,
ctx_id = be32_to_cpu(nfp_flow->meta.host_ctx_id); ctx_id = be32_to_cpu(nfp_flow->meta.host_ctx_id);
spin_lock_bh(&priv->stats_lock); spin_lock_bh(&priv->stats_lock);
tcf_exts_stats_update(flow->exts, priv->stats[ctx_id].bytes, flow_stats_update(&flow->stats, priv->stats[ctx_id].bytes,
priv->stats[ctx_id].pkts, priv->stats[ctx_id].pkts, priv->stats[ctx_id].used);
priv->stats[ctx_id].used);
priv->stats[ctx_id].pkts = 0; priv->stats[ctx_id].pkts = 0;
priv->stats[ctx_id].bytes = 0; priv->stats[ctx_id].bytes = 0;
......
...@@ -179,4 +179,18 @@ static inline bool flow_rule_match_key(const struct flow_rule *rule, ...@@ -179,4 +179,18 @@ static inline bool flow_rule_match_key(const struct flow_rule *rule,
return dissector_uses_key(rule->match.dissector, key); return dissector_uses_key(rule->match.dissector, key);
} }
struct flow_stats {
u64 pkts;
u64 bytes;
u64 lastused;
};
static inline void flow_stats_update(struct flow_stats *flow_stats,
u64 bytes, u64 pkts, u64 lastused)
{
flow_stats->pkts = pkts;
flow_stats->bytes = bytes;
flow_stats->lastused = lastused;
}
#endif /* _NET_FLOW_OFFLOAD_H */ #endif /* _NET_FLOW_OFFLOAD_H */
...@@ -765,6 +765,7 @@ struct tc_cls_flower_offload { ...@@ -765,6 +765,7 @@ struct tc_cls_flower_offload {
enum tc_fl_command command; enum tc_fl_command command;
unsigned long cookie; unsigned long cookie;
struct flow_rule *rule; struct flow_rule *rule;
struct flow_stats stats;
struct tcf_exts *exts; struct tcf_exts *exts;
u32 classid; u32 classid;
}; };
......
...@@ -429,6 +429,10 @@ static void fl_hw_update_stats(struct tcf_proto *tp, struct cls_fl_filter *f) ...@@ -429,6 +429,10 @@ static void fl_hw_update_stats(struct tcf_proto *tp, struct cls_fl_filter *f)
cls_flower.classid = f->res.classid; cls_flower.classid = f->res.classid;
tc_setup_cb_call(block, TC_SETUP_CLSFLOWER, &cls_flower, false); tc_setup_cb_call(block, TC_SETUP_CLSFLOWER, &cls_flower, false);
tcf_exts_stats_update(&f->exts, cls_flower.stats.bytes,
cls_flower.stats.pkts,
cls_flower.stats.lastused);
} }
static bool __fl_delete(struct tcf_proto *tp, struct cls_fl_filter *f, static bool __fl_delete(struct tcf_proto *tp, struct cls_fl_filter *f,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment