[PATCH 28/72] netfilter: ipt_LOG: add bufferisation to call printk() once

Previous thread: [PATCH 33/72] netfilter: xtables: resolve indirect macros 2/3 by kaber on Thursday, October 21, 2010 - 8:19 am. (1 message)

Next thread: [PATCH 22/72] IPVS: Add persistence engine data to /proc/net/ip_vs_conn by kaber on Thursday, October 21, 2010 - 8:19 am. (1 message)
From: kaber
Date: Thursday, October 21, 2010 - 8:19 am

From: Eric Dumazet <eric.dumazet@gmail.com>

ipt_LOG & ip6t_LOG use lot of calls to printk() and use a lock in a hope
several cpus wont mix their output in syslog.

printk() being very expensive [1], its better to call it once, on a
prebuilt and complete line. Also, with mixed IPv4 and IPv6 trafic,
separate IPv4/IPv6 locks dont avoid garbage.

I used an allocation of a 1024 bytes structure, sort of seq_printf() but
with a fixed size limit.
Use a static buffer if dynamic allocation failed.

Emit a once time alert if buffer size happens to be too short.

[1]: printk() has various features like printk_delay()...

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: Patrick McHardy <kaber@trash.net>
---
 net/ipv4/netfilter/ipt_LOG.c  |  145 +++++++++++++++++++-------------------
 net/ipv6/netfilter/ip6t_LOG.c |  157 +++++++++++++++++++++--------------------
 2 files changed, 152 insertions(+), 150 deletions(-)

diff --git a/net/ipv4/netfilter/ipt_LOG.c b/net/ipv4/netfilter/ipt_LOG.c
index 915fc17..72ffc8f 100644
--- a/net/ipv4/netfilter/ipt_LOG.c
+++ b/net/ipv4/netfilter/ipt_LOG.c
@@ -24,16 +24,15 @@
 #include <linux/netfilter/x_tables.h>
 #include <linux/netfilter_ipv4/ipt_LOG.h>
 #include <net/netfilter/nf_log.h>
+#include <net/netfilter/xt_log.h>
 
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Netfilter Core Team <coreteam@netfilter.org>");
 MODULE_DESCRIPTION("Xtables: IPv4 packet logging to syslog");
 
-/* Use lock to serialize, so printks don't overlap */
-static DEFINE_SPINLOCK(log_lock);
-
 /* One level of recursion won't kill us */
-static void dump_packet(const struct nf_loginfo *info,
+static void dump_packet(struct sbuff *m,
+			const struct nf_loginfo *info,
 			const struct sk_buff *skb,
 			unsigned int iphoff)
 {
@@ -48,32 +47,32 @@ static void dump_packet(const struct nf_loginfo *info,
 
 	ih = skb_header_pointer(skb, iphoff, sizeof(_iph), &_iph);
 	if (ih == NULL) {
-		printk("TRUNCATED");
+		sb_add(m, "TRUNCATED");
 		return;
 	}
 ...
Previous thread: [PATCH 33/72] netfilter: xtables: resolve indirect macros 2/3 by kaber on Thursday, October 21, 2010 - 8:19 am. (1 message)

Next thread: [PATCH 22/72] IPVS: Add persistence engine data to /proc/net/ip_vs_conn by kaber on Thursday, October 21, 2010 - 8:19 am. (1 message)