From: Jarek Poplawski <jarkao2@gmail.com>
To: David Miller <davem@davemloft.net>
Cc: Enrico Demarin <enrico@superclick.com>,
netdev@vger.kernel.org, Patrick McHardy <kaber@trash.net>
Subject: [PATCH][NET_SCHED] sch_api: fix qdisc_tree_decrease_qlen() loop
Date: Mon, 14 Apr 2008 22:26:06 +0200 [thread overview]
Message-ID: <20080414202605.GA6164@ami.dom.local> (raw)
In-Reply-To: <20080413121031.GA5211@ami.dom.local>
On Sun, Apr 13, 2008 at 02:10:31PM +0200, Jarek Poplawski wrote:
> Enrico Demarin wrote, On 04/11/2008 08:37 PM:
...
> > I stumbled by chance in a deadlock condition using HTB and the ingress
> > scheduler at the same time.
...
> I think one of possible reasons could be a qdisc with the same
> handle and parent ids, like ingress, but I can't see how it could
> be referenced by your htb classes yet...
I think I got it! Enrico wrote to me he will not be able to test
before monday, but IMHO this fix is obvious here...
Regards,
Jarek P.
--------------->
[NET_SCHED] sch_api: fix qdisc_tree_decrease_qlen() loop
TC_H_MAJ(parentid) for root classes is the same as for ingress, and if
ingress qdisc is created qdisc_lookup() returns its pointer (without
ingress NULL is returned). After this all qdisc_lookups give the same,
and we get endless loop. (I don't know how this could hide for so
long - it should trigger with every leaf class deleted if it's qdisc
isn't empty.)
After this fix qdisc_lookup() is omitted both for ingress and root
parents, but looking for root is only wasting a little time here...
Many thanks to Enrico Demarin for finding a test for catching this
bug, which probably bothered quite a lot of admins.
Reported-by: Enrico Demarin <enrico@superclick.com>,
Signed-off-by: Jarek Poplawski <jarkao2@gmail.com>
Cc: Patrick McHardy <kaber@trash.net>
---
net/sched/sch_api.c | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
index 15b91a9..c40773c 100644
--- a/net/sched/sch_api.c
+++ b/net/sched/sch_api.c
@@ -386,6 +386,9 @@ void qdisc_tree_decrease_qlen(struct Qdisc *sch, unsigned int n)
if (n == 0)
return;
while ((parentid = sch->parent)) {
+ if (TC_H_MAJ(parentid) == TC_H_MAJ(TC_H_INGRESS))
+ return;
+
sch = qdisc_lookup(sch->dev, TC_H_MAJ(parentid));
if (sch == NULL) {
WARN_ON(parentid != TC_H_ROOT);
next prev parent reply other threads:[~2008-04-14 20:28 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-11 18:37 HTB and ingress scheduler SMP Soft Lockup in 2.6.23-2.6.25-rc8 Enrico Demarin
2008-04-13 7:51 ` Patrick McHardy
2008-04-13 19:20 ` Enrico Demarin
2008-04-14 7:14 ` Patrick McHardy
2008-04-14 7:15 ` Patrick McHardy
2008-04-14 7:20 ` Patrick McHardy
2008-04-14 7:51 ` Patrick McHardy
2008-04-13 12:10 ` Jarek Poplawski
2008-04-14 20:26 ` Jarek Poplawski [this message]
2008-04-14 20:28 ` [PATCH][NET_SCHED] sch_api: fix qdisc_tree_decrease_qlen() loop Patrick McHardy
2008-04-14 22:11 ` David Miller
2008-04-15 5:32 ` Jarek Poplawski
2008-04-15 12:37 ` Patrick McHardy
2008-04-15 13:00 ` Jarek Poplawski
2008-04-15 13:09 ` Patrick McHardy
2008-04-15 13:10 ` Patrick McHardy
2008-04-15 17:41 ` Jarek Poplawski
2008-04-15 18:25 ` Jarek Poplawski
2008-04-15 19:29 ` Jarek Poplawski
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=20080414202605.GA6164@ami.dom.local \
--to=jarkao2@gmail.com \
--cc=davem@davemloft.net \
--cc=enrico@superclick.com \
--cc=kaber@trash.net \
--cc=netdev@vger.kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.