Skip to content

Commit

Permalink
Add cake-specific class stats
Browse files Browse the repository at this point in the history
  • Loading branch information
tohojo committed Jul 14, 2018
1 parent 483399d commit be1c549
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 3 deletions.
6 changes: 6 additions & 0 deletions pkt_sched.h
Expand Up @@ -894,6 +894,12 @@ enum {
TCA_CAKE_STATS_MIN_ADJLEN,
TCA_CAKE_STATS_MAX_ADJLEN,
TCA_CAKE_STATS_TIN_STATS,
TCA_CAKE_STATS_DEFICIT,
TCA_CAKE_STATS_COBALT_COUNT,
TCA_CAKE_STATS_DROPPING,
TCA_CAKE_STATS_DROP_NEXT_US,
TCA_CAKE_STATS_P_DROP,
TCA_CAKE_STATS_BLUE_TIMER_US,
__TCA_CAKE_STATS_MAX
};
#define TCA_CAKE_STATS_MAX (__TCA_CAKE_STATS_MAX - 1)
Expand Down
49 changes: 46 additions & 3 deletions sch_cake.c
Expand Up @@ -2999,13 +2999,15 @@ static int cake_dump_class_stats(struct Qdisc *sch, unsigned long cl,
struct gnet_dump *d)
{
struct cake_sched_data *q = qdisc_priv(sch);
const struct cake_tin_data *b = NULL;
const struct cake_flow *flow = NULL;
struct gnet_stats_queue qs = { 0 };
struct nlattr *stats;
u32 idx = cl - 1;

if (idx < CAKE_QUEUES * q->tin_cnt) {
struct cake_tin_data *b = \
&q->tins[q->tin_order[idx / CAKE_QUEUES]];
const struct cake_flow *flow = &b->flows[idx % CAKE_QUEUES];
b = &q->tins[q->tin_order[idx / CAKE_QUEUES]];
flow = &b->flows[idx % CAKE_QUEUES];
const struct sk_buff *skb;

if (flow->head) {
Expand All @@ -3022,7 +3024,48 @@ static int cake_dump_class_stats(struct Qdisc *sch, unsigned long cl,
}
if (gnet_stats_copy_queue(d, NULL, &qs, qs.qlen) < 0)
return -1;

if (flow) {
ktime_t now = ktime_get();

stats = nla_nest_start(d->skb, TCA_STATS_APP);
if (!stats)
return -1;

#define PUT_STAT_U32(attr, data) do { \
if (nla_put_u32(d->skb, TCA_CAKE_STATS_ ## attr, data)) \
goto nla_put_failure; \
} while (0)
#define PUT_STAT_S32(attr, data) do { \
if (nla_put_s32(d->skb, TCA_CAKE_STATS_ ## attr, data)) \
goto nla_put_failure; \
} while (0)

PUT_STAT_S32(DEFICIT, flow->deficit);
PUT_STAT_U32(DROPPING, flow->cvars.dropping);
PUT_STAT_U32(COBALT_COUNT, flow->cvars.count);
PUT_STAT_U32(P_DROP, flow->cvars.p_drop);
if (flow->cvars.p_drop) {
PUT_STATS_S32(BLUE_TIMER_US,
ktime_to_us(
ktime_sub(now,
flow->cvars.blue_timer)));
}
if (flow->cvars.dropping) {
PUT_STATS_S32(DROP_NEXT_US,
ktime_to_us(
ktime_sub(now,
flow->cvars.drop_next)));
}
if (nla_nest_end(d->skb, stats) < 0)
return -1;
}

return 0;

nla_put_failure:
nla_nest_cancel(d->skb, stats);
return -1;
}

static void cake_walk(struct Qdisc *sch, struct qdisc_walker *arg)
Expand Down

0 comments on commit be1c549

Please sign in to comment.