diff options
Diffstat (limited to 'net/sched/sch_drr.c')
| -rw-r--r-- | net/sched/sch_drr.c | 31 | 
1 files changed, 14 insertions, 17 deletions
diff --git a/net/sched/sch_drr.c b/net/sched/sch_drr.c index aa8b5313f8c..7bbbfe11219 100644 --- a/net/sched/sch_drr.c +++ b/net/sched/sch_drr.c @@ -25,7 +25,7 @@ struct drr_class {  	struct gnet_stats_basic_packed		bstats;  	struct gnet_stats_queue		qstats; -	struct gnet_stats_rate_est	rate_est; +	struct gnet_stats_rate_est64	rate_est;  	struct list_head		alist;  	struct Qdisc			*qdisc; @@ -260,7 +260,8 @@ static int drr_dump_class(struct Qdisc *sch, unsigned long arg,  	nest = nla_nest_start(skb, TCA_OPTIONS);  	if (nest == NULL)  		goto nla_put_failure; -	NLA_PUT_U32(skb, TCA_DRR_QUANTUM, cl->quantum); +	if (nla_put_u32(skb, TCA_DRR_QUANTUM, cl->quantum)) +		goto nla_put_failure;  	return nla_nest_end(skb, nest);  nla_put_failure: @@ -292,14 +293,13 @@ static void drr_walk(struct Qdisc *sch, struct qdisc_walker *arg)  {  	struct drr_sched *q = qdisc_priv(sch);  	struct drr_class *cl; -	struct hlist_node *n;  	unsigned int i;  	if (arg->stop)  		return;  	for (i = 0; i < q->clhash.hashsize; i++) { -		hlist_for_each_entry(cl, n, &q->clhash.hash[i], common.hnode) { +		hlist_for_each_entry(cl, &q->clhash.hash[i], common.hnode) {  			if (arg->count < arg->skip) {  				arg->count++;  				continue; @@ -351,8 +351,7 @@ static int drr_enqueue(struct sk_buff *skb, struct Qdisc *sch)  {  	struct drr_sched *q = qdisc_priv(sch);  	struct drr_class *cl; -	unsigned int len; -	int err; +	int err = 0;  	cl = drr_classify(skb, sch, &err);  	if (cl == NULL) { @@ -362,7 +361,6 @@ static int drr_enqueue(struct sk_buff *skb, struct Qdisc *sch)  		return err;  	} -	len = qdisc_pkt_len(skb);  	err = qdisc_enqueue(skb, cl->qdisc);  	if (unlikely(err != NET_XMIT_SUCCESS)) {  		if (net_xmit_drop_count(err)) { @@ -377,11 +375,6 @@ static int drr_enqueue(struct sk_buff *skb, struct Qdisc *sch)  		cl->deficit = cl->quantum;  	} -	cl->bstats.packets++; -	cl->bstats.bytes += len; -	sch->bstats.packets++; -	sch->bstats.bytes += len; -  	sch->q.qlen++;  	return err;  } @@ -398,8 +391,10 @@ static struct sk_buff *drr_dequeue(struct Qdisc *sch)  	while (1) {  		cl = list_first_entry(&q->active, struct drr_class, alist);  		skb = cl->qdisc->ops->peek(cl->qdisc); -		if (skb == NULL) +		if (skb == NULL) { +			qdisc_warn_nonwc(__func__, cl->qdisc);  			goto out; +		}  		len = qdisc_pkt_len(skb);  		if (len <= cl->deficit) { @@ -407,6 +402,9 @@ static struct sk_buff *drr_dequeue(struct Qdisc *sch)  			skb = qdisc_dequeue_peeked(cl->qdisc);  			if (cl->qdisc->q.qlen == 0)  				list_del(&cl->alist); + +			bstats_update(&cl->bstats, skb); +			qdisc_bstats_update(sch, skb);  			sch->q.qlen--;  			return skb;  		} @@ -454,11 +452,10 @@ static void drr_reset_qdisc(struct Qdisc *sch)  {  	struct drr_sched *q = qdisc_priv(sch);  	struct drr_class *cl; -	struct hlist_node *n;  	unsigned int i;  	for (i = 0; i < q->clhash.hashsize; i++) { -		hlist_for_each_entry(cl, n, &q->clhash.hash[i], common.hnode) { +		hlist_for_each_entry(cl, &q->clhash.hash[i], common.hnode) {  			if (cl->qdisc->q.qlen)  				list_del(&cl->alist);  			qdisc_reset(cl->qdisc); @@ -471,13 +468,13 @@ static void drr_destroy_qdisc(struct Qdisc *sch)  {  	struct drr_sched *q = qdisc_priv(sch);  	struct drr_class *cl; -	struct hlist_node *n, *next; +	struct hlist_node *next;  	unsigned int i;  	tcf_destroy_chain(&q->filter_list);  	for (i = 0; i < q->clhash.hashsize; i++) { -		hlist_for_each_entry_safe(cl, n, next, &q->clhash.hash[i], +		hlist_for_each_entry_safe(cl, next, &q->clhash.hash[i],  					  common.hnode)  			drr_destroy_class(sch, cl);  	}  | 
