diff options
Diffstat (limited to 'net/sched/sch_teql.c')
-rw-r--r-- | net/sched/sch_teql.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/net/sched/sch_teql.c b/net/sched/sch_teql.c index 401af9596709..84ce48eadff4 100644 --- a/net/sched/sch_teql.c +++ b/net/sched/sch_teql.c | |||
@@ -59,6 +59,10 @@ struct teql_master | |||
59 | struct net_device *dev; | 59 | struct net_device *dev; |
60 | struct Qdisc *slaves; | 60 | struct Qdisc *slaves; |
61 | struct list_head master_list; | 61 | struct list_head master_list; |
62 | unsigned long tx_bytes; | ||
63 | unsigned long tx_packets; | ||
64 | unsigned long tx_errors; | ||
65 | unsigned long tx_dropped; | ||
62 | }; | 66 | }; |
63 | 67 | ||
64 | struct teql_sched_data | 68 | struct teql_sched_data |
@@ -83,8 +87,7 @@ teql_enqueue(struct sk_buff *skb, struct Qdisc* sch) | |||
83 | 87 | ||
84 | if (q->q.qlen < dev->tx_queue_len) { | 88 | if (q->q.qlen < dev->tx_queue_len) { |
85 | __skb_queue_tail(&q->q, skb); | 89 | __skb_queue_tail(&q->q, skb); |
86 | sch->bstats.bytes += qdisc_pkt_len(skb); | 90 | qdisc_bstats_update(sch, skb); |
87 | sch->bstats.packets++; | ||
88 | return NET_XMIT_SUCCESS; | 91 | return NET_XMIT_SUCCESS; |
89 | } | 92 | } |
90 | 93 | ||
@@ -275,7 +278,6 @@ static inline int teql_resolve(struct sk_buff *skb, | |||
275 | static netdev_tx_t teql_master_xmit(struct sk_buff *skb, struct net_device *dev) | 278 | static netdev_tx_t teql_master_xmit(struct sk_buff *skb, struct net_device *dev) |
276 | { | 279 | { |
277 | struct teql_master *master = netdev_priv(dev); | 280 | struct teql_master *master = netdev_priv(dev); |
278 | struct netdev_queue *txq = netdev_get_tx_queue(dev, 0); | ||
279 | struct Qdisc *start, *q; | 281 | struct Qdisc *start, *q; |
280 | int busy; | 282 | int busy; |
281 | int nores; | 283 | int nores; |
@@ -309,15 +311,14 @@ restart: | |||
309 | if (__netif_tx_trylock(slave_txq)) { | 311 | if (__netif_tx_trylock(slave_txq)) { |
310 | unsigned int length = qdisc_pkt_len(skb); | 312 | unsigned int length = qdisc_pkt_len(skb); |
311 | 313 | ||
312 | if (!netif_tx_queue_stopped(slave_txq) && | 314 | if (!netif_tx_queue_frozen_or_stopped(slave_txq) && |
313 | !netif_tx_queue_frozen(slave_txq) && | ||
314 | slave_ops->ndo_start_xmit(skb, slave) == NETDEV_TX_OK) { | 315 | slave_ops->ndo_start_xmit(skb, slave) == NETDEV_TX_OK) { |
315 | txq_trans_update(slave_txq); | 316 | txq_trans_update(slave_txq); |
316 | __netif_tx_unlock(slave_txq); | 317 | __netif_tx_unlock(slave_txq); |
317 | master->slaves = NEXT_SLAVE(q); | 318 | master->slaves = NEXT_SLAVE(q); |
318 | netif_wake_queue(dev); | 319 | netif_wake_queue(dev); |
319 | txq->tx_packets++; | 320 | master->tx_packets++; |
320 | txq->tx_bytes += length; | 321 | master->tx_bytes += length; |
321 | return NETDEV_TX_OK; | 322 | return NETDEV_TX_OK; |
322 | } | 323 | } |
323 | __netif_tx_unlock(slave_txq); | 324 | __netif_tx_unlock(slave_txq); |
@@ -344,10 +345,10 @@ restart: | |||
344 | netif_stop_queue(dev); | 345 | netif_stop_queue(dev); |
345 | return NETDEV_TX_BUSY; | 346 | return NETDEV_TX_BUSY; |
346 | } | 347 | } |
347 | dev->stats.tx_errors++; | 348 | master->tx_errors++; |
348 | 349 | ||
349 | drop: | 350 | drop: |
350 | txq->tx_dropped++; | 351 | master->tx_dropped++; |
351 | dev_kfree_skb(skb); | 352 | dev_kfree_skb(skb); |
352 | return NETDEV_TX_OK; | 353 | return NETDEV_TX_OK; |
353 | } | 354 | } |
@@ -400,6 +401,18 @@ static int teql_master_close(struct net_device *dev) | |||
400 | return 0; | 401 | return 0; |
401 | } | 402 | } |
402 | 403 | ||
404 | static struct rtnl_link_stats64 *teql_master_stats64(struct net_device *dev, | ||
405 | struct rtnl_link_stats64 *stats) | ||
406 | { | ||
407 | struct teql_master *m = netdev_priv(dev); | ||
408 | |||
409 | stats->tx_packets = m->tx_packets; | ||
410 | stats->tx_bytes = m->tx_bytes; | ||
411 | stats->tx_errors = m->tx_errors; | ||
412 | stats->tx_dropped = m->tx_dropped; | ||
413 | return stats; | ||
414 | } | ||
415 | |||
403 | static int teql_master_mtu(struct net_device *dev, int new_mtu) | 416 | static int teql_master_mtu(struct net_device *dev, int new_mtu) |
404 | { | 417 | { |
405 | struct teql_master *m = netdev_priv(dev); | 418 | struct teql_master *m = netdev_priv(dev); |
@@ -424,6 +437,7 @@ static const struct net_device_ops teql_netdev_ops = { | |||
424 | .ndo_open = teql_master_open, | 437 | .ndo_open = teql_master_open, |
425 | .ndo_stop = teql_master_close, | 438 | .ndo_stop = teql_master_close, |
426 | .ndo_start_xmit = teql_master_xmit, | 439 | .ndo_start_xmit = teql_master_xmit, |
440 | .ndo_get_stats64 = teql_master_stats64, | ||
427 | .ndo_change_mtu = teql_master_mtu, | 441 | .ndo_change_mtu = teql_master_mtu, |
428 | }; | 442 | }; |
429 | 443 | ||