Commit 10be959b authored by Thomas Graf's avatar Thomas Graf Committed by David S. Miller

[PKT_SCHED]: tcf_action: copy generic stats via TCA_ACT_STATS

Dumps the statistic common to all action modules via the newly
introduced TLV type TCA_ACT_STATS in tcf_action_copy_stats but
allows the corresponding module to dump its own statistic by
implementing the get_stats callback.
Signed-off-by: default avatarThomas Graf <tgraf@suug.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 59c1b207
......@@ -699,6 +699,7 @@ enum
TCA_RATE,
TCA_FCNT,
TCA_STATS2,
TCA_ACT_STATS,
__TCA_MAX
};
......
......@@ -44,10 +44,16 @@ struct tcf_##name *next; \
u32 capab; \
int action; \
struct tcf_t tm; \
struct tc_stats stats; \
struct gnet_stats_basic bstats; \
struct gnet_stats_queue qstats; \
struct gnet_stats_rate_est rate_est; \
spinlock_t *stats_lock; \
spinlock_t lock
struct tcf_act_hdr
{
tca_gen(act_hdr);
};
struct tc_action
{
......
......@@ -60,7 +60,7 @@ tcf_hash_destroy(struct tcf_st *p)
*p1p = p->next;
write_unlock_bh(&tcf_t_lock);
#ifdef CONFIG_NET_ESTIMATOR
qdisc_kill_estimator(&p->stats);
gen_kill_estimator(&p->bstats, &p->rate_est);
#endif
kfree(p);
return;
......@@ -256,9 +256,8 @@ tcf_hash_create(struct tc_st *parm, struct rtattr *est, struct tc_action *a, int
p->tm.install = jiffies;
p->tm.lastuse = jiffies;
#ifdef CONFIG_NET_ESTIMATOR
if (est) {
qdisc_new_estimator(&p->stats, p->stats_lock, est);
}
if (est)
gen_new_estimator(&p->bstats, &p->rate_est, p->stats_lock, est);
#endif
h = tcf_hash(p->index);
write_lock_bh(&tcf_t_lock);
......
......@@ -416,14 +416,37 @@ int tcf_action_init(struct rtattr *rta, struct rtattr *est, struct tc_action *a,
int tcf_action_copy_stats (struct sk_buff *skb,struct tc_action *a)
{
struct gnet_dump d;
struct tcf_act_hdr *h = a->priv;
#ifdef CONFIG_KMOD
/* place holder */
#endif
if (NULL == a->ops || NULL == a->ops->get_stats)
return 1;
if (NULL == h)
goto errout;
if (gnet_stats_start_copy(skb, TCA_ACT_STATS, h->stats_lock, &d) < 0)
goto errout;
if (NULL != a->ops && NULL != a->ops->get_stats)
if (a->ops->get_stats(skb, a) < 0)
goto errout;
if (gnet_stats_copy_basic(&d, &h->bstats) < 0 ||
#ifdef CONFIG_NET_ESTIMATOR
gnet_stats_copy_rate_est(&d, &h->rate_est) < 0 ||
#endif
gnet_stats_copy_queue(&d, &h->qstats) < 0)
goto errout;
return a->ops->get_stats(skb,a);
if (gnet_stats_finish_copy(&d) < 0)
goto errout;
return 0;
errout:
return -1;
}
......
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