diff options
Diffstat (limited to 'net/sched/sch_generic.c')
| -rw-r--r-- | net/sched/sch_generic.c | 23 | 
1 files changed, 13 insertions, 10 deletions
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 66ba2ce2320f..a117d9260558 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c @@ -68,7 +68,7 @@ static inline struct sk_buff *__skb_dequeue_bad_txq(struct Qdisc *q)  			skb = __skb_dequeue(&q->skb_bad_txq);  			if (qdisc_is_percpu_stats(q)) {  				qdisc_qstats_cpu_backlog_dec(q, skb); -				qdisc_qstats_cpu_qlen_dec(q); +				qdisc_qstats_atomic_qlen_dec(q);  			} else {  				qdisc_qstats_backlog_dec(q, skb);  				q->q.qlen--; @@ -108,7 +108,7 @@ static inline void qdisc_enqueue_skb_bad_txq(struct Qdisc *q,  	if (qdisc_is_percpu_stats(q)) {  		qdisc_qstats_cpu_backlog_inc(q, skb); -		qdisc_qstats_cpu_qlen_inc(q); +		qdisc_qstats_atomic_qlen_inc(q);  	} else {  		qdisc_qstats_backlog_inc(q, skb);  		q->q.qlen++; @@ -147,7 +147,7 @@ static inline int dev_requeue_skb_locked(struct sk_buff *skb, struct Qdisc *q)  		qdisc_qstats_cpu_requeues_inc(q);  		qdisc_qstats_cpu_backlog_inc(q, skb); -		qdisc_qstats_cpu_qlen_inc(q); +		qdisc_qstats_atomic_qlen_inc(q);  		skb = next;  	} @@ -252,7 +252,7 @@ static struct sk_buff *dequeue_skb(struct Qdisc *q, bool *validate,  			skb = __skb_dequeue(&q->gso_skb);  			if (qdisc_is_percpu_stats(q)) {  				qdisc_qstats_cpu_backlog_dec(q, skb); -				qdisc_qstats_cpu_qlen_dec(q); +				qdisc_qstats_atomic_qlen_dec(q);  			} else {  				qdisc_qstats_backlog_dec(q, skb);  				q->q.qlen--; @@ -500,7 +500,7 @@ static void dev_watchdog_down(struct net_device *dev)   *	netif_carrier_on - set carrier   *	@dev: network device   * - * Device has detected that carrier. + * Device has detected acquisition of carrier.   */  void netif_carrier_on(struct net_device *dev)  { @@ -559,7 +559,7 @@ struct Qdisc_ops noop_qdisc_ops __read_mostly = {  };  static struct netdev_queue noop_netdev_queue = { -	.qdisc		=	&noop_qdisc, +	RCU_POINTER_INITIALIZER(qdisc, &noop_qdisc),  	.qdisc_sleeping	=	&noop_qdisc,  }; @@ -645,7 +645,7 @@ static int pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc *qdisc,  	if (unlikely(err))  		return qdisc_drop_cpu(skb, qdisc, to_free); -	qdisc_qstats_cpu_qlen_inc(qdisc); +	qdisc_qstats_atomic_qlen_inc(qdisc);  	/* Note: skb can not be used after skb_array_produce(),  	 * so we better not use qdisc_qstats_cpu_backlog_inc()  	 */ @@ -670,7 +670,7 @@ static struct sk_buff *pfifo_fast_dequeue(struct Qdisc *qdisc)  	if (likely(skb)) {  		qdisc_qstats_cpu_backlog_dec(qdisc, skb);  		qdisc_bstats_cpu_update(qdisc, skb); -		qdisc_qstats_cpu_qlen_dec(qdisc); +		qdisc_qstats_atomic_qlen_dec(qdisc);  	}  	return skb; @@ -714,7 +714,6 @@ static void pfifo_fast_reset(struct Qdisc *qdisc)  		struct gnet_stats_queue *q = per_cpu_ptr(qdisc->cpu_qstats, i);  		q->backlog = 0; -		q->qlen = 0;  	}  } @@ -1366,7 +1365,11 @@ static void mini_qdisc_rcu_func(struct rcu_head *head)  void mini_qdisc_pair_swap(struct mini_Qdisc_pair *miniqp,  			  struct tcf_proto *tp_head)  { -	struct mini_Qdisc *miniq_old = rtnl_dereference(*miniqp->p_miniq); +	/* Protected with chain0->filter_chain_lock. +	 * Can't access chain directly because tp_head can be NULL. +	 */ +	struct mini_Qdisc *miniq_old = +		rcu_dereference_protected(*miniqp->p_miniq, 1);  	struct mini_Qdisc *miniq;  	if (!tp_head) {  |