Subject: Re: [PATCH][NET_SCHED] sch_api: fix qdisc_tree_decrease_qlen() loop

From: Patrick McHardy <[email-masked]>
Date: Tue, 15 Apr 2008 15:09:53 +0200

Jarek Poplawski wrote:
> On Tue, Apr 15, 2008 at 02:37:32PM +0200, Patrick McHardy wrote:
>> Jarek Poplawski wrote:
>>> On Mon, Apr 14, 2008 at 03:11:02PM -0700, David Miller wrote:
>>> ...
>>>>> Jarek Poplawski wrote:
>>> ...
>>>>>> After this fix qdisc_lookup() is omitted both for ingress and root
>>>>>> parents, but looking for root is only wasting a little time here...
>>> ...Actually, there is yet a possibility that somebody uses ffff:
>>> handle for a qdisc (not ingress), which could make here a little
>>> difference, so this place could be improved for this case (even
>>> with something like my earlier debugging patch in this thread,
>>> which BTW could be a safety for maybe some other quirks here),
>>> but it seems it would be better to discourage using this handle
>>> for anything but ingress.
>>
>> I don't think we should do that, it would be preferable to
>> compare the entire handle instead of just the major to avoid
>> this.
> 
> Probably you are right... I guess you could handle this?

On second thought I agree with you, the behaviour is inconsistent
and FFFF: shouldn't be used as major, otherwise the major doesn't
uniquely identify a qdisc anymore.

diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
index fc8708a..c486e9d 100644
--- a/net/sched/sch_api.c
+++ b/net/sched/sch_api.c
@@ -386,7 +386,7 @@ 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))
+		if (parentid == TC_H_INGRESS)
 			return;
 
 		sch = qdisc_lookup(sch->dev, TC_H_MAJ(parentid));