Commit 5e174d5e authored by Vlad Buslov's avatar Vlad Buslov Committed by David S. Miller

net: sched: modify stats helper functions to support regular stats

Modify stats update helper functions introduced in previous patches in this
series to fallback to regular tc_action->tcfa_{b|q}stats if cpu stats are
not allocated for the action argument. If regular non-percpu allocated
counters are in use, then obtain action tcfa_lock while modifying them.
Signed-off-by: default avatarVlad Buslov <vladbu@mellanox.com>
Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ef816f3c
...@@ -190,23 +190,35 @@ int tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int, int); ...@@ -190,23 +190,35 @@ int tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int, int);
static inline void tcf_action_update_bstats(struct tc_action *a, static inline void tcf_action_update_bstats(struct tc_action *a,
struct sk_buff *skb) struct sk_buff *skb)
{ {
bstats_cpu_update(this_cpu_ptr(a->cpu_bstats), skb); if (likely(a->cpu_bstats)) {
} bstats_cpu_update(this_cpu_ptr(a->cpu_bstats), skb);
return;
static inline struct gnet_stats_queue * }
tcf_action_get_qstats(struct tc_action *a) spin_lock(&a->tcfa_lock);
{ bstats_update(&a->tcfa_bstats, skb);
return this_cpu_ptr(a->cpu_qstats); spin_unlock(&a->tcfa_lock);
} }
static inline void tcf_action_inc_drop_qstats(struct tc_action *a) static inline void tcf_action_inc_drop_qstats(struct tc_action *a)
{ {
qstats_drop_inc(this_cpu_ptr(a->cpu_qstats)); if (likely(a->cpu_qstats)) {
qstats_drop_inc(this_cpu_ptr(a->cpu_qstats));
return;
}
spin_lock(&a->tcfa_lock);
qstats_drop_inc(&a->tcfa_qstats);
spin_unlock(&a->tcfa_lock);
} }
static inline void tcf_action_inc_overlimit_qstats(struct tc_action *a) static inline void tcf_action_inc_overlimit_qstats(struct tc_action *a)
{ {
qstats_overlimit_inc(this_cpu_ptr(a->cpu_qstats)); if (likely(a->cpu_qstats)) {
qstats_overlimit_inc(this_cpu_ptr(a->cpu_qstats));
return;
}
spin_lock(&a->tcfa_lock);
qstats_overlimit_inc(&a->tcfa_qstats);
spin_unlock(&a->tcfa_lock);
} }
void tcf_action_update_stats(struct tc_action *a, u64 bytes, u32 packets, void tcf_action_update_stats(struct tc_action *a, u64 bytes, u32 packets,
......
...@@ -992,14 +992,23 @@ int tcf_action_init(struct net *net, struct tcf_proto *tp, struct nlattr *nla, ...@@ -992,14 +992,23 @@ int tcf_action_init(struct net *net, struct tcf_proto *tp, struct nlattr *nla,
void tcf_action_update_stats(struct tc_action *a, u64 bytes, u32 packets, void tcf_action_update_stats(struct tc_action *a, u64 bytes, u32 packets,
bool drop, bool hw) bool drop, bool hw)
{ {
_bstats_cpu_update(this_cpu_ptr(a->cpu_bstats), bytes, packets); if (a->cpu_bstats) {
_bstats_cpu_update(this_cpu_ptr(a->cpu_bstats), bytes, packets);
if (drop) if (drop)
this_cpu_ptr(a->cpu_qstats)->drops += packets; this_cpu_ptr(a->cpu_qstats)->drops += packets;
if (hw)
_bstats_cpu_update(this_cpu_ptr(a->cpu_bstats_hw),
bytes, packets);
return;
}
_bstats_update(&a->tcfa_bstats, bytes, packets);
if (drop)
a->tcfa_qstats.drops += packets;
if (hw) if (hw)
_bstats_cpu_update(this_cpu_ptr(a->cpu_bstats_hw), _bstats_update(&a->tcfa_bstats_hw, bytes, packets);
bytes, packets);
} }
EXPORT_SYMBOL(tcf_action_update_stats); EXPORT_SYMBOL(tcf_action_update_stats);
......
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