From: Eric Dumazet <eric.dumazet@gmail.com>
To: Stephen Hemminger <shemminger@vyatta.com>
Cc: David Miller <davem@davemloft.net>, netdev@vger.kernel.org
Subject: Re: [RFC] sched: CHOKe packet scheduler (v0.4)
Date: Tue, 11 Jan 2011 01:00:31 +0100 [thread overview]
Message-ID: <1294704031.4148.2.camel@edumazet-laptop> (raw)
In-Reply-To: <20110110154414.53f33916@nehalam>
Le lundi 10 janvier 2011 à 15:44 -0800, Stephen Hemminger a écrit :
> This implements the CHOKe packet scheduler based on the existing
> Linux RED scheduler based on the algorithm described in the paper.
>
> The core idea is:
> For every packet arrival:
> Calculate Qave
> if (Qave < minth)
> Queue the new packet
> else
> Select randomly a packet from the queue
> if (both packets from same flow)
> then Drop both the packets
> else if (Qave > maxth)
> Drop packet
> else
> Admit packet with proability p (same as RED)
>
> See also:
> Rong Pan, Balaji Prabhakar, Konstantinos Psounis, "CHOKe: a stateless active
> queue management scheme for approximating fair bandwidth allocation",
> Proceeding of INFOCOM'2000, March 2000.
>
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
>
You beat me, I found the bug I had in _change()
> +
> +static int choke_change(struct Qdisc *sch, struct nlattr *opt)
> +{
> + struct choke_sched_data *q = qdisc_priv(sch);
> + struct nlattr *tb[TCA_RED_MAX + 1];
> + struct tc_red_qopt *ctl;
> + int err;
> + struct sk_buff **old = NULL;
> + unsigned int mask;
> +
> + if (opt == NULL)
> + return -EINVAL;
> +
> + err = nla_parse_nested(tb, TCA_RED_MAX, opt, choke_policy);
> + if (err < 0)
> + return err;
> +
> + if (tb[TCA_RED_PARMS] == NULL ||
> + tb[TCA_RED_STAB] == NULL)
> + return -EINVAL;
> +
> + ctl = nla_data(tb[TCA_RED_PARMS]);
> +
> + mask = roundup_pow_of_two(ctl->limit + 1) - 1;
> + if (mask != q->tab_mask) {
> + struct sk_buff **ntab = kcalloc(mask + 1, sizeof(struct sk_buff *),
> + GFP_KERNEL);
> + if (!ntab)
> + ntab = vzalloc((mask + 1) * sizeof(struct sk_buff *));
> + if (!ntab)
> + return -ENOMEM;
> + sch_tree_lock(sch);
> + old = q->tab;
> + if (old) {
> + unsigned int tail = 0;
> +
> + while (q->head != q->tail) {
> + ntab[tail++] = q->tab[q->head];
> + q->head = (q->head + 1) & q->tab_mask;
> + }
> + q->head = 0;
> + q->tail = tail;
> + }
> + q->tab_mask = mask;
Here we missed :
q->tab = ntab;
> + q->holes = 0;
> + } else
> + sch_tree_lock(sch);
> + q->flags = ctl->flags;
> + q->limit = ctl->limit;
> +
> + red_set_parms(&q->parms, ctl->qth_min, ctl->qth_max, ctl->Wlog,
> + ctl->Plog, ctl->Scell_log,
> + nla_data(tb[TCA_RED_STAB]));
> +
> + if (q->head == q->tail)
> + red_end_of_idle_period(&q->parms);
> +
> + sch_tree_unlock(sch);
> + choke_free(old);
> + return 0;
> +}
> +
next prev parent reply other threads:[~2011-01-11 0:00 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-01-05 0:29 [RFC] sched: CHOKe packet scheduler Stephen Hemminger
2011-01-05 6:02 ` Eric Dumazet
2011-01-05 6:19 ` Eric Dumazet
2011-01-05 17:17 ` Stephen Hemminger
2011-01-05 17:25 ` Eric Dumazet
2011-01-05 19:21 ` [RFC] sched: CHOKe packet scheduler (v0.2) Stephen Hemminger
2011-01-05 20:06 ` Eric Dumazet
2011-01-05 20:15 ` Stephen Hemminger
2011-01-06 4:07 ` Eric Dumazet
2011-01-06 6:53 ` Stephen Hemminger
2011-01-07 4:55 ` Stephen Hemminger
2011-01-07 5:39 ` Changli Gao
2011-01-07 7:10 ` Stephen Hemminger
2011-01-07 8:37 ` Eric Dumazet
2011-01-10 13:46 ` Eric Dumazet
2011-01-10 17:31 ` Stephen Hemminger
2011-01-10 17:45 ` Eric Dumazet
2011-01-10 23:44 ` [RFC] sched: CHOKe packet scheduler (v0.4) Stephen Hemminger
2011-01-11 0:00 ` Eric Dumazet [this message]
2011-01-11 1:10 ` Stephen Hemminger
2011-01-11 6:18 ` Eric Dumazet
2011-01-11 6:34 ` Eric Dumazet
2011-01-11 23:48 ` Stephen Hemminger
2011-01-12 0:04 ` Eric Dumazet
2011-01-12 7:13 ` [RFC] sched: CHOKe packet scheduler (v0.6) Eric Dumazet
2011-01-12 17:27 ` Stephen Hemminger
2011-01-12 17:33 ` Eric Dumazet
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1294704031.4148.2.camel@edumazet-laptop \
--to=eric.dumazet@gmail.com \
--cc=davem@davemloft.net \
--cc=netdev@vger.kernel.org \
--cc=shemminger@vyatta.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox