aboutsummaryrefslogtreecommitdiffstats
path: root/net/sched/sch_teql.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sched/sch_teql.c')
-rw-r--r--net/sched/sch_teql.c32
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
64struct teql_sched_data 68struct 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,
275static netdev_tx_t teql_master_xmit(struct sk_buff *skb, struct net_device *dev) 278static 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
349drop: 350drop:
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
404static 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
403static int teql_master_mtu(struct net_device *dev, int new_mtu) 416static 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