summaryrefslogtreecommitdiffstats
path: root/net/sched/sch_prio.c
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2016-06-13 01:21:47 +0200
committerDavid S. Miller <davem@davemloft.net>2016-06-13 03:56:38 +0200
commitcbdf451164785c9cf5acd5d2983c1e7c778df4c1 (patch)
tree83e2f15dee5620f1167c97cb4646126ad0fef6ea /net/sched/sch_prio.c
parentipconfig: Protect ic_addrservaddr with IPCONFIG_DYNAMIC. (diff)
downloadlinux-cbdf451164785c9cf5acd5d2983c1e7c778df4c1.tar.xz
linux-cbdf451164785c9cf5acd5d2983c1e7c778df4c1.zip
net_sched: prio: properly report out of memory errors
At Qdisc creation or change time, prio_tune() creates missing pfifo qdiscs but does not return an error code if one qdisc could not be allocated. Leaving a qdisc in non operational state without telling user anything about this problem is not good. Also, testing if we replace something different than noop_qdisc a second time makes no sense so I removed useless code. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched/sch_prio.c')
-rw-r--r--net/sched/sch_prio.c32
1 files changed, 12 insertions, 20 deletions
diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c
index 4b0a82191bc4..071718bccdab 100644
--- a/net/sched/sch_prio.c
+++ b/net/sched/sch_prio.c
@@ -202,26 +202,18 @@ static int prio_tune(struct Qdisc *sch, struct nlattr *opt)
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);
- }
- }
+ struct Qdisc *child;
+
+ if (q->queues[i] != &noop_qdisc)
+ continue;
+
+ child = qdisc_create_dflt(sch->dev_queue, &pfifo_qdisc_ops,
+ TC_H_MAKE(sch->handle, i + 1));
+ if (!child)
+ return -ENOMEM;
+ sch_tree_lock(sch);
+ q->queues[i] = child;
+ sch_tree_unlock(sch);
}
return 0;
}