Skip to content

Commit ccd4eb4

Browse files
ibrianodavem330
authored andcommitted
net/packet: Fix Tx queue selection for AF_PACKET
When PACKET_QDISC_BYPASS is not used, Tx queue selection will be done before the packet is enqueued, taking into account any mappings set by a queuing discipline such as mqprio without hardware offloading. This selection may be affected by a previously saved queue_mapping, either on the Rx path, or done before the packet reaches the device, as it's currently the case for AF_PACKET. In order for queue selection to work as expected when using traffic control, there can't be another selection done before that point is reached, so move the call to packet_pick_tx_queue to packet_direct_xmit, leaving the default xmit path as it was before PACKET_QDISC_BYPASS was introduced. A forward declaration of packet_pick_tx_queue() is introduced to avoid the need to reorder the functions within the file. Fixes: d346a3f ("packet: introduce PACKET_QDISC_BYPASS socket option") Signed-off-by: Iván Briano <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 31a4562 commit ccd4eb4

File tree

1 file changed

+2
-4
lines changed

1 file changed

+2
-4
lines changed

net/packet/af_packet.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ static void prb_clear_rxhash(struct tpacket_kbdq_core *,
214214
static void prb_fill_vlan_info(struct tpacket_kbdq_core *,
215215
struct tpacket3_hdr *);
216216
static void packet_flush_mclist(struct sock *sk);
217+
static void packet_pick_tx_queue(struct net_device *dev, struct sk_buff *skb);
217218

218219
struct packet_skb_cb {
219220
union {
@@ -260,6 +261,7 @@ static int packet_direct_xmit(struct sk_buff *skb)
260261
if (skb != orig_skb)
261262
goto drop;
262263

264+
packet_pick_tx_queue(dev, skb);
263265
txq = skb_get_tx_queue(dev, skb);
264266

265267
local_bh_disable();
@@ -2747,8 +2749,6 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
27472749
goto tpacket_error;
27482750
}
27492751

2750-
packet_pick_tx_queue(dev, skb);
2751-
27522752
skb->destructor = tpacket_destruct_skb;
27532753
__packet_set_status(po, ph, TP_STATUS_SENDING);
27542754
packet_inc_pending(&po->tx_ring);
@@ -2931,8 +2931,6 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
29312931
skb->priority = sk->sk_priority;
29322932
skb->mark = sockc.mark;
29332933

2934-
packet_pick_tx_queue(dev, skb);
2935-
29362934
if (po->has_vnet_hdr) {
29372935
err = virtio_net_hdr_to_skb(skb, &vnet_hdr, vio_le());
29382936
if (err)

0 commit comments

Comments
 (0)