Re: still having smp/snat problems (Re: Linux 2.4.19-rc3)

Martin Josefsson
2002-07-20T09:49:01Z

[-- Attachment #1: Type: text/plain, Size: 1469 bytes --]

On Sat, 2002-07-20 at 06:17, glynis@butterfly.hjsoft.com wrote:
> On Fri, Jul 19, 2002 at 09:20:49PM -0300, Marcelo Tosatti wrote:
> > <rusty@rustcorp.com.au> (02/07/17 1.630)
> > [PATCH] The real netfilter conntrack SMP overrun fix
>
> assuming this should have fixed this:
> LIST_DELETE: ip_conntrack_core.c:165
> `&ct->tuplehash[IP_CT_DIR_REPLY]'(dd8f2e90) not in &ip_conntrack_hash
> [hash_conntrack(&ct->tuplehash[IP_CT_DIR_REPLY].tuple)].
>
> it doesn't seem to have taken. i see this error and the following
> crash when i use these rules:
> iptables -t nat -A POSTROUTING -j SNAT --to 64.192.31.41
> iptables -t nat -A POSTROUTING -j SNAT --to 192.168.1.1
> iptables -t nat -A POSTROUTING -j SNAT --to 127.0.0.1
>
> when i use the masquerading instead of snat, it doesn't exhibit the
> error and crash.
>
> here's the info for my _stable_ config on my dual athlon 1800+:

Hmm, this is something people have reported a long time but we've never
been able to reproduce it. People have even reported it on UP machines
(maybe they were running with preempt?).
Rusty has been over the locking in conntrack a few times without finding
anything that could explain it.

Could you please apply the attached patch and give it a go and send the
results to netfilter-devel@lists.netfilter.org ?
(I hope it applies, was diffed against my quite patched kernel)

--
/Martin

Never argue with an idiot. They drag you down to their level, then beat
you with experience.

[-- Attachment #2: listhelp.h-patch --]
[-- Type: text/plain, Size: 590 bytes --]

--- linux/include/linux/netfilter_ipv4/listhelp.h.orig Sat Jul 20 11:46:47 2002
+++ linux/include/linux/netfilter_ipv4/listhelp.h Sat Jul 20 11:48:17 2002
@@ -54,9 +54,11 @@
#define LIST_DELETE(head, oldentry) \
do { \
ASSERT_WRITE_LOCK(head); \
- if (!list_inlist(head, oldentry)) \
+ if (!list_inlist(head, oldentry)) { \
printk("LIST_DELETE: %s:%u `%s'(%p) not in %s.\n", \
__FILE__, __LINE__, #oldentry, oldentry, #head); \
+ BUG(); \
+ } \
else list_del((struct list_head *)oldentry); \
} while(0)
#else