[12/27] UBUNTU: SAUCE: net: Add support for handling queueing in hardware

Submitted by Benjamin Collins on July 13, 2011, 1:52 p.m.

Details

Message ID b96a5b90e62909954abe8c308d33f16897d3d117.1339455422.git.bcollins@ubuntu.com
State New
Headers show

Commit Message

Benjamin Collins July 13, 2011, 1:52 p.m.
The QDisc code does a bunch of locking which is unnecessary if
you have hardware which handles all of the queueing.  Add
support for this, and skip over all of the queueing code if
the feature is enabled on a given device. This code breaks
QDisc support on dpaa_eth, and also coopts the FCOE feature
bit.

This patch is being maintained and will eventually be merged upstream by
Freescale directly. The powerpc-e500mc flavour uses this.

Signed-off-by: Andy Fleming <afleming@freescale.com>
Signed-off-by: Ben Collins <bcollins@ubuntu.com>
---
 include/linux/netdev_features.h |    2 ++
 net/core/dev.c                  |    6 ++++++
 2 files changed, 8 insertions(+)

Patch hide | download patch | download mbox

diff --git a/include/linux/netdev_features.h b/include/linux/netdev_features.h
index 5ac3212..0de1a9a 100644
--- a/include/linux/netdev_features.h
+++ b/include/linux/netdev_features.h
@@ -56,6 +56,7 @@  enum {
 	NETIF_F_LOOPBACK_BIT,		/* Enable loopback */
 	NETIF_F_RXFCS_BIT,		/* Append FCS to skb pkt data */
 	NETIF_F_RXALL_BIT,		/* Receive errored frames too */
+	NETIF_F_HW_QDISC_BIT,		/* Supports hardware Qdisc */
 
 	/*
 	 * Add your fresh new feature above and remember to update
@@ -80,6 +81,7 @@  enum {
 #define NETIF_F_GSO_ROBUST	__NETIF_F(GSO_ROBUST)
 #define NETIF_F_HIGHDMA		__NETIF_F(HIGHDMA)
 #define NETIF_F_HW_CSUM		__NETIF_F(HW_CSUM)
+#define NETIF_F_HW_QDISC	__NETIF_F(HW_QDISC)
 #define NETIF_F_HW_VLAN_FILTER	__NETIF_F(HW_VLAN_FILTER)
 #define NETIF_F_HW_VLAN_RX	__NETIF_F(HW_VLAN_RX)
 #define NETIF_F_HW_VLAN_TX	__NETIF_F(HW_VLAN_TX)
diff --git a/net/core/dev.c b/net/core/dev.c
index cd09819..0d78fa5 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -2514,6 +2514,12 @@  int dev_queue_xmit(struct sk_buff *skb)
 
 	skb_update_prio(skb);
 
+	if (dev->features & NETIF_F_HW_QDISC) {
+		txq = dev_pick_tx(dev, skb);
+		rc = dev_hard_start_xmit(skb, dev, txq);
+		goto out;
+	}
+
 	txq = dev_pick_tx(dev, skb);
 	q = rcu_dereference_bh(txq->qdisc);