af_packet / TX_RING not fully non-blocking (w/ MSG_DONTWAIT).
This patch fixes an issue where the send(MSG_DONTWAIT) call on a TX_RING is not fully non-blocking in cases where the device's sndBuf is full. We pass nonblock=true to sock_alloc_send_skb() and return any possibly occuring error code (most likely EGAIN) to the caller. As the fast-path stays as it is, we keep the unlikely() around skb == NULL. Signed-off-by: Mathias Kretschmer <mathias.kretschmer@fokus.fraunhofer.de> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
cd9c399777
Коммит
fbf33a2802
|
@ -2311,11 +2311,14 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
|
|||
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) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче