From 1ffc64133ad870da716268382580a4c3735f8052 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Tue, 3 Jan 2012 00:00:11 +0000 Subject: [PATCH] --- yaml --- r: 279169 b: refs/heads/master c: fa0f5aa74316c636427ac92dad0bc5714c34ca17 h: refs/heads/master i: 279167: c0b1871e1c5a252701dd2573cc2916408ca0d629 v: v3 --- [refs] | 2 +- trunk/net/sched/sch_api.c | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index 350b88844993..a85bbfc4c5cf 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d32ae76f2b776347051cf821ebe690602e38dfc7 +refs/heads/master: fa0f5aa74316c636427ac92dad0bc5714c34ca17 diff --git a/trunk/net/sched/sch_api.c b/trunk/net/sched/sch_api.c index dca6c1a576f7..3d8981fde301 100644 --- a/trunk/net/sched/sch_api.c +++ b/trunk/net/sched/sch_api.c @@ -618,20 +618,24 @@ void qdisc_class_hash_remove(struct Qdisc_class_hash *clhash, } EXPORT_SYMBOL(qdisc_class_hash_remove); -/* Allocate an unique handle from space managed by kernel */ - +/* Allocate an unique handle from space managed by kernel + * Possible range is [8000-FFFF]:0000 (0x8000 values) + */ static u32 qdisc_alloc_handle(struct net_device *dev) { - int i = 0x10000; + int i = 0x8000; static u32 autohandle = TC_H_MAKE(0x80000000U, 0); do { autohandle += TC_H_MAKE(0x10000U, 0); if (autohandle == TC_H_MAKE(TC_H_ROOT, 0)) autohandle = TC_H_MAKE(0x80000000U, 0); - } while (qdisc_lookup(dev, autohandle) && --i > 0); + if (!qdisc_lookup(dev, autohandle)) + return autohandle; + cond_resched(); + } while (--i > 0); - return i > 0 ? autohandle : 0; + return 0; } void qdisc_tree_decrease_qlen(struct Qdisc *sch, unsigned int n)