sch_generic.c (3a175cdf439275c3da347b6b42c4e9b652a12904) | sch_generic.c (b2d3bcfa26a7a8de41f358a6cae8b848673b3c6e) |
---|---|
1/* 2 * net/sched/sch_generic.c Generic packet scheduler routines. 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation; either version 7 * 2 of the License, or (at your option) any later version. 8 * --- 12 unchanged lines hidden (view full) --- 21#include <linux/netdevice.h> 22#include <linux/skbuff.h> 23#include <linux/rtnetlink.h> 24#include <linux/init.h> 25#include <linux/rcupdate.h> 26#include <linux/list.h> 27#include <linux/slab.h> 28#include <linux/if_vlan.h> | 1/* 2 * net/sched/sch_generic.c Generic packet scheduler routines. 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation; either version 7 * 2 of the License, or (at your option) any later version. 8 * --- 12 unchanged lines hidden (view full) --- 21#include <linux/netdevice.h> 22#include <linux/skbuff.h> 23#include <linux/rtnetlink.h> 24#include <linux/init.h> 25#include <linux/rcupdate.h> 26#include <linux/list.h> 27#include <linux/slab.h> 28#include <linux/if_vlan.h> |
29#include <linux/skb_array.h> |
|
29#include <linux/if_macvlan.h> 30#include <net/sch_generic.h> 31#include <net/pkt_sched.h> 32#include <net/dst.h> 33#include <trace/events/qdisc.h> | 30#include <linux/if_macvlan.h> 31#include <net/sch_generic.h> 32#include <net/pkt_sched.h> 33#include <net/dst.h> 34#include <trace/events/qdisc.h> |
35#include <net/xfrm.h> |
|
34 35/* Qdisc to use by default */ 36const struct Qdisc_ops *default_qdisc_ops = &pfifo_fast_ops; 37EXPORT_SYMBOL(default_qdisc_ops); 38 39/* Main transmission queue. */ 40 41/* Modifications to data participating in scheduling must be protected with 42 * qdisc_lock(qdisc) spinlock. 43 * 44 * The idea is the following: 45 * - enqueue, dequeue are serialized via qdisc root lock 46 * - ingress filtering is also serialized via qdisc root lock 47 * - updates to tree and tree walking are only done under the rtnl mutex. 48 */ 49 | 36 37/* Qdisc to use by default */ 38const struct Qdisc_ops *default_qdisc_ops = &pfifo_fast_ops; 39EXPORT_SYMBOL(default_qdisc_ops); 40 41/* Main transmission queue. */ 42 43/* Modifications to data participating in scheduling must be protected with 44 * qdisc_lock(qdisc) spinlock. 45 * 46 * The idea is the following: 47 * - enqueue, dequeue are serialized via qdisc root lock 48 * - ingress filtering is also serialized via qdisc root lock 49 * - updates to tree and tree walking are only done under the rtnl mutex. 50 */ 51 |
50static inline int dev_requeue_skb(struct sk_buff *skb, struct Qdisc *q) | 52static inline struct sk_buff *__skb_dequeue_bad_txq(struct Qdisc *q) |
51{ | 53{ |
52 q->gso_skb = skb; 53 q->qstats.requeues++; 54 qdisc_qstats_backlog_inc(q, skb); 55 q->q.qlen++; /* it's still part of the queue */ | 54 const struct netdev_queue *txq = q->dev_queue; 55 spinlock_t *lock = NULL; 56 struct sk_buff *skb; 57 58 if (q->flags & TCQ_F_NOLOCK) { 59 lock = qdisc_lock(q); 60 spin_lock(lock); 61 } 62 63 skb = skb_peek(&q->skb_bad_txq); 64 if (skb) { 65 /* check the reason of requeuing without tx lock first */ 66 txq = skb_get_tx_queue(txq->dev, skb); 67 if (!netif_xmit_frozen_or_stopped(txq)) { 68 skb = __skb_dequeue(&q->skb_bad_txq); 69 if (qdisc_is_percpu_stats(q)) { 70 qdisc_qstats_cpu_backlog_dec(q, skb); 71 qdisc_qstats_cpu_qlen_dec(q); 72 } else { 73 qdisc_qstats_backlog_dec(q, skb); 74 q->q.qlen--; 75 } 76 } else { 77 skb = NULL; 78 } 79 } 80 81 if (lock) 82 spin_unlock(lock); 83 84 return skb; 85} 86 87static inline struct sk_buff *qdisc_dequeue_skb_bad_txq(struct Qdisc *q) 88{ 89 struct sk_buff *skb = skb_peek(&q->skb_bad_txq); 90 91 if (unlikely(skb)) 92 skb = __skb_dequeue_bad_txq(q); 93 94 return skb; 95} 96 97static inline void qdisc_enqueue_skb_bad_txq(struct Qdisc *q, 98 struct sk_buff *skb) 99{ 100 spinlock_t *lock = NULL; 101 102 if (q->flags & TCQ_F_NOLOCK) { 103 lock = qdisc_lock(q); 104 spin_lock(lock); 105 } 106 107 __skb_queue_tail(&q->skb_bad_txq, skb); 108 109 if (lock) 110 spin_unlock(lock); 111} 112 113static inline int __dev_requeue_skb(struct sk_buff *skb, struct Qdisc *q) 114{ 115 while (skb) { 116 struct sk_buff *next = skb->next; 117 118 __skb_queue_tail(&q->gso_skb, skb); 119 q->qstats.requeues++; 120 qdisc_qstats_backlog_inc(q, skb); 121 q->q.qlen++; /* it's still part of the queue */ 122 123 skb = next; 124 } |
56 __netif_schedule(q); 57 58 return 0; 59} 60 | 125 __netif_schedule(q); 126 127 return 0; 128} 129 |
130static inline int dev_requeue_skb_locked(struct sk_buff *skb, struct Qdisc *q) 131{ 132 spinlock_t *lock = qdisc_lock(q); 133 134 spin_lock(lock); 135 while (skb) { 136 struct sk_buff *next = skb->next; 137 138 __skb_queue_tail(&q->gso_skb, skb); 139 140 qdisc_qstats_cpu_requeues_inc(q); 141 qdisc_qstats_cpu_backlog_inc(q, skb); 142 qdisc_qstats_cpu_qlen_inc(q); 143 144 skb = next; 145 } 146 spin_unlock(lock); 147 148 __netif_schedule(q); 149 150 return 0; 151} 152 153static inline int dev_requeue_skb(struct sk_buff *skb, struct Qdisc *q) 154{ 155 if (q->flags & TCQ_F_NOLOCK) 156 return dev_requeue_skb_locked(skb, q); 157 else 158 return __dev_requeue_skb(skb, q); 159} 160 |
|
61static void try_bulk_dequeue_skb(struct Qdisc *q, 62 struct sk_buff *skb, 63 const struct netdev_queue *txq, 64 int *packets) 65{ 66 int bytelimit = qdisc_avail_bulklimit(txq) - skb->len; 67 68 while (bytelimit > 0) { --- 21 unchanged lines hidden (view full) --- 90 struct sk_buff *nskb; 91 int cnt = 0; 92 93 do { 94 nskb = q->dequeue(q); 95 if (!nskb) 96 break; 97 if (unlikely(skb_get_queue_mapping(nskb) != mapping)) { | 161static void try_bulk_dequeue_skb(struct Qdisc *q, 162 struct sk_buff *skb, 163 const struct netdev_queue *txq, 164 int *packets) 165{ 166 int bytelimit = qdisc_avail_bulklimit(txq) - skb->len; 167 168 while (bytelimit > 0) { --- 21 unchanged lines hidden (view full) --- 190 struct sk_buff *nskb; 191 int cnt = 0; 192 193 do { 194 nskb = q->dequeue(q); 195 if (!nskb) 196 break; 197 if (unlikely(skb_get_queue_mapping(nskb) != mapping)) { |
98 q->skb_bad_txq = nskb; 99 qdisc_qstats_backlog_inc(q, nskb); 100 q->q.qlen++; | 198 qdisc_enqueue_skb_bad_txq(q, nskb); 199 200 if (qdisc_is_percpu_stats(q)) { 201 qdisc_qstats_cpu_backlog_inc(q, nskb); 202 qdisc_qstats_cpu_qlen_inc(q); 203 } else { 204 qdisc_qstats_backlog_inc(q, nskb); 205 q->q.qlen++; 206 } |
101 break; 102 } 103 skb->next = nskb; 104 skb = nskb; 105 } while (++cnt < 8); 106 (*packets) += cnt; 107 skb->next = NULL; 108} 109 110/* Note that dequeue_skb can possibly return a SKB list (via skb->next). 111 * A requeued skb (via q->gso_skb) can also be a SKB list. 112 */ 113static struct sk_buff *dequeue_skb(struct Qdisc *q, bool *validate, 114 int *packets) 115{ | 207 break; 208 } 209 skb->next = nskb; 210 skb = nskb; 211 } while (++cnt < 8); 212 (*packets) += cnt; 213 skb->next = NULL; 214} 215 216/* Note that dequeue_skb can possibly return a SKB list (via skb->next). 217 * A requeued skb (via q->gso_skb) can also be a SKB list. 218 */ 219static struct sk_buff *dequeue_skb(struct Qdisc *q, bool *validate, 220 int *packets) 221{ |
116 struct sk_buff *skb = q->gso_skb; | |
117 const struct netdev_queue *txq = q->dev_queue; | 222 const struct netdev_queue *txq = q->dev_queue; |
223 struct sk_buff *skb = NULL; |
|
118 119 *packets = 1; | 224 225 *packets = 1; |
120 if (unlikely(skb)) { | 226 if (unlikely(!skb_queue_empty(&q->gso_skb))) { 227 spinlock_t *lock = NULL; 228 229 if (q->flags & TCQ_F_NOLOCK) { 230 lock = qdisc_lock(q); 231 spin_lock(lock); 232 } 233 234 skb = skb_peek(&q->gso_skb); 235 236 /* skb may be null if another cpu pulls gso_skb off in between 237 * empty check and lock. 238 */ 239 if (!skb) { 240 if (lock) 241 spin_unlock(lock); 242 goto validate; 243 } 244 |
121 /* skb in gso_skb were already validated */ 122 *validate = false; | 245 /* skb in gso_skb were already validated */ 246 *validate = false; |
247 if (xfrm_offload(skb)) 248 *validate = true; |
|
123 /* check the reason of requeuing without tx lock first */ 124 txq = skb_get_tx_queue(txq->dev, skb); 125 if (!netif_xmit_frozen_or_stopped(txq)) { | 249 /* check the reason of requeuing without tx lock first */ 250 txq = skb_get_tx_queue(txq->dev, skb); 251 if (!netif_xmit_frozen_or_stopped(txq)) { |
126 q->gso_skb = NULL; 127 qdisc_qstats_backlog_dec(q, skb); 128 q->q.qlen--; 129 } else | 252 skb = __skb_dequeue(&q->gso_skb); 253 if (qdisc_is_percpu_stats(q)) { 254 qdisc_qstats_cpu_backlog_dec(q, skb); 255 qdisc_qstats_cpu_qlen_dec(q); 256 } else { 257 qdisc_qstats_backlog_dec(q, skb); 258 q->q.qlen--; 259 } 260 } else { |
130 skb = NULL; | 261 skb = NULL; |
131 goto trace; 132 } 133 *validate = true; 134 skb = q->skb_bad_txq; 135 if (unlikely(skb)) { 136 /* check the reason of requeuing without tx lock first */ 137 txq = skb_get_tx_queue(txq->dev, skb); 138 if (!netif_xmit_frozen_or_stopped(txq)) { 139 q->skb_bad_txq = NULL; 140 qdisc_qstats_backlog_dec(q, skb); 141 q->q.qlen--; 142 goto bulk; | |
143 } | 262 } |
144 skb = NULL; | 263 if (lock) 264 spin_unlock(lock); |
145 goto trace; 146 } | 265 goto trace; 266 } |
147 if (!(q->flags & TCQ_F_ONETXQUEUE) || 148 !netif_xmit_frozen_or_stopped(txq)) 149 skb = q->dequeue(q); | 267validate: 268 *validate = true; 269 270 if ((q->flags & TCQ_F_ONETXQUEUE) && 271 netif_xmit_frozen_or_stopped(txq)) 272 return skb; 273 274 skb = qdisc_dequeue_skb_bad_txq(q); 275 if (unlikely(skb)) 276 goto bulk; 277 skb = q->dequeue(q); |
150 if (skb) { 151bulk: 152 if (qdisc_may_bulk(q)) 153 try_bulk_dequeue_skb(q, skb, txq, packets); 154 else 155 try_bulk_dequeue_skb_slow(q, skb, packets); 156 } 157trace: 158 trace_qdisc_dequeue(q, txq, *packets, skb); 159 return skb; 160} 161 162/* 163 * Transmit possibly several skbs, and handle the return status as 164 * required. Owning running seqcount bit guarantees that 165 * only one CPU can execute this function. 166 * 167 * Returns to the caller: | 278 if (skb) { 279bulk: 280 if (qdisc_may_bulk(q)) 281 try_bulk_dequeue_skb(q, skb, txq, packets); 282 else 283 try_bulk_dequeue_skb_slow(q, skb, packets); 284 } 285trace: 286 trace_qdisc_dequeue(q, txq, *packets, skb); 287 return skb; 288} 289 290/* 291 * Transmit possibly several skbs, and handle the return status as 292 * required. Owning running seqcount bit guarantees that 293 * only one CPU can execute this function. 294 * 295 * Returns to the caller: |
168 * 0 - queue is empty or throttled. 169 * >0 - queue is not empty. | 296 * false - hardware queue frozen backoff 297 * true - feel free to send more pkts |
170 */ | 298 */ |
171int sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q, 172 struct net_device *dev, struct netdev_queue *txq, 173 spinlock_t *root_lock, bool validate) | 299bool sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q, 300 struct net_device *dev, struct netdev_queue *txq, 301 spinlock_t *root_lock, bool validate) |
174{ 175 int ret = NETDEV_TX_BUSY; | 302{ 303 int ret = NETDEV_TX_BUSY; |
304 bool again = false; |
|
176 177 /* And release qdisc */ | 305 306 /* And release qdisc */ |
178 spin_unlock(root_lock); | 307 if (root_lock) 308 spin_unlock(root_lock); |
179 180 /* Note that we validate skb (GSO, checksum, ...) outside of locks */ 181 if (validate) | 309 310 /* Note that we validate skb (GSO, checksum, ...) outside of locks */ 311 if (validate) |
182 skb = validate_xmit_skb_list(skb, dev); | 312 skb = validate_xmit_skb_list(skb, dev, &again); |
183 | 313 |
314#ifdef CONFIG_XFRM_OFFLOAD 315 if (unlikely(again)) { 316 if (root_lock) 317 spin_lock(root_lock); 318 319 dev_requeue_skb(skb, q); 320 return false; 321 } 322#endif 323 |
|
184 if (likely(skb)) { 185 HARD_TX_LOCK(dev, txq, smp_processor_id()); 186 if (!netif_xmit_frozen_or_stopped(txq)) 187 skb = dev_hard_start_xmit(skb, dev, txq, &ret); 188 189 HARD_TX_UNLOCK(dev, txq); 190 } else { | 324 if (likely(skb)) { 325 HARD_TX_LOCK(dev, txq, smp_processor_id()); 326 if (!netif_xmit_frozen_or_stopped(txq)) 327 skb = dev_hard_start_xmit(skb, dev, txq, &ret); 328 329 HARD_TX_UNLOCK(dev, txq); 330 } else { |
191 spin_lock(root_lock); 192 return qdisc_qlen(q); | 331 if (root_lock) 332 spin_lock(root_lock); 333 return true; |
193 } | 334 } |
194 spin_lock(root_lock); | |
195 | 335 |
196 if (dev_xmit_complete(ret)) { 197 /* Driver sent out skb successfully or skb was consumed */ 198 ret = qdisc_qlen(q); 199 } else { | 336 if (root_lock) 337 spin_lock(root_lock); 338 339 if (!dev_xmit_complete(ret)) { |
200 /* Driver returned NETDEV_TX_BUSY - requeue skb */ 201 if (unlikely(ret != NETDEV_TX_BUSY)) 202 net_warn_ratelimited("BUG %s code %d qlen %d\n", 203 dev->name, ret, q->q.qlen); 204 | 340 /* Driver returned NETDEV_TX_BUSY - requeue skb */ 341 if (unlikely(ret != NETDEV_TX_BUSY)) 342 net_warn_ratelimited("BUG %s code %d qlen %d\n", 343 dev->name, ret, q->q.qlen); 344 |
205 ret = dev_requeue_skb(skb, q); | 345 dev_requeue_skb(skb, q); 346 return false; |
206 } 207 208 if (ret && netif_xmit_frozen_or_stopped(txq)) | 347 } 348 349 if (ret && netif_xmit_frozen_or_stopped(txq)) |
209 ret = 0; | 350 return false; |
210 | 351 |
211 return ret; | 352 return true; |
212} 213 214/* 215 * NOTE: Called under qdisc_lock(q) with locally disabled BH. 216 * 217 * running seqcount guarantees only one CPU can process 218 * this qdisc at a time. qdisc_lock(q) serializes queue accesses for 219 * this queue. --- 5 unchanged lines hidden (view full) --- 225 * 226 * Note, that this procedure can be called by a watchdog timer 227 * 228 * Returns to the caller: 229 * 0 - queue is empty or throttled. 230 * >0 - queue is not empty. 231 * 232 */ | 353} 354 355/* 356 * NOTE: Called under qdisc_lock(q) with locally disabled BH. 357 * 358 * running seqcount guarantees only one CPU can process 359 * this qdisc at a time. qdisc_lock(q) serializes queue accesses for 360 * this queue. --- 5 unchanged lines hidden (view full) --- 366 * 367 * Note, that this procedure can be called by a watchdog timer 368 * 369 * Returns to the caller: 370 * 0 - queue is empty or throttled. 371 * >0 - queue is not empty. 372 * 373 */ |
233static inline int qdisc_restart(struct Qdisc *q, int *packets) | 374static inline bool qdisc_restart(struct Qdisc *q, int *packets) |
234{ | 375{ |
376 spinlock_t *root_lock = NULL; |
|
235 struct netdev_queue *txq; 236 struct net_device *dev; | 377 struct netdev_queue *txq; 378 struct net_device *dev; |
237 spinlock_t *root_lock; | |
238 struct sk_buff *skb; 239 bool validate; 240 241 /* Dequeue packet */ 242 skb = dequeue_skb(q, &validate, packets); 243 if (unlikely(!skb)) | 379 struct sk_buff *skb; 380 bool validate; 381 382 /* Dequeue packet */ 383 skb = dequeue_skb(q, &validate, packets); 384 if (unlikely(!skb)) |
244 return 0; | 385 return false; |
245 | 386 |
246 root_lock = qdisc_lock(q); | 387 if (!(q->flags & TCQ_F_NOLOCK)) 388 root_lock = qdisc_lock(q); 389 |
247 dev = qdisc_dev(q); 248 txq = skb_get_tx_queue(dev, skb); 249 250 return sch_direct_xmit(skb, q, dev, txq, root_lock, validate); 251} 252 253void __qdisc_run(struct Qdisc *q) 254{ --- 7 unchanged lines hidden (view full) --- 262 * 2. another process needs the CPU; 263 */ 264 quota -= packets; 265 if (quota <= 0 || need_resched()) { 266 __netif_schedule(q); 267 break; 268 } 269 } | 390 dev = qdisc_dev(q); 391 txq = skb_get_tx_queue(dev, skb); 392 393 return sch_direct_xmit(skb, q, dev, txq, root_lock, validate); 394} 395 396void __qdisc_run(struct Qdisc *q) 397{ --- 7 unchanged lines hidden (view full) --- 405 * 2. another process needs the CPU; 406 */ 407 quota -= packets; 408 if (quota <= 0 || need_resched()) { 409 __netif_schedule(q); 410 break; 411 } 412 } |
270 271 qdisc_run_end(q); | |
272} 273 274unsigned long dev_trans_start(struct net_device *dev) 275{ 276 unsigned long val, res; 277 unsigned int i; 278 279 if (is_vlan_dev(dev)) --- 84 unchanged lines hidden (view full) --- 364 * 365 * Device has detected that carrier. 366 */ 367void netif_carrier_on(struct net_device *dev) 368{ 369 if (test_and_clear_bit(__LINK_STATE_NOCARRIER, &dev->state)) { 370 if (dev->reg_state == NETREG_UNINITIALIZED) 371 return; | 413} 414 415unsigned long dev_trans_start(struct net_device *dev) 416{ 417 unsigned long val, res; 418 unsigned int i; 419 420 if (is_vlan_dev(dev)) --- 84 unchanged lines hidden (view full) --- 505 * 506 * Device has detected that carrier. 507 */ 508void netif_carrier_on(struct net_device *dev) 509{ 510 if (test_and_clear_bit(__LINK_STATE_NOCARRIER, &dev->state)) { 511 if (dev->reg_state == NETREG_UNINITIALIZED) 512 return; |
372 atomic_inc(&dev->carrier_changes); | 513 atomic_inc(&dev->carrier_up_count); |
373 linkwatch_fire_event(dev); 374 if (netif_running(dev)) 375 __netdev_watchdog_up(dev); 376 } 377} 378EXPORT_SYMBOL(netif_carrier_on); 379 380/** 381 * netif_carrier_off - clear carrier 382 * @dev: network device 383 * 384 * Device has detected loss of carrier. 385 */ 386void netif_carrier_off(struct net_device *dev) 387{ 388 if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state)) { 389 if (dev->reg_state == NETREG_UNINITIALIZED) 390 return; | 514 linkwatch_fire_event(dev); 515 if (netif_running(dev)) 516 __netdev_watchdog_up(dev); 517 } 518} 519EXPORT_SYMBOL(netif_carrier_on); 520 521/** 522 * netif_carrier_off - clear carrier 523 * @dev: network device 524 * 525 * Device has detected loss of carrier. 526 */ 527void netif_carrier_off(struct net_device *dev) 528{ 529 if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state)) { 530 if (dev->reg_state == NETREG_UNINITIALIZED) 531 return; |
391 atomic_inc(&dev->carrier_changes); | 532 atomic_inc(&dev->carrier_down_count); |
392 linkwatch_fire_event(dev); 393 } 394} 395EXPORT_SYMBOL(netif_carrier_off); 396 397/* "NOOP" scheduler: the best scheduler, recommended for all interfaces 398 under all circumstances. It is difficult to invent anything faster or 399 cheaper. --- 32 unchanged lines hidden (view full) --- 432 .ops = &noop_qdisc_ops, 433 .q.lock = __SPIN_LOCK_UNLOCKED(noop_qdisc.q.lock), 434 .dev_queue = &noop_netdev_queue, 435 .running = SEQCNT_ZERO(noop_qdisc.running), 436 .busylock = __SPIN_LOCK_UNLOCKED(noop_qdisc.busylock), 437}; 438EXPORT_SYMBOL(noop_qdisc); 439 | 533 linkwatch_fire_event(dev); 534 } 535} 536EXPORT_SYMBOL(netif_carrier_off); 537 538/* "NOOP" scheduler: the best scheduler, recommended for all interfaces 539 under all circumstances. It is difficult to invent anything faster or 540 cheaper. --- 32 unchanged lines hidden (view full) --- 573 .ops = &noop_qdisc_ops, 574 .q.lock = __SPIN_LOCK_UNLOCKED(noop_qdisc.q.lock), 575 .dev_queue = &noop_netdev_queue, 576 .running = SEQCNT_ZERO(noop_qdisc.running), 577 .busylock = __SPIN_LOCK_UNLOCKED(noop_qdisc.busylock), 578}; 579EXPORT_SYMBOL(noop_qdisc); 580 |
440static int noqueue_init(struct Qdisc *qdisc, struct nlattr *opt) | 581static int noqueue_init(struct Qdisc *qdisc, struct nlattr *opt, 582 struct netlink_ext_ack *extack) |
441{ 442 /* register_qdisc() assigns a default of noop_enqueue if unset, 443 * but __dev_queue_xmit() treats noqueue only as such 444 * if this is NULL - so clear it here. */ 445 qdisc->enqueue = NULL; 446 return 0; 447} 448 --- 14 unchanged lines hidden (view full) --- 463/* 3-band FIFO queue: old style, but should be a bit faster than 464 generic prio+fifo combination. 465 */ 466 467#define PFIFO_FAST_BANDS 3 468 469/* 470 * Private data for a pfifo_fast scheduler containing: | 583{ 584 /* register_qdisc() assigns a default of noop_enqueue if unset, 585 * but __dev_queue_xmit() treats noqueue only as such 586 * if this is NULL - so clear it here. */ 587 qdisc->enqueue = NULL; 588 return 0; 589} 590 --- 14 unchanged lines hidden (view full) --- 605/* 3-band FIFO queue: old style, but should be a bit faster than 606 generic prio+fifo combination. 607 */ 608 609#define PFIFO_FAST_BANDS 3 610 611/* 612 * Private data for a pfifo_fast scheduler containing: |
471 * - queues for the three band 472 * - bitmap indicating which of the bands contain skbs | 613 * - rings for priority bands |
473 */ 474struct pfifo_fast_priv { | 614 */ 615struct pfifo_fast_priv { |
475 u32 bitmap; 476 struct qdisc_skb_head q[PFIFO_FAST_BANDS]; | 616 struct skb_array q[PFIFO_FAST_BANDS]; |
477}; 478 | 617}; 618 |
479/* 480 * Convert a bitmap to the first band number where an skb is queued, where: 481 * bitmap=0 means there are no skbs on any band. 482 * bitmap=1 means there is an skb on band 0. 483 * bitmap=7 means there are skbs on all 3 bands, etc. 484 */ 485static const int bitmap2band[] = {-1, 0, 1, 0, 2, 0, 1, 0}; 486 487static inline struct qdisc_skb_head *band2list(struct pfifo_fast_priv *priv, 488 int band) | 619static inline struct skb_array *band2list(struct pfifo_fast_priv *priv, 620 int band) |
489{ | 621{ |
490 return priv->q + band; | 622 return &priv->q[band]; |
491} 492 493static int pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc *qdisc, 494 struct sk_buff **to_free) 495{ | 623} 624 625static int pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc *qdisc, 626 struct sk_buff **to_free) 627{ |
496 if (qdisc->q.qlen < qdisc_dev(qdisc)->tx_queue_len) { 497 int band = prio2band[skb->priority & TC_PRIO_MAX]; 498 struct pfifo_fast_priv *priv = qdisc_priv(qdisc); 499 struct qdisc_skb_head *list = band2list(priv, band); | 628 int band = prio2band[skb->priority & TC_PRIO_MAX]; 629 struct pfifo_fast_priv *priv = qdisc_priv(qdisc); 630 struct skb_array *q = band2list(priv, band); 631 int err; |
500 | 632 |
501 priv->bitmap |= (1 << band); 502 qdisc->q.qlen++; 503 return __qdisc_enqueue_tail(skb, qdisc, list); 504 } | 633 err = skb_array_produce(q, skb); |
505 | 634 |
506 return qdisc_drop(skb, qdisc, to_free); | 635 if (unlikely(err)) 636 return qdisc_drop_cpu(skb, qdisc, to_free); 637 638 qdisc_qstats_cpu_qlen_inc(qdisc); 639 qdisc_qstats_cpu_backlog_inc(qdisc, skb); 640 return NET_XMIT_SUCCESS; |
507} 508 509static struct sk_buff *pfifo_fast_dequeue(struct Qdisc *qdisc) 510{ 511 struct pfifo_fast_priv *priv = qdisc_priv(qdisc); | 641} 642 643static struct sk_buff *pfifo_fast_dequeue(struct Qdisc *qdisc) 644{ 645 struct pfifo_fast_priv *priv = qdisc_priv(qdisc); |
512 int band = bitmap2band[priv->bitmap]; | 646 struct sk_buff *skb = NULL; 647 int band; |
513 | 648 |
514 if (likely(band >= 0)) { 515 struct qdisc_skb_head *qh = band2list(priv, band); 516 struct sk_buff *skb = __qdisc_dequeue_head(qh); | 649 for (band = 0; band < PFIFO_FAST_BANDS && !skb; band++) { 650 struct skb_array *q = band2list(priv, band); |
517 | 651 |
518 if (likely(skb != NULL)) { 519 qdisc_qstats_backlog_dec(qdisc, skb); 520 qdisc_bstats_update(qdisc, skb); 521 } | 652 if (__skb_array_empty(q)) 653 continue; |
522 | 654 |
523 qdisc->q.qlen--; 524 if (qh->qlen == 0) 525 priv->bitmap &= ~(1 << band); 526 527 return skb; | 655 skb = skb_array_consume_bh(q); |
528 } | 656 } |
657 if (likely(skb)) { 658 qdisc_qstats_cpu_backlog_dec(qdisc, skb); 659 qdisc_bstats_cpu_update(qdisc, skb); 660 qdisc_qstats_cpu_qlen_dec(qdisc); 661 } |
|
529 | 662 |
530 return NULL; | 663 return skb; |
531} 532 533static struct sk_buff *pfifo_fast_peek(struct Qdisc *qdisc) 534{ 535 struct pfifo_fast_priv *priv = qdisc_priv(qdisc); | 664} 665 666static struct sk_buff *pfifo_fast_peek(struct Qdisc *qdisc) 667{ 668 struct pfifo_fast_priv *priv = qdisc_priv(qdisc); |
536 int band = bitmap2band[priv->bitmap]; | 669 struct sk_buff *skb = NULL; 670 int band; |
537 | 671 |
538 if (band >= 0) { 539 struct qdisc_skb_head *qh = band2list(priv, band); | 672 for (band = 0; band < PFIFO_FAST_BANDS && !skb; band++) { 673 struct skb_array *q = band2list(priv, band); |
540 | 674 |
541 return qh->head; | 675 skb = __skb_array_peek(q); |
542 } 543 | 676 } 677 |
544 return NULL; | 678 return skb; |
545} 546 547static void pfifo_fast_reset(struct Qdisc *qdisc) 548{ | 679} 680 681static void pfifo_fast_reset(struct Qdisc *qdisc) 682{ |
549 int prio; | 683 int i, band; |
550 struct pfifo_fast_priv *priv = qdisc_priv(qdisc); 551 | 684 struct pfifo_fast_priv *priv = qdisc_priv(qdisc); 685 |
552 for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) 553 __qdisc_reset_queue(band2list(priv, prio)); | 686 for (band = 0; band < PFIFO_FAST_BANDS; band++) { 687 struct skb_array *q = band2list(priv, band); 688 struct sk_buff *skb; |
554 | 689 |
555 priv->bitmap = 0; 556 qdisc->qstats.backlog = 0; 557 qdisc->q.qlen = 0; | 690 /* NULL ring is possible if destroy path is due to a failed 691 * skb_array_init() in pfifo_fast_init() case. 692 */ 693 if (!q->ring.queue) 694 continue; 695 696 while ((skb = skb_array_consume_bh(q)) != NULL) 697 kfree_skb(skb); 698 } 699 700 for_each_possible_cpu(i) { 701 struct gnet_stats_queue *q = per_cpu_ptr(qdisc->cpu_qstats, i); 702 703 q->backlog = 0; 704 q->qlen = 0; 705 } |
558} 559 560static int pfifo_fast_dump(struct Qdisc *qdisc, struct sk_buff *skb) 561{ 562 struct tc_prio_qopt opt = { .bands = PFIFO_FAST_BANDS }; 563 564 memcpy(&opt.priomap, prio2band, TC_PRIO_MAX + 1); 565 if (nla_put(skb, TCA_OPTIONS, sizeof(opt), &opt)) 566 goto nla_put_failure; 567 return skb->len; 568 569nla_put_failure: 570 return -1; 571} 572 | 706} 707 708static int pfifo_fast_dump(struct Qdisc *qdisc, struct sk_buff *skb) 709{ 710 struct tc_prio_qopt opt = { .bands = PFIFO_FAST_BANDS }; 711 712 memcpy(&opt.priomap, prio2band, TC_PRIO_MAX + 1); 713 if (nla_put(skb, TCA_OPTIONS, sizeof(opt), &opt)) 714 goto nla_put_failure; 715 return skb->len; 716 717nla_put_failure: 718 return -1; 719} 720 |
573static int pfifo_fast_init(struct Qdisc *qdisc, struct nlattr *opt) | 721static int pfifo_fast_init(struct Qdisc *qdisc, struct nlattr *opt, 722 struct netlink_ext_ack *extack) |
574{ | 723{ |
575 int prio; | 724 unsigned int qlen = qdisc_dev(qdisc)->tx_queue_len; |
576 struct pfifo_fast_priv *priv = qdisc_priv(qdisc); | 725 struct pfifo_fast_priv *priv = qdisc_priv(qdisc); |
726 int prio; |
|
577 | 727 |
578 for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) 579 qdisc_skb_head_init(band2list(priv, prio)); | 728 /* guard against zero length rings */ 729 if (!qlen) 730 return -EINVAL; |
580 | 731 |
732 for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) { 733 struct skb_array *q = band2list(priv, prio); 734 int err; 735 736 err = skb_array_init(q, qlen, GFP_KERNEL); 737 if (err) 738 return -ENOMEM; 739 } 740 |
|
581 /* Can by-pass the queue discipline */ 582 qdisc->flags |= TCQ_F_CAN_BYPASS; 583 return 0; 584} 585 | 741 /* Can by-pass the queue discipline */ 742 qdisc->flags |= TCQ_F_CAN_BYPASS; 743 return 0; 744} 745 |
746static void pfifo_fast_destroy(struct Qdisc *sch) 747{ 748 struct pfifo_fast_priv *priv = qdisc_priv(sch); 749 int prio; 750 751 for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) { 752 struct skb_array *q = band2list(priv, prio); 753 754 /* NULL ring is possible if destroy path is due to a failed 755 * skb_array_init() in pfifo_fast_init() case. 756 */ 757 if (!q->ring.queue) 758 continue; 759 /* Destroy ring but no need to kfree_skb because a call to 760 * pfifo_fast_reset() has already done that work. 761 */ 762 ptr_ring_cleanup(&q->ring, NULL); 763 } 764} 765 |
|
586struct Qdisc_ops pfifo_fast_ops __read_mostly = { 587 .id = "pfifo_fast", 588 .priv_size = sizeof(struct pfifo_fast_priv), 589 .enqueue = pfifo_fast_enqueue, 590 .dequeue = pfifo_fast_dequeue, 591 .peek = pfifo_fast_peek, 592 .init = pfifo_fast_init, | 766struct Qdisc_ops pfifo_fast_ops __read_mostly = { 767 .id = "pfifo_fast", 768 .priv_size = sizeof(struct pfifo_fast_priv), 769 .enqueue = pfifo_fast_enqueue, 770 .dequeue = pfifo_fast_dequeue, 771 .peek = pfifo_fast_peek, 772 .init = pfifo_fast_init, |
773 .destroy = pfifo_fast_destroy, |
|
593 .reset = pfifo_fast_reset, 594 .dump = pfifo_fast_dump, 595 .owner = THIS_MODULE, | 774 .reset = pfifo_fast_reset, 775 .dump = pfifo_fast_dump, 776 .owner = THIS_MODULE, |
777 .static_flags = TCQ_F_NOLOCK | TCQ_F_CPUSTATS, |
|
596}; 597EXPORT_SYMBOL(pfifo_fast_ops); 598 599static struct lock_class_key qdisc_tx_busylock; 600static struct lock_class_key qdisc_running_key; 601 602struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue, | 778}; 779EXPORT_SYMBOL(pfifo_fast_ops); 780 781static struct lock_class_key qdisc_tx_busylock; 782static struct lock_class_key qdisc_running_key; 783 784struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue, |
603 const struct Qdisc_ops *ops) | 785 const struct Qdisc_ops *ops, 786 struct netlink_ext_ack *extack) |
604{ 605 void *p; 606 struct Qdisc *sch; 607 unsigned int size = QDISC_ALIGN(sizeof(*sch)) + ops->priv_size; 608 int err = -ENOBUFS; 609 struct net_device *dev; 610 611 if (!dev_queue) { | 787{ 788 void *p; 789 struct Qdisc *sch; 790 unsigned int size = QDISC_ALIGN(sizeof(*sch)) + ops->priv_size; 791 int err = -ENOBUFS; 792 struct net_device *dev; 793 794 if (!dev_queue) { |
795 NL_SET_ERR_MSG(extack, "No device queue given"); |
|
612 err = -EINVAL; 613 goto errout; 614 } 615 616 dev = dev_queue->dev; 617 p = kzalloc_node(size, GFP_KERNEL, 618 netdev_queue_numa_node_read(dev_queue)); 619 --- 5 unchanged lines hidden (view full) --- 625 kfree(p); 626 p = kzalloc_node(size + QDISC_ALIGNTO - 1, GFP_KERNEL, 627 netdev_queue_numa_node_read(dev_queue)); 628 if (!p) 629 goto errout; 630 sch = (struct Qdisc *) QDISC_ALIGN((unsigned long) p); 631 sch->padded = (char *) sch - (char *) p; 632 } | 796 err = -EINVAL; 797 goto errout; 798 } 799 800 dev = dev_queue->dev; 801 p = kzalloc_node(size, GFP_KERNEL, 802 netdev_queue_numa_node_read(dev_queue)); 803 --- 5 unchanged lines hidden (view full) --- 809 kfree(p); 810 p = kzalloc_node(size + QDISC_ALIGNTO - 1, GFP_KERNEL, 811 netdev_queue_numa_node_read(dev_queue)); 812 if (!p) 813 goto errout; 814 sch = (struct Qdisc *) QDISC_ALIGN((unsigned long) p); 815 sch->padded = (char *) sch - (char *) p; 816 } |
817 __skb_queue_head_init(&sch->gso_skb); 818 __skb_queue_head_init(&sch->skb_bad_txq); |
|
633 qdisc_skb_head_init(&sch->q); 634 spin_lock_init(&sch->q.lock); 635 | 819 qdisc_skb_head_init(&sch->q); 820 spin_lock_init(&sch->q.lock); 821 |
822 if (ops->static_flags & TCQ_F_CPUSTATS) { 823 sch->cpu_bstats = 824 netdev_alloc_pcpu_stats(struct gnet_stats_basic_cpu); 825 if (!sch->cpu_bstats) 826 goto errout1; 827 828 sch->cpu_qstats = alloc_percpu(struct gnet_stats_queue); 829 if (!sch->cpu_qstats) { 830 free_percpu(sch->cpu_bstats); 831 goto errout1; 832 } 833 } 834 |
|
636 spin_lock_init(&sch->busylock); 637 lockdep_set_class(&sch->busylock, 638 dev->qdisc_tx_busylock ?: &qdisc_tx_busylock); 639 640 seqcount_init(&sch->running); 641 lockdep_set_class(&sch->running, 642 dev->qdisc_running_key ?: &qdisc_running_key); 643 644 sch->ops = ops; | 835 spin_lock_init(&sch->busylock); 836 lockdep_set_class(&sch->busylock, 837 dev->qdisc_tx_busylock ?: &qdisc_tx_busylock); 838 839 seqcount_init(&sch->running); 840 lockdep_set_class(&sch->running, 841 dev->qdisc_running_key ?: &qdisc_running_key); 842 843 sch->ops = ops; |
844 sch->flags = ops->static_flags; |
|
645 sch->enqueue = ops->enqueue; 646 sch->dequeue = ops->dequeue; 647 sch->dev_queue = dev_queue; 648 dev_hold(dev); 649 refcount_set(&sch->refcnt, 1); 650 651 return sch; | 845 sch->enqueue = ops->enqueue; 846 sch->dequeue = ops->dequeue; 847 sch->dev_queue = dev_queue; 848 dev_hold(dev); 849 refcount_set(&sch->refcnt, 1); 850 851 return sch; |
852errout1: 853 kfree(p); |
|
652errout: 653 return ERR_PTR(err); 654} 655 656struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue, 657 const struct Qdisc_ops *ops, | 854errout: 855 return ERR_PTR(err); 856} 857 858struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue, 859 const struct Qdisc_ops *ops, |
658 unsigned int parentid) | 860 unsigned int parentid, 861 struct netlink_ext_ack *extack) |
659{ 660 struct Qdisc *sch; 661 | 862{ 863 struct Qdisc *sch; 864 |
662 if (!try_module_get(ops->owner)) | 865 if (!try_module_get(ops->owner)) { 866 NL_SET_ERR_MSG(extack, "Failed to increase module reference counter"); |
663 return NULL; | 867 return NULL; |
868 } |
|
664 | 869 |
665 sch = qdisc_alloc(dev_queue, ops); | 870 sch = qdisc_alloc(dev_queue, ops, extack); |
666 if (IS_ERR(sch)) { 667 module_put(ops->owner); 668 return NULL; 669 } 670 sch->parent = parentid; 671 | 871 if (IS_ERR(sch)) { 872 module_put(ops->owner); 873 return NULL; 874 } 875 sch->parent = parentid; 876 |
672 if (!ops->init || ops->init(sch, NULL) == 0) | 877 if (!ops->init || ops->init(sch, NULL, extack) == 0) |
673 return sch; 674 675 qdisc_destroy(sch); 676 return NULL; 677} 678EXPORT_SYMBOL(qdisc_create_dflt); 679 680/* Under qdisc_lock(qdisc) and BH! */ 681 682void qdisc_reset(struct Qdisc *qdisc) 683{ 684 const struct Qdisc_ops *ops = qdisc->ops; | 878 return sch; 879 880 qdisc_destroy(sch); 881 return NULL; 882} 883EXPORT_SYMBOL(qdisc_create_dflt); 884 885/* Under qdisc_lock(qdisc) and BH! */ 886 887void qdisc_reset(struct Qdisc *qdisc) 888{ 889 const struct Qdisc_ops *ops = qdisc->ops; |
890 struct sk_buff *skb, *tmp; |
|
685 686 if (ops->reset) 687 ops->reset(qdisc); 688 | 891 892 if (ops->reset) 893 ops->reset(qdisc); 894 |
689 kfree_skb(qdisc->skb_bad_txq); 690 qdisc->skb_bad_txq = NULL; | 895 skb_queue_walk_safe(&qdisc->gso_skb, skb, tmp) { 896 __skb_unlink(skb, &qdisc->gso_skb); 897 kfree_skb_list(skb); 898 } |
691 | 899 |
692 if (qdisc->gso_skb) { 693 kfree_skb_list(qdisc->gso_skb); 694 qdisc->gso_skb = NULL; | 900 skb_queue_walk_safe(&qdisc->skb_bad_txq, skb, tmp) { 901 __skb_unlink(skb, &qdisc->skb_bad_txq); 902 kfree_skb_list(skb); |
695 } | 903 } |
904 |
|
696 qdisc->q.qlen = 0; 697 qdisc->qstats.backlog = 0; 698} 699EXPORT_SYMBOL(qdisc_reset); 700 | 905 qdisc->q.qlen = 0; 906 qdisc->qstats.backlog = 0; 907} 908EXPORT_SYMBOL(qdisc_reset); 909 |
701static void qdisc_free(struct Qdisc *qdisc) | 910void qdisc_free(struct Qdisc *qdisc) |
702{ 703 if (qdisc_is_percpu_stats(qdisc)) { 704 free_percpu(qdisc->cpu_bstats); 705 free_percpu(qdisc->cpu_qstats); 706 } 707 708 kfree((char *) qdisc - qdisc->padded); 709} 710 711void qdisc_destroy(struct Qdisc *qdisc) 712{ 713 const struct Qdisc_ops *ops = qdisc->ops; | 911{ 912 if (qdisc_is_percpu_stats(qdisc)) { 913 free_percpu(qdisc->cpu_bstats); 914 free_percpu(qdisc->cpu_qstats); 915 } 916 917 kfree((char *) qdisc - qdisc->padded); 918} 919 920void qdisc_destroy(struct Qdisc *qdisc) 921{ 922 const struct Qdisc_ops *ops = qdisc->ops; |
923 struct sk_buff *skb, *tmp; |
|
714 715 if (qdisc->flags & TCQ_F_BUILTIN || 716 !refcount_dec_and_test(&qdisc->refcnt)) 717 return; 718 719#ifdef CONFIG_NET_SCHED 720 qdisc_hash_del(qdisc); 721 722 qdisc_put_stab(rtnl_dereference(qdisc->stab)); 723#endif 724 gen_kill_estimator(&qdisc->rate_est); 725 if (ops->reset) 726 ops->reset(qdisc); 727 if (ops->destroy) 728 ops->destroy(qdisc); 729 730 module_put(ops->owner); 731 dev_put(qdisc_dev(qdisc)); 732 | 924 925 if (qdisc->flags & TCQ_F_BUILTIN || 926 !refcount_dec_and_test(&qdisc->refcnt)) 927 return; 928 929#ifdef CONFIG_NET_SCHED 930 qdisc_hash_del(qdisc); 931 932 qdisc_put_stab(rtnl_dereference(qdisc->stab)); 933#endif 934 gen_kill_estimator(&qdisc->rate_est); 935 if (ops->reset) 936 ops->reset(qdisc); 937 if (ops->destroy) 938 ops->destroy(qdisc); 939 940 module_put(ops->owner); 941 dev_put(qdisc_dev(qdisc)); 942 |
733 kfree_skb_list(qdisc->gso_skb); 734 kfree_skb(qdisc->skb_bad_txq); | 943 skb_queue_walk_safe(&qdisc->gso_skb, skb, tmp) { 944 __skb_unlink(skb, &qdisc->gso_skb); 945 kfree_skb_list(skb); 946 } 947 948 skb_queue_walk_safe(&qdisc->skb_bad_txq, skb, tmp) { 949 __skb_unlink(skb, &qdisc->skb_bad_txq); 950 kfree_skb_list(skb); 951 } 952 |
735 qdisc_free(qdisc); 736} 737EXPORT_SYMBOL(qdisc_destroy); 738 739/* Attach toplevel qdisc to device queue. */ 740struct Qdisc *dev_graft_qdisc(struct netdev_queue *dev_queue, 741 struct Qdisc *qdisc) 742{ 743 struct Qdisc *oqdisc = dev_queue->qdisc_sleeping; 744 spinlock_t *root_lock; 745 746 root_lock = qdisc_lock(oqdisc); 747 spin_lock_bh(root_lock); 748 | 953 qdisc_free(qdisc); 954} 955EXPORT_SYMBOL(qdisc_destroy); 956 957/* Attach toplevel qdisc to device queue. */ 958struct Qdisc *dev_graft_qdisc(struct netdev_queue *dev_queue, 959 struct Qdisc *qdisc) 960{ 961 struct Qdisc *oqdisc = dev_queue->qdisc_sleeping; 962 spinlock_t *root_lock; 963 964 root_lock = qdisc_lock(oqdisc); 965 spin_lock_bh(root_lock); 966 |
749 /* Prune old scheduler */ 750 if (oqdisc && refcount_read(&oqdisc->refcnt) <= 1) 751 qdisc_reset(oqdisc); 752 | |
753 /* ... and graft new one */ 754 if (qdisc == NULL) 755 qdisc = &noop_qdisc; 756 dev_queue->qdisc_sleeping = qdisc; 757 rcu_assign_pointer(dev_queue->qdisc, &noop_qdisc); 758 759 spin_unlock_bh(root_lock); 760 --- 6 unchanged lines hidden (view full) --- 767 void *_unused) 768{ 769 struct Qdisc *qdisc; 770 const struct Qdisc_ops *ops = default_qdisc_ops; 771 772 if (dev->priv_flags & IFF_NO_QUEUE) 773 ops = &noqueue_qdisc_ops; 774 | 967 /* ... and graft new one */ 968 if (qdisc == NULL) 969 qdisc = &noop_qdisc; 970 dev_queue->qdisc_sleeping = qdisc; 971 rcu_assign_pointer(dev_queue->qdisc, &noop_qdisc); 972 973 spin_unlock_bh(root_lock); 974 --- 6 unchanged lines hidden (view full) --- 981 void *_unused) 982{ 983 struct Qdisc *qdisc; 984 const struct Qdisc_ops *ops = default_qdisc_ops; 985 986 if (dev->priv_flags & IFF_NO_QUEUE) 987 ops = &noqueue_qdisc_ops; 988 |
775 qdisc = qdisc_create_dflt(dev_queue, ops, TC_H_ROOT); | 989 qdisc = qdisc_create_dflt(dev_queue, ops, TC_H_ROOT, NULL); |
776 if (!qdisc) { 777 netdev_info(dev, "activation failed\n"); 778 return; 779 } 780 if (!netif_is_multiqueue(dev)) 781 qdisc->flags |= TCQ_F_ONETXQUEUE | TCQ_F_NOPARENT; 782 dev_queue->qdisc_sleeping = qdisc; 783} --- 6 unchanged lines hidden (view full) --- 790 txq = netdev_get_tx_queue(dev, 0); 791 792 if (!netif_is_multiqueue(dev) || 793 dev->priv_flags & IFF_NO_QUEUE) { 794 netdev_for_each_tx_queue(dev, attach_one_default_qdisc, NULL); 795 dev->qdisc = txq->qdisc_sleeping; 796 qdisc_refcount_inc(dev->qdisc); 797 } else { | 990 if (!qdisc) { 991 netdev_info(dev, "activation failed\n"); 992 return; 993 } 994 if (!netif_is_multiqueue(dev)) 995 qdisc->flags |= TCQ_F_ONETXQUEUE | TCQ_F_NOPARENT; 996 dev_queue->qdisc_sleeping = qdisc; 997} --- 6 unchanged lines hidden (view full) --- 1004 txq = netdev_get_tx_queue(dev, 0); 1005 1006 if (!netif_is_multiqueue(dev) || 1007 dev->priv_flags & IFF_NO_QUEUE) { 1008 netdev_for_each_tx_queue(dev, attach_one_default_qdisc, NULL); 1009 dev->qdisc = txq->qdisc_sleeping; 1010 qdisc_refcount_inc(dev->qdisc); 1011 } else { |
798 qdisc = qdisc_create_dflt(txq, &mq_qdisc_ops, TC_H_ROOT); | 1012 qdisc = qdisc_create_dflt(txq, &mq_qdisc_ops, TC_H_ROOT, NULL); |
799 if (qdisc) { 800 dev->qdisc = qdisc; 801 qdisc->ops->attach(qdisc); 802 } 803 } 804#ifdef CONFIG_NET_SCHED 805 if (dev->qdisc != &noop_qdisc) 806 qdisc_hash_add(dev->qdisc, false); --- 73 unchanged lines hidden (view full) --- 880 for (i = 0; i < dev->num_tx_queues; i++) { 881 struct netdev_queue *dev_queue; 882 spinlock_t *root_lock; 883 struct Qdisc *q; 884 int val; 885 886 dev_queue = netdev_get_tx_queue(dev, i); 887 q = dev_queue->qdisc_sleeping; | 1013 if (qdisc) { 1014 dev->qdisc = qdisc; 1015 qdisc->ops->attach(qdisc); 1016 } 1017 } 1018#ifdef CONFIG_NET_SCHED 1019 if (dev->qdisc != &noop_qdisc) 1020 qdisc_hash_add(dev->qdisc, false); --- 73 unchanged lines hidden (view full) --- 1094 for (i = 0; i < dev->num_tx_queues; i++) { 1095 struct netdev_queue *dev_queue; 1096 spinlock_t *root_lock; 1097 struct Qdisc *q; 1098 int val; 1099 1100 dev_queue = netdev_get_tx_queue(dev, i); 1101 q = dev_queue->qdisc_sleeping; |
888 root_lock = qdisc_lock(q); | |
889 | 1102 |
890 spin_lock_bh(root_lock); | 1103 if (q->flags & TCQ_F_NOLOCK) { 1104 val = test_bit(__QDISC_STATE_SCHED, &q->state); 1105 } else { 1106 root_lock = qdisc_lock(q); 1107 spin_lock_bh(root_lock); |
891 | 1108 |
892 val = (qdisc_is_running(q) || 893 test_bit(__QDISC_STATE_SCHED, &q->state)); | 1109 val = (qdisc_is_running(q) || 1110 test_bit(__QDISC_STATE_SCHED, &q->state)); |
894 | 1111 |
895 spin_unlock_bh(root_lock); | 1112 spin_unlock_bh(root_lock); 1113 } |
896 897 if (val) 898 return true; 899 } 900 return false; 901} 902 | 1114 1115 if (val) 1116 return true; 1117 } 1118 return false; 1119} 1120 |
1121static void dev_qdisc_reset(struct net_device *dev, 1122 struct netdev_queue *dev_queue, 1123 void *none) 1124{ 1125 struct Qdisc *qdisc = dev_queue->qdisc_sleeping; 1126 1127 if (qdisc) 1128 qdisc_reset(qdisc); 1129} 1130 |
|
903/** 904 * dev_deactivate_many - deactivate transmissions on several devices 905 * @head: list of devices to deactivate 906 * 907 * This function returns only when all outstanding transmissions 908 * have completed, unless all devices are in dismantle phase. 909 */ 910void dev_deactivate_many(struct list_head *head) 911{ 912 struct net_device *dev; | 1131/** 1132 * dev_deactivate_many - deactivate transmissions on several devices 1133 * @head: list of devices to deactivate 1134 * 1135 * This function returns only when all outstanding transmissions 1136 * have completed, unless all devices are in dismantle phase. 1137 */ 1138void dev_deactivate_many(struct list_head *head) 1139{ 1140 struct net_device *dev; |
913 bool sync_needed = false; | |
914 915 list_for_each_entry(dev, head, close_list) { 916 netdev_for_each_tx_queue(dev, dev_deactivate_queue, 917 &noop_qdisc); 918 if (dev_ingress_queue(dev)) 919 dev_deactivate_queue(dev, dev_ingress_queue(dev), 920 &noop_qdisc); 921 922 dev_watchdog_down(dev); | 1141 1142 list_for_each_entry(dev, head, close_list) { 1143 netdev_for_each_tx_queue(dev, dev_deactivate_queue, 1144 &noop_qdisc); 1145 if (dev_ingress_queue(dev)) 1146 dev_deactivate_queue(dev, dev_ingress_queue(dev), 1147 &noop_qdisc); 1148 1149 dev_watchdog_down(dev); |
923 sync_needed |= !dev->dismantle; | |
924 } 925 926 /* Wait for outstanding qdisc-less dev_queue_xmit calls. 927 * This is avoided if all devices are in dismantle phase : 928 * Caller will call synchronize_net() for us 929 */ | 1150 } 1151 1152 /* Wait for outstanding qdisc-less dev_queue_xmit calls. 1153 * This is avoided if all devices are in dismantle phase : 1154 * Caller will call synchronize_net() for us 1155 */ |
930 if (sync_needed) 931 synchronize_net(); | 1156 synchronize_net(); |
932 933 /* Wait for outstanding qdisc_run calls. */ | 1157 1158 /* Wait for outstanding qdisc_run calls. */ |
934 list_for_each_entry(dev, head, close_list) | 1159 list_for_each_entry(dev, head, close_list) { |
935 while (some_qdisc_is_busy(dev)) 936 yield(); | 1160 while (some_qdisc_is_busy(dev)) 1161 yield(); |
1162 /* The new qdisc is assigned at this point so we can safely 1163 * unwind stale skb lists and qdisc statistics 1164 */ 1165 netdev_for_each_tx_queue(dev, dev_qdisc_reset, NULL); 1166 if (dev_ingress_queue(dev)) 1167 dev_qdisc_reset(dev, dev_ingress_queue(dev), NULL); 1168 } |
|
937} 938 939void dev_deactivate(struct net_device *dev) 940{ 941 LIST_HEAD(single); 942 943 list_add(&dev->close_list, &single); 944 dev_deactivate_many(&single); --- 4 unchanged lines hidden (view full) --- 949static void dev_init_scheduler_queue(struct net_device *dev, 950 struct netdev_queue *dev_queue, 951 void *_qdisc) 952{ 953 struct Qdisc *qdisc = _qdisc; 954 955 rcu_assign_pointer(dev_queue->qdisc, qdisc); 956 dev_queue->qdisc_sleeping = qdisc; | 1169} 1170 1171void dev_deactivate(struct net_device *dev) 1172{ 1173 LIST_HEAD(single); 1174 1175 list_add(&dev->close_list, &single); 1176 dev_deactivate_many(&single); --- 4 unchanged lines hidden (view full) --- 1181static void dev_init_scheduler_queue(struct net_device *dev, 1182 struct netdev_queue *dev_queue, 1183 void *_qdisc) 1184{ 1185 struct Qdisc *qdisc = _qdisc; 1186 1187 rcu_assign_pointer(dev_queue->qdisc, qdisc); 1188 dev_queue->qdisc_sleeping = qdisc; |
1189 __skb_queue_head_init(&qdisc->gso_skb); 1190 __skb_queue_head_init(&qdisc->skb_bad_txq); |
|
957} 958 959void dev_init_scheduler(struct net_device *dev) 960{ 961 dev->qdisc = &noop_qdisc; 962 netdev_for_each_tx_queue(dev, dev_init_scheduler_queue, &noop_qdisc); 963 if (dev_ingress_queue(dev)) 964 dev_init_scheduler_queue(dev, dev_ingress_queue(dev), &noop_qdisc); --- 113 unchanged lines hidden --- | 1191} 1192 1193void dev_init_scheduler(struct net_device *dev) 1194{ 1195 dev->qdisc = &noop_qdisc; 1196 netdev_for_each_tx_queue(dev, dev_init_scheduler_queue, &noop_qdisc); 1197 if (dev_ingress_queue(dev)) 1198 dev_init_scheduler_queue(dev, dev_ingress_queue(dev), &noop_qdisc); --- 113 unchanged lines hidden --- |