[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <5546065B.6080706@fokus.fraunhofer.de>
Date: Sun, 3 May 2015 13:28:27 +0200
From: Mathias Kretschmer <mathias.kretschmer@...us.fraunhofer.de>
To: <netdev@...r.kernel.org>
CC: Daniel Borkmann <daniel@...earbox.net>
Subject: PATCH: af_packet / TX_RING not fully non-blocking (w/ MSG_DONTWAIT)
Hi,
following up on my initial post and the feedback I have received,
please find attached/in-line an updated patch.
Changes:
*) keep the unlikely() in the case sock_alloc_send_skb() fails, as here
we enter the slow path, anyway.
*) pass on the return code from sock_alloc_send_skb(), i.e. EGAIN
Please consider this for inclusion.
Cheers,
Mathias
---
diff -uNpr linux-3.16.7.orig/net/packet/af_packet.c
linux-3.16.7/net/packet/af_packet.c
--- linux-3.16.7.orig/net/packet/af_packet.c 2014-10-30
16:41:01.000000000 +0000
+++ linux-3.16.7/net/packet/af_packet.c 2015-04-05 08:41:14.577535454 +0000
@@ -2291,11 +2291,14 @@ static int tpacket_snd(struct packet_soc
tlen = dev->needed_tailroom;
skb = sock_alloc_send_skb(&po->sk,
hlen + tlen + sizeof(struct sockaddr_ll),
- 0, &err);
+ !need_wait, &err);
- if (unlikely(skb == NULL))
+ if (unlikely(skb == NULL)) {
+ /* we assume the socket was initially writeable
... */
+ if (likely(len_sum > 0))
+ err = len_sum;
goto out_status;
-
+ }
tp_len = tpacket_fill_skb(po, skb, ph, dev, size_max,
proto,
addr, hlen);
if (tp_len > dev->mtu + dev->hard_header_len) {
View attachment "005-af_packet_no_block_tx.patch" of type "text/x-patch" (803 bytes)
Powered by blists - more mailing lists