diff options
Diffstat (limited to 'net/sched/sch_api.c')
| -rw-r--r-- | net/sched/sch_api.c | 14 | 
1 files changed, 9 insertions, 5 deletions
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index dca6c1a576f..3d8981fde30 100644 --- a/net/sched/sch_api.c +++ b/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)  |