Skip to content

Commit

Permalink
net: sched: modify stats helper functions to support regular stats
Browse files Browse the repository at this point in the history
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: Vlad Buslov <vladbu@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Vlad Buslov authored and David S. Miller committed Oct 31, 2019
1 parent ef816f3 commit 5e174d5
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 14 deletions.
30 changes: 21 additions & 9 deletions include/net/act_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
struct sk_buff *skb)
{
bstats_cpu_update(this_cpu_ptr(a->cpu_bstats), skb);
}

static inline struct gnet_stats_queue *
tcf_action_get_qstats(struct tc_action *a)
{
return this_cpu_ptr(a->cpu_qstats);
if (likely(a->cpu_bstats)) {
bstats_cpu_update(this_cpu_ptr(a->cpu_bstats), skb);
return;
}
spin_lock(&a->tcfa_lock);
bstats_update(&a->tcfa_bstats, skb);
spin_unlock(&a->tcfa_lock);
}

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)
{
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,
Expand Down
19 changes: 14 additions & 5 deletions net/sched/act_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
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)
this_cpu_ptr(a->cpu_qstats)->drops += packets;
if (drop)
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)
_bstats_cpu_update(this_cpu_ptr(a->cpu_bstats_hw),
bytes, packets);
_bstats_update(&a->tcfa_bstats_hw, bytes, packets);
}
EXPORT_SYMBOL(tcf_action_update_stats);

Expand Down

0 comments on commit 5e174d5

Please sign in to comment.