Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Several cases of overlapping changes, except the packet scheduler conflicts which deal with the addition of the free list parameter to qdisc_enqueue(). Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -153,8 +153,9 @@ prio_destroy(struct Qdisc *sch)
|
||||
static int prio_tune(struct Qdisc *sch, struct nlattr *opt)
|
||||
{
|
||||
struct prio_sched_data *q = qdisc_priv(sch);
|
||||
struct Qdisc *queues[TCQ_PRIO_BANDS];
|
||||
int oldbands = q->bands, i;
|
||||
struct tc_prio_qopt *qopt;
|
||||
int i;
|
||||
|
||||
if (nla_len(opt) < sizeof(*qopt))
|
||||
return -EINVAL;
|
||||
@@ -168,62 +169,42 @@ static int prio_tune(struct Qdisc *sch, struct nlattr *opt)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Before commit, make sure we can allocate all new qdiscs */
|
||||
for (i = oldbands; i < qopt->bands; i++) {
|
||||
queues[i] = qdisc_create_dflt(sch->dev_queue, &pfifo_qdisc_ops,
|
||||
TC_H_MAKE(sch->handle, i + 1));
|
||||
if (!queues[i]) {
|
||||
while (i > oldbands)
|
||||
qdisc_destroy(queues[--i]);
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
sch_tree_lock(sch);
|
||||
q->bands = qopt->bands;
|
||||
memcpy(q->prio2band, qopt->priomap, TC_PRIO_MAX+1);
|
||||
|
||||
for (i = q->bands; i < TCQ_PRIO_BANDS; i++) {
|
||||
for (i = q->bands; i < oldbands; i++) {
|
||||
struct Qdisc *child = q->queues[i];
|
||||
q->queues[i] = &noop_qdisc;
|
||||
if (child != &noop_qdisc) {
|
||||
qdisc_tree_reduce_backlog(child, child->q.qlen, child->qstats.backlog);
|
||||
qdisc_destroy(child);
|
||||
}
|
||||
|
||||
qdisc_tree_reduce_backlog(child, child->q.qlen,
|
||||
child->qstats.backlog);
|
||||
qdisc_destroy(child);
|
||||
}
|
||||
|
||||
for (i = oldbands; i < q->bands; i++)
|
||||
q->queues[i] = queues[i];
|
||||
|
||||
sch_tree_unlock(sch);
|
||||
|
||||
for (i = 0; i < q->bands; i++) {
|
||||
if (q->queues[i] == &noop_qdisc) {
|
||||
struct Qdisc *child, *old;
|
||||
|
||||
child = qdisc_create_dflt(sch->dev_queue,
|
||||
&pfifo_qdisc_ops,
|
||||
TC_H_MAKE(sch->handle, i + 1));
|
||||
if (child) {
|
||||
sch_tree_lock(sch);
|
||||
old = q->queues[i];
|
||||
q->queues[i] = child;
|
||||
|
||||
if (old != &noop_qdisc) {
|
||||
qdisc_tree_reduce_backlog(old,
|
||||
old->q.qlen,
|
||||
old->qstats.backlog);
|
||||
qdisc_destroy(old);
|
||||
}
|
||||
sch_tree_unlock(sch);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int prio_init(struct Qdisc *sch, struct nlattr *opt)
|
||||
{
|
||||
struct prio_sched_data *q = qdisc_priv(sch);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < TCQ_PRIO_BANDS; i++)
|
||||
q->queues[i] = &noop_qdisc;
|
||||
|
||||
if (opt == NULL) {
|
||||
if (!opt)
|
||||
return -EINVAL;
|
||||
} else {
|
||||
int err;
|
||||
|
||||
if ((err = prio_tune(sch, opt)) != 0)
|
||||
return err;
|
||||
}
|
||||
return 0;
|
||||
return prio_tune(sch, opt);
|
||||
}
|
||||
|
||||
static int prio_dump(struct Qdisc *sch, struct sk_buff *skb)
|
||||
|
Reference in New Issue
Block a user