From: Patrick McHardy <kaber@trash.net>
To: Thomas Graf <tgraf@suug.ch>
Cc: Szymon Miotk <spam@crocom.com.pl>, netdev@oss.sgi.com
Subject: Re: PROBLEM: IProute hangs after running traffic shaping scripts
Date: Mon, 08 Nov 2004 20:46:18 +0100 [thread overview]
Message-ID: <418FCD0A.4040202@trash.net> (raw)
In-Reply-To: <20041108183300.GF31969@postel.suug.ch>
[-- Attachment #1: Type: text/plain, Size: 826 bytes --]
Thomas Graf wrote:
>* Patrick McHardy <418F9AD0.1040701@trash.net> 2004-11-08 17:12
>
>
>>There is some optimization possible, I will do this for the final
>>patch. But I don't understand the problem you refer to, can you
>>please explain ?
>>
>
>I don't have the time to verify this at the moment but:
>
>1) qdisc_destroy unlinking all the lists
>2) RTM_NEWQDISC creating a new qdisc with the same major classid as the old one
> which will suceed since the old one cannot be found anymore.
>3) rcu callback __qdisc_destroy -> qdisc_destroy looking through qdisc_list
> again and then deleting the new entries because their major classid matches.
>
>I might be missing something though.
>
You're right, thanks. The optimization already fixed this, but I
wasn't aware of the bug :) New patch attached.
Regards
Patrick
[-- Attachment #2: x --]
[-- Type: text/plain, Size: 1512 bytes --]
===== net/sched/sch_api.c 1.42 vs edited =====
--- 1.42/net/sched/sch_api.c 2004-11-07 05:03:04 +01:00
+++ edited/net/sched/sch_api.c 2004-11-08 02:38:04 +01:00
@@ -196,10 +196,14 @@
{
struct Qdisc *q;
+ read_lock_bh(&qdisc_tree_lock);
list_for_each_entry(q, &dev->qdisc_list, list) {
- if (q->handle == handle)
+ if (q->handle == handle) {
+ read_unlock_bh(&qdisc_tree_lock);
return q;
+ }
}
+ read_unlock_bh(&qdisc_tree_lock);
return NULL;
}
===== net/sched/sch_generic.c 1.30 vs edited =====
--- 1.30/net/sched/sch_generic.c 2004-11-06 01:34:45 +01:00
+++ edited/net/sched/sch_generic.c 2004-11-08 20:41:58 +01:00
@@ -483,10 +483,32 @@
void qdisc_destroy(struct Qdisc *qdisc)
{
+ struct list_head cql = LIST_HEAD_INIT(cql);
+ struct Qdisc *cq, *q, *n;
+
if (qdisc->flags & TCQ_F_BUILTIN ||
!atomic_dec_and_test(&qdisc->refcnt))
return;
- list_del(&qdisc->list);
+
+ if (!list_empty(&qdisc->list)) {
+ if (qdisc->ops->cl_ops == NULL)
+ list_del(&qdisc->list);
+ else
+ list_move(&qdisc->list, &cql);
+ }
+
+ /* unlink inner qdiscs from dev->qdisc_list immediately */
+ list_for_each_entry(cq, &cql, list)
+ list_for_each_entry_safe(q, n, &qdisc->dev->qdisc_list, list)
+ if (TC_H_MAJ(q->parent) == TC_H_MAJ(cq->handle)) {
+ if (q->ops->cl_ops != NULL)
+ list_move_tail(&q->list, &cql);
+ else
+ list_del_init(&q->list);
+ }
+ list_for_each_entry_safe(cq, n, &cql, list)
+ list_del_init(&cq->list);
+
call_rcu(&qdisc->q_rcu, __qdisc_destroy);
}
next prev parent reply other threads:[~2004-11-08 19:46 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-11-05 9:48 PROBLEM: IProute hangs after running traffic shaping scripts Szymon Miotk
2004-11-05 11:54 ` Thomas Graf
2004-11-05 14:16 ` [PATCH] PKT_SCHED: Initialize list field in dummy qdiscs Thomas Graf
2004-11-05 16:12 ` Patrick McHardy
2004-11-05 16:39 ` Thomas Graf
2004-11-05 17:26 ` Patrick McHardy
2004-11-05 17:58 ` Thomas Graf
2004-11-05 18:18 ` Patrick McHardy
2004-11-05 19:43 ` Thomas Graf
2004-11-06 1:18 ` Thomas Graf
2004-11-06 1:47 ` Patrick McHardy
2004-11-06 1:59 ` Thomas Graf
2004-11-06 14:50 ` Thomas Graf
2004-11-07 8:57 ` Patrick McHardy
2004-11-07 14:00 ` Thomas Graf
2004-11-07 16:19 ` Patrick McHardy
2004-11-07 16:33 ` Thomas Graf
2004-11-07 17:02 ` Patrick McHardy
2004-11-07 17:49 ` Thomas Graf
2004-11-07 18:22 ` Patrick McHardy
2004-11-07 19:08 ` Thomas Graf
2004-11-06 0:36 ` David S. Miller
2004-11-07 22:22 ` PROBLEM: IProute hangs after running traffic shaping scripts Patrick McHardy
2004-11-08 1:40 ` Patrick McHardy
2004-11-08 13:54 ` Thomas Graf
2004-11-08 16:12 ` Patrick McHardy
2004-11-08 18:33 ` Thomas Graf
2004-11-08 19:46 ` Patrick McHardy [this message]
2004-11-08 20:15 ` Thomas Graf
2004-11-10 0:18 ` David S. Miller
2004-11-10 0:40 ` Patrick McHardy
2004-11-10 0:55 ` Patrick McHardy
2004-11-10 6:13 ` David S. Miller
2004-11-10 12:08 ` Szymon Miotk
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=418FCD0A.4040202@trash.net \
--to=kaber@trash.net \
--cc=netdev@oss.sgi.com \
--cc=spam@crocom.com.pl \
--cc=tgraf@suug.ch \
/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.