aboutsummaryrefslogtreecommitdiffstats
path: root/net/sched
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2008-07-17 04:56:23 -0400
committerDavid S. Miller <davem@davemloft.net>2008-07-17 22:21:07 -0400
commitfd2ea0a79faad824258af5dcec1927aa24d81c16 (patch)
tree644fd4ce92227cc319c7a54c63ea07a96b8c6b8d /net/sched
parent24344d2600108b9b79a60c0e4c43b3c499856d14 (diff)
net: Use queue aware tests throughout.
This effectively "flips the switch" by making the core networking and multiqueue-aware drivers use the new TX multiqueue structures. Non-multiqueue drivers need no changes. The interfaces they use such as netif_stop_queue() degenerate into an operation on TX queue zero. So everything "just works" for them. Code that really wants to do "X" to all TX queues now invokes a routine that does so, such as netif_tx_wake_all_queues(), netif_tx_stop_all_queues(), etc. pktgen and netpoll required a little bit more surgery than the others. In particular the pktgen changes, whilst functional, could be largely improved. The initial check in pktgen_xmit() will sometimes check the wrong queue, which is mostly harmless. The thing to do is probably to invoke fill_packet() earlier. The bulk of the netpoll changes is to make the code operate solely on the TX queue indicated by by the SKB queue mapping. Setting of the SKB queue mapping is entirely confined inside of net/core/dev.c:dev_pick_tx(). If we end up needing any kind of special semantics (drops, for example) it will be implemented here. Finally, we now have a "real_num_tx_queues" which is where the driver indicates how many TX queues are actually active. With IGB changes from Jeff Kirsher. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched')
-rw-r--r--net/sched/sch_generic.c5
-rw-r--r--net/sched/sch_teql.c6
2 files changed, 4 insertions, 7 deletions
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
index 4e2b865cbba0..2f575b9017d1 100644
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
@@ -166,7 +166,7 @@ static inline int qdisc_restart(struct netdev_queue *txq)
166 166
167 HARD_TX_LOCK(dev, txq, smp_processor_id()); 167 HARD_TX_LOCK(dev, txq, smp_processor_id());
168 if (!netif_subqueue_stopped(dev, skb)) 168 if (!netif_subqueue_stopped(dev, skb))
169 ret = dev_hard_start_xmit(skb, dev); 169 ret = dev_hard_start_xmit(skb, dev, txq);
170 HARD_TX_UNLOCK(dev, txq); 170 HARD_TX_UNLOCK(dev, txq);
171 171
172 spin_lock(&txq->lock); 172 spin_lock(&txq->lock);
@@ -198,11 +198,10 @@ static inline int qdisc_restart(struct netdev_queue *txq)
198 198
199void __qdisc_run(struct netdev_queue *txq) 199void __qdisc_run(struct netdev_queue *txq)
200{ 200{
201 struct net_device *dev = txq->dev;
202 unsigned long start_time = jiffies; 201 unsigned long start_time = jiffies;
203 202
204 while (qdisc_restart(txq)) { 203 while (qdisc_restart(txq)) {
205 if (netif_queue_stopped(dev)) 204 if (netif_tx_queue_stopped(txq))
206 break; 205 break;
207 206
208 /* 207 /*
diff --git a/net/sched/sch_teql.c b/net/sched/sch_teql.c
index 44a2c3451f4d..ade3372221c7 100644
--- a/net/sched/sch_teql.c
+++ b/net/sched/sch_teql.c
@@ -295,8 +295,7 @@ restart:
295 slave_txq = netdev_get_tx_queue(slave, 0); 295 slave_txq = netdev_get_tx_queue(slave, 0);
296 if (slave_txq->qdisc_sleeping != q) 296 if (slave_txq->qdisc_sleeping != q)
297 continue; 297 continue;
298 if (netif_queue_stopped(slave) || 298 if (__netif_subqueue_stopped(slave, subq) ||
299 __netif_subqueue_stopped(slave, subq) ||
300 !netif_running(slave)) { 299 !netif_running(slave)) {
301 busy = 1; 300 busy = 1;
302 continue; 301 continue;
@@ -305,8 +304,7 @@ restart:
305 switch (teql_resolve(skb, skb_res, slave)) { 304 switch (teql_resolve(skb, skb_res, slave)) {
306 case 0: 305 case 0:
307 if (netif_tx_trylock(slave)) { 306 if (netif_tx_trylock(slave)) {
308 if (!netif_queue_stopped(slave) && 307 if (!__netif_subqueue_stopped(slave, subq) &&
309 !__netif_subqueue_stopped(slave, subq) &&
310 slave->hard_start_xmit(skb, slave) == 0) { 308 slave->hard_start_xmit(skb, slave) == 0) {
311 netif_tx_unlock(slave); 309 netif_tx_unlock(slave);
312 master->slaves = NEXT_SLAVE(q); 310 master->slaves = NEXT_SLAVE(q);