From: Greg Kroah-Hartman Date: Tue, 24 Oct 2017 12:15:22 +0000 (+0200) Subject: 3.18-stable patches X-Git-Tag: v3.18.78~7 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=571d522ddb11962abfeac7ca81eea74e11f8bf9f;p=thirdparty%2Fkernel%2Fstable-queue.git 3.18-stable patches added patches: af_packet-don-t-pass-empty-blocks-for-packet_v3.patch --- 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 index 00000000000..a2780978779 --- /dev/null +++ b/queue-3.18/af_packet-don-t-pass-empty-blocks-for-packet_v3.patch @@ -0,0 +1,56 @@ +From 41a50d621a321b4c15273cc1b5ed41437f4acdfb Mon Sep 17 00:00:00 2001 +From: Alexander Drozdov +Date: Tue, 24 Feb 2015 08:18:28 +0300 +Subject: af_packet: don't pass empty blocks for PACKET_V3 + +From: Alexander Drozdov + +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 +Cc: Dan Collins +Cc: Willem de Bruijn +Cc: Guy Harris +Signed-off-by: David S. Miller +Cc: Christoph Biedl +Signed-off-by: Greg Kroah-Hartman + +--- + 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; diff --git a/queue-3.18/series b/queue-3.18/series index 02e6ee1e7d8..10377a76fba 100644 --- a/queue-3.18/series +++ b/queue-3.18/series @@ -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