summaryrefslogtreecommitdiffstats
path: root/net/packet/af_packet.c
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2014-03-17 15:17:07 +0100
committerArnd Bergmann <arnd@arndb.de>2014-03-17 15:17:07 +0100
commit38edc2da5014e70e46a724d97c3ef3dde106331b (patch)
tree590499bacd062e8dd74c6f05a7d811dd714a2d70 /net/packet/af_packet.c
parent937b5991ca7717ceba99014f2ad3f51c85cdb9ad (diff)
parent28b191118c11719bb27db621425a70be28a40e08 (diff)
Merge tag 'omap-for-v3.15/dt-overo-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into next/dt
Updates to the .dts files to support more Gumstix boards. These are sent separately from the rest of the .dts changes as these depend on the fixes merged into v3.14-rc4, and needed a bit more time to get updated on the fixes. * tag 'omap-for-v3.15/dt-overo-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap: ARM: dts: Add support for the Overo Summit ARM: dts: Add support for the Overo Chestnut43 ARM: dts: Add support for the Overo Alto35 ARM: dts: Add support for the Overo Gallop43 ARM: dts: Add support for the Overo Palo43 ARM: dts: overo: Add LIS33DE accelerometer ARM: dts: overo: Create a file for common Gumstix peripherals ARM: dts: overo: Push uart3 pinmux down to expansion board ARM: dts: omap3-tobi: Add AT24C01 EEPROM ARM: dts: omap3-tobi: Use include file omap-gpmc-smsc9221 ARM: dts: omap: Add common file for SMSC9221 ARM: dts: omap3-overo: Add HSUSB PHY ARM: dts: omap3-overo: Enable WiFi/BT combo ARM: dts: omap3-overo: Add missing pinctrl ARM: dts: omap3-tobi: Add missing pinctrl ARM: dts: overo: reorganize include files Signed-off-by: Arnd Bergmann <arnd@arndb.de> Conflicts: arch/arm/boot/dts/omap3-overo.dtsi
Diffstat (limited to 'net/packet/af_packet.c')
-rw-r--r--net/packet/af_packet.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index 6a2bb37506c..48a6a93db29 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -308,11 +308,27 @@ static bool packet_use_direct_xmit(const struct packet_sock *po)
return po->xmit == packet_direct_xmit;
}
-static u16 packet_pick_tx_queue(struct net_device *dev)
+static u16 __packet_pick_tx_queue(struct net_device *dev, struct sk_buff *skb)
{
return (u16) raw_smp_processor_id() % dev->real_num_tx_queues;
}
+static void packet_pick_tx_queue(struct net_device *dev, struct sk_buff *skb)
+{
+ const struct net_device_ops *ops = dev->netdev_ops;
+ u16 queue_index;
+
+ if (ops->ndo_select_queue) {
+ queue_index = ops->ndo_select_queue(dev, skb, NULL,
+ __packet_pick_tx_queue);
+ queue_index = netdev_cap_txqueue(dev, queue_index);
+ } else {
+ queue_index = __packet_pick_tx_queue(dev, skb);
+ }
+
+ skb_set_queue_mapping(skb, queue_index);
+}
+
/* register_prot_hook must be invoked with the po->bind_lock held,
* or from a context in which asynchronous accesses to the packet
* socket is not possible (packet_create()).
@@ -2285,7 +2301,8 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
}
}
- skb_set_queue_mapping(skb, packet_pick_tx_queue(dev));
+ packet_pick_tx_queue(dev, skb);
+
skb->destructor = tpacket_destruct_skb;
__packet_set_status(po, ph, TP_STATUS_SENDING);
packet_inc_pending(&po->tx_ring);
@@ -2499,7 +2516,8 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
skb->dev = dev;
skb->priority = sk->sk_priority;
skb->mark = sk->sk_mark;
- skb_set_queue_mapping(skb, packet_pick_tx_queue(dev));
+
+ packet_pick_tx_queue(dev, skb);
if (po->has_vnet_hdr) {
if (vnet_hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) {
@@ -3786,7 +3804,7 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u,
*/
if (!tx_ring)
init_prb_bdqc(po, rb, pg_vec, req_u, tx_ring);
- break;
+ break;
default:
break;
}