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-04 08:31:20.311554717 +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 (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) {