]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.18-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 24 Oct 2017 12:15:22 +0000 (14:15 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 24 Oct 2017 12:15:22 +0000 (14:15 +0200)
added patches:
af_packet-don-t-pass-empty-blocks-for-packet_v3.patch

queue-3.18/af_packet-don-t-pass-empty-blocks-for-packet_v3.patch [new file with mode: 0644]
queue-3.18/series

diff --git a/queue-3.18/af_packet-don-t-pass-empty-blocks-for-packet_v3.patch b/queue-3.18/af_packet-don-t-pass-empty-blocks-for-packet_v3.patch
new file mode 100644 (file)
index 0000000..a278097
--- /dev/null
@@ -0,0 +1,56 @@
+From 41a50d621a321b4c15273cc1b5ed41437f4acdfb Mon Sep 17 00:00:00 2001
+From: Alexander Drozdov <al.drozdov@gmail.com>
+Date: Tue, 24 Feb 2015 08:18:28 +0300
+Subject: af_packet: don't pass empty blocks for PACKET_V3
+
+From: Alexander Drozdov <al.drozdov@gmail.com>
+
+commit 41a50d621a321b4c15273cc1b5ed41437f4acdfb upstream.
+
+Before da413eec729d ("packet: Fixed TPACKET V3 to signal poll when block is
+closed rather than every packet") poll listening for an af_packet socket was
+not signaled if there was no packets to process. After the patch poll is
+signaled evety time when block retire timer expires. That happens because
+af_packet closes the current block on timeout even if the block is empty.
+
+Passing empty blocks to the user not only wastes CPU but also wastes ring
+buffer space increasing probability of packets dropping on small timeouts.
+
+Signed-off-by: Alexander Drozdov <al.drozdov@gmail.com>
+Cc: Dan Collins <dan@dcollins.co.nz>
+Cc: Willem de Bruijn <willemb@google.com>
+Cc: Guy Harris <guy@alum.mit.edu>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Cc: Christoph Biedl <linux-kernel.bfrz@manchmal.in-ulm.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ net/packet/af_packet.c |   10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+--- a/net/packet/af_packet.c
++++ b/net/packet/af_packet.c
+@@ -697,6 +697,10 @@ static void prb_retire_rx_blk_timer_expi
+       if (pkc->last_kactive_blk_num == pkc->kactive_blk_num) {
+               if (!frozen) {
++                      if (!BLOCK_NUM_PKTS(pbd)) {
++                              /* An empty block. Just refresh the timer. */
++                              goto refresh_timer;
++                      }
+                       prb_retire_current_block(pkc, po, TP_STATUS_BLK_TMO);
+                       if (!prb_dispatch_next_block(pkc, po))
+                               goto refresh_timer;
+@@ -796,7 +800,11 @@ static void prb_close_block(struct tpack
+               h1->ts_last_pkt.ts_sec = last_pkt->tp_sec;
+               h1->ts_last_pkt.ts_nsec = last_pkt->tp_nsec;
+       } else {
+-              /* Ok, we tmo'd - so get the current time */
++              /* Ok, we tmo'd - so get the current time.
++               *
++               * It shouldn't really happen as we don't close empty
++               * blocks. See prb_retire_rx_blk_timer_expired().
++               */
+               struct timespec ts;
+               getnstimeofday(&ts);
+               h1->ts_last_pkt.ts_sec = ts.tv_sec;
index 02e6ee1e7d8e38ca0e362695d3ef7f3e27ef55b8..10377a76fbaeb93547baf5ae17d4d2fb9992bdfe 100644 (file)
@@ -17,3 +17,4 @@ keys-don-t-let-add_key-update-an-uninstantiated-key.patch
 cls_api.c-fix-dumping-of-non-existing-actions-stats.patch
 parisc-avoid-trashing-sr2-and-sr3-in-lws-code.patch
 parisc-fix-double-word-compare-and-exchange-in-lws-code-on-32-bit-kernels.patch
+af_packet-don-t-pass-empty-blocks-for-packet_v3.patch