* Re: 2.6.0-test9 : bridge freezes
@ 2003-12-15 13:15 Steve Hill
2003-12-16 1:17 ` David S. Miller
0 siblings, 1 reply; 11+ messages in thread
From: Steve Hill @ 2003-12-15 13:15 UTC (permalink / raw)
To: netdev
[-- Attachment #1: Type: TEXT/PLAIN, Size: 1200 bytes --]
With both conntrack and bridging turned on in the 2.6.0test11 kernel,
sending fragmented packets over the bridge reveals a memory leak
(specifically, forwarding packets from any interface to a bridge). The
memory that is leaking seems to be being allocated on line 299 on
net/bridge/br_netfilter.c:
if ((nf_bridge = nf_bridge_alloc(skb)) == NULL)
return NF_DROP;
Only the first fragment gets freed later on.
The patch attached fixes the problem by freeing nf_bridge when the
packets are defragmented, however I am sure this is not the right place
to do this. Where would the skb's for the fragments usually get freed?
Bart De Schuymer suggested that they should be freed in
skbuff.c::skb_release_data(), but having looked at this it seems to do
this already. skb_release_data() calls skb_drop_fraglist(), which does
kfree_skb() on each fragment, and kfree_skb calls nf_bridge_put correctly
so this isn't the problem.
--
- Steve Hill
Senior Software Developer Email: steve@navaho.co.uk
Navaho Technologies Ltd. Tel: +44-870-7034015
... Alcohol and calculus don't mix - Don't drink and derive! ...
[-- Attachment #2: Type: TEXT/PLAIN, Size: 565 bytes --]
diff -urN linux-2.6.0-test11.vanilla/net/ipv4/ip_fragment.c linux-2.6.0-test11/net/ipv4/ip_fragment.c
--- linux-2.6.0-test11.vanilla/net/ipv4/ip_fragment.c 2003-12-12 19:27:07.000000000 +0000
+++ linux-2.6.0-test11/net/ipv4/ip_fragment.c 2003-12-15 08:49:01.000000000 +0000
@@ -592,6 +592,9 @@
atomic_sub(head->truesize, &ip_frag_mem);
for (fp=head->next; fp; fp = fp->next) {
+#ifdef CONFIG_BRIDGE_NETFILTER
+ nf_bridge_put(fp->nf_bridge);
+#endif
head->data_len += fp->len;
head->len += fp->len;
if (head->ip_summed != fp->ip_summed)
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: 2.6.0-test9 : bridge freezes 2003-12-15 13:15 2.6.0-test9 : bridge freezes Steve Hill @ 2003-12-16 1:17 ` David S. Miller 2003-12-16 7:43 ` Bart De Schuymer 0 siblings, 1 reply; 11+ messages in thread From: David S. Miller @ 2003-12-16 1:17 UTC (permalink / raw) To: Steve Hill; +Cc: netdev On Mon, 15 Dec 2003 13:15:44 +0000 (GMT) Steve Hill <steve@navaho.co.uk> wrote: > The memory that is leaking seems to be being allocated on line 299 on > net/bridge/br_netfilter.c: > > if ((nf_bridge = nf_bridge_alloc(skb)) == NULL) > return NF_DROP; > > Only the first fragment gets freed later on. I see. > The patch attached fixes the problem by freeing nf_bridge when the > packets are defragmented, however I am sure this is not the right place > to do this. Where would the skb's for the fragments usually get freed? > > Bart De Schuymer suggested that they should be freed in > skbuff.c::skb_release_data(), but having looked at this it seems to do > this already. skb_release_data() calls skb_drop_fraglist(), which does > kfree_skb() on each fragment, and kfree_skb calls nf_bridge_put correctly > so this isn't the problem. There must be something in particular that the IPV4 fragmentation code is doing that makes these fragment reference drops get forgotten. Hmmm... I just noticed that both bridge netfilter and IPV4 fragmentation make much use of the skb->cb[] control block, this may be the true source of the troubles. In fact, since bridge netfilter expects pointers to be there, I'm surprised this does not cause a crash. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: 2.6.0-test9 : bridge freezes 2003-12-16 1:17 ` David S. Miller @ 2003-12-16 7:43 ` Bart De Schuymer 2003-12-16 7:46 ` David S. Miller 2003-12-16 9:00 ` Steve Hill 0 siblings, 2 replies; 11+ messages in thread From: Bart De Schuymer @ 2003-12-16 7:43 UTC (permalink / raw) To: David S. Miller, Steve Hill; +Cc: netdev On Tuesday 16 December 2003 02:17, David S. Miller wrote: > There must be something in particular that the IPV4 fragmentation code > is doing that makes these fragment reference drops get forgotten. Hmmm... > > I just noticed that both bridge netfilter and IPV4 fragmentation make much > use of the skb->cb[] control block, this may be the true source of the > troubles. > > In fact, since bridge netfilter expects pointers to be there, I'm surprised > this does not cause a crash. It only expects a pointer in br_nf_forward_finish() for ARP traffic. I checked and the ARP code doesn't use the control buffer. For IP traffic, it uses the control buffer just before and just after the call to the IP PRE_ROUTING hook. OK, I just looked at the ip_fragment.c code and it uses the control buffer too. You are truly amazing. I'll use skbuff.c::nf_bridge_info instead. Steve, does this patch fix things? Of course, first remove your code from ip_fragment.c. I haven't tested this patch yet, this will have to wait until this evening. Dave, I'll cook up a slightly different patch for you later, I think nf_bridge->hh is now a bad name, I'll change it into nf_bridge->data. thanks, Bart --- linux-2.6.0-test11-bk10/net/bridge/br_netfilter.c.old 2003-12-16 08:33:35.000000000 +0100 +++ linux-2.6.0-test11-bk10/net/bridge/br_netfilter.c 2003-12-16 08:34:12.000000000 +0100 @@ -38,11 +38,9 @@ #define skb_origaddr(skb) (((struct bridge_skb_cb *) \ - (skb->cb))->daddr.ipv4) + (skb->nf_bridge->hh))->daddr.ipv4) #define store_orig_dstaddr(skb) (skb_origaddr(skb) = (skb)->nh.iph->daddr) #define dnat_took_place(skb) (skb_origaddr(skb) != (skb)->nh.iph->daddr) -#define clear_cb(skb) (memset(&skb_origaddr(skb), 0, \ - sizeof(struct bridge_skb_cb))) #define has_bridge_parent(device) ((device)->br_port != NULL) #define bridge_parent(device) ((device)->br_port->br->dev) @@ -203,7 +201,6 @@ bridged_dnat: */ nf_bridge->mask |= BRNF_BRIDGED_DNAT; skb->dev = nf_bridge->physindev; - clear_cb(skb); if (skb->protocol == __constant_htons(ETH_P_8021Q)) { skb_push(skb, VLAN_HLEN); @@ -224,7 +221,6 @@ bridged_dnat: dst_hold(skb->dst); } - clear_cb(skb); skb->dev = nf_bridge->physindev; if (skb->protocol == __constant_htons(ETH_P_8021Q)) { skb_push(skb, VLAN_HLEN); ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: 2.6.0-test9 : bridge freezes 2003-12-16 7:43 ` Bart De Schuymer @ 2003-12-16 7:46 ` David S. Miller 2003-12-16 9:00 ` Steve Hill 1 sibling, 0 replies; 11+ messages in thread From: David S. Miller @ 2003-12-16 7:46 UTC (permalink / raw) To: Bart De Schuymer; +Cc: steve, netdev On Tue, 16 Dec 2003 08:43:58 +0100 Bart De Schuymer <bdschuym@pandora.be> wrote: > You are truly amazing. Don't make me blush in public :) > Dave, I'll cook up a slightly different patch for you later, I think > nf_bridge->hh is now a bad name, I'll change it into nf_bridge->data. Great, I hope we've got this one nailed. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: 2.6.0-test9 : bridge freezes 2003-12-16 7:43 ` Bart De Schuymer 2003-12-16 7:46 ` David S. Miller @ 2003-12-16 9:00 ` Steve Hill 2003-12-16 21:46 ` Bart De Schuymer 1 sibling, 1 reply; 11+ messages in thread From: Steve Hill @ 2003-12-16 9:00 UTC (permalink / raw) To: Bart De Schuymer; +Cc: David S. Miller, netdev On Tue, 16 Dec 2003, Bart De Schuymer wrote: > Steve, does this patch fix things? Of course, first remove your code from > ip_fragment.c. I haven't tested this patch yet, this will have to wait > until this evening. No, it still leaks I'm afraid :( -- - Steve Hill Senior Software Developer Email: steve@navaho.co.uk Navaho Technologies Ltd. Tel: +44-870-7034015 ... Alcohol and calculus don't mix - Don't drink and derive! ... ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: 2.6.0-test9 : bridge freezes 2003-12-16 9:00 ` Steve Hill @ 2003-12-16 21:46 ` Bart De Schuymer 2003-12-16 21:49 ` David S. Miller 2003-12-17 8:36 ` Steve Hill 0 siblings, 2 replies; 11+ messages in thread From: Bart De Schuymer @ 2003-12-16 21:46 UTC (permalink / raw) To: Steve Hill; +Cc: David S. Miller, netdev On Tuesday 16 December 2003 10:00, Steve Hill wrote: > On Tue, 16 Dec 2003, Bart De Schuymer wrote: > > Steve, does this patch fix things? Of course, first remove your code from > > ip_fragment.c. I haven't tested this patch yet, this will have to wait > > until this evening. > > No, it still leaks I'm afraid :( OK, I think the patch below should fix it, my previous patch is still valid. I'll send a combined patch once it's confirmed this fixes the bug. Steve, please test this patch. cheers, Bart --- linux-2.6.0-test11-bk10/net/ipv4/ip_output.c.old 2003-12-16 22:05:02.000000000 +0100 +++ linux-2.6.0-test11-bk10/net/ipv4/ip_output.c 2003-12-16 22:36:02.000000000 +0100 @@ -417,6 +417,7 @@ static void ip_copy_metadata(struct sk_b to->nfct = from->nfct; nf_conntrack_get(to->nfct); #ifdef CONFIG_BRIDGE_NETFILTER + nf_bridge_put(to->nf_bridge); to->nf_bridge = from->nf_bridge; nf_bridge_get(to->nf_bridge); #endif ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: 2.6.0-test9 : bridge freezes 2003-12-16 21:46 ` Bart De Schuymer @ 2003-12-16 21:49 ` David S. Miller 2003-12-17 8:36 ` Steve Hill 1 sibling, 0 replies; 11+ messages in thread From: David S. Miller @ 2003-12-16 21:49 UTC (permalink / raw) To: Bart De Schuymer; +Cc: steve, netdev On Tue, 16 Dec 2003 22:46:45 +0100 Bart De Schuymer <bdschuym@pandora.be> wrote: > #ifdef CONFIG_BRIDGE_NETFILTER > + nf_bridge_put(to->nf_bridge); > to->nf_bridge = from->nf_bridge; > nf_bridge_get(to->nf_bridge); > #endif Now this change makes a LOT of sense, great that you discovered it. Steve, we eagerly wait your test results :) ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: 2.6.0-test9 : bridge freezes 2003-12-16 21:46 ` Bart De Schuymer 2003-12-16 21:49 ` David S. Miller @ 2003-12-17 8:36 ` Steve Hill 2003-12-17 18:27 ` Bart De Schuymer 1 sibling, 1 reply; 11+ messages in thread From: Steve Hill @ 2003-12-17 8:36 UTC (permalink / raw) To: Bart De Schuymer; +Cc: David S. Miller, netdev On Tue, 16 Dec 2003, Bart De Schuymer wrote: > OK, I think the patch below should fix it, my previous patch is still valid. > I'll send a combined patch once it's confirmed this fixes the bug. Yep, this seems to fix the problem. Thanks. -- - Steve Hill Senior Software Developer Email: steve@navaho.co.uk Navaho Technologies Ltd. Tel: +44-870-7034015 ... Alcohol and calculus don't mix - Don't drink and derive! ... ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: 2.6.0-test9 : bridge freezes 2003-12-17 8:36 ` Steve Hill @ 2003-12-17 18:27 ` Bart De Schuymer 0 siblings, 0 replies; 11+ messages in thread From: Bart De Schuymer @ 2003-12-17 18:27 UTC (permalink / raw) To: Steve Hill; +Cc: David S. Miller, netdev On Wednesday 17 December 2003 09:36, Steve Hill wrote: > On Tue, 16 Dec 2003, Bart De Schuymer wrote: > > OK, I think the patch below should fix it, my previous patch is still > > valid. I'll send a combined patch once it's confirmed this fixes the bug. > > Yep, this seems to fix the problem. Thanks. Cool, Dave, here's the patch, nf_bridge_info.hh is renamed to nf_bridge_info.data, the bridge-nf IP code no longer uses the control buffer and a very necessary call of nf_bridge_put is added. cheers, Bart --- linux-2.6.0-test11-bk10/include/linux/skbuff.h.old 2003-12-17 08:12:12.000000000 +0100 +++ linux-2.6.0-test11-bk10/include/linux/skbuff.h 2003-12-17 08:12:38.000000000 +0100 @@ -107,7 +107,7 @@ struct nf_bridge_info { struct net_device *netoutdev; #endif unsigned int mask; - unsigned long hh[32 / sizeof(unsigned long)]; + unsigned long data[32 / sizeof(unsigned long)]; }; #endif --- linux-2.6.0-test11-bk10/include/linux/netfilter_bridge.h.old 2003-12-17 08:08:21.000000000 +0100 +++ linux-2.6.0-test11-bk10/include/linux/netfilter_bridge.h 2003-12-17 08:09:19.000000000 +0100 @@ -73,11 +73,11 @@ void nf_bridge_maybe_copy_header(struct if (skb->nf_bridge) { #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) if (skb->protocol == __constant_htons(ETH_P_8021Q)) { - memcpy(skb->data - 18, skb->nf_bridge->hh, 18); + memcpy(skb->data - 18, skb->nf_bridge->data, 18); skb_push(skb, 4); } else #endif - memcpy(skb->data - 16, skb->nf_bridge->hh, 16); + memcpy(skb->data - 16, skb->nf_bridge->data, 16); } } @@ -90,7 +90,7 @@ void nf_bridge_save_header(struct sk_buf if (skb->protocol == __constant_htons(ETH_P_8021Q)) header_size = 18; #endif - memcpy(skb->nf_bridge->hh, skb->data - header_size, header_size); + memcpy(skb->nf_bridge->data, skb->data - header_size, header_size); } struct bridge_skb_cb { --- linux-2.6.0-test11-bk10/net/bridge/br_netfilter.c.old 2003-12-16 08:33:35.000000000 +0100 +++ linux-2.6.0-test11-bk10/net/bridge/br_netfilter.c 2003-12-17 08:08:08.000000000 +0100 @@ -38,11 +38,9 @@ #define skb_origaddr(skb) (((struct bridge_skb_cb *) \ - (skb->cb))->daddr.ipv4) + (skb->nf_bridge->data))->daddr.ipv4) #define store_orig_dstaddr(skb) (skb_origaddr(skb) = (skb)->nh.iph->daddr) #define dnat_took_place(skb) (skb_origaddr(skb) != (skb)->nh.iph->daddr) -#define clear_cb(skb) (memset(&skb_origaddr(skb), 0, \ - sizeof(struct bridge_skb_cb))) #define has_bridge_parent(device) ((device)->br_port != NULL) #define bridge_parent(device) ((device)->br_port->br->dev) @@ -203,7 +201,6 @@ bridged_dnat: */ nf_bridge->mask |= BRNF_BRIDGED_DNAT; skb->dev = nf_bridge->physindev; - clear_cb(skb); if (skb->protocol == __constant_htons(ETH_P_8021Q)) { skb_push(skb, VLAN_HLEN); @@ -224,7 +221,6 @@ bridged_dnat: dst_hold(skb->dst); } - clear_cb(skb); skb->dev = nf_bridge->physindev; if (skb->protocol == __constant_htons(ETH_P_8021Q)) { skb_push(skb, VLAN_HLEN); --- linux-2.6.0-test11-bk10/net/ipv4/ip_output.c.old 2003-12-16 22:05:02.000000000 +0100 +++ linux-2.6.0-test11-bk10/net/ipv4/ip_output.c 2003-12-16 22:36:02.000000000 +0100 @@ -417,6 +417,7 @@ static void ip_copy_metadata(struct sk_b to->nfct = from->nfct; nf_conntrack_get(to->nfct); #ifdef CONFIG_BRIDGE_NETFILTER + nf_bridge_put(to->nf_bridge); to->nf_bridge = from->nf_bridge; nf_bridge_get(to->nf_bridge); #endif ^ permalink raw reply [flat|nested] 11+ messages in thread
[parent not found: <200311221527.UAA29684@eis.iisc.ernet.in>]
* Re: 2.6.0-test9 : bridge freezes [not found] <200311221527.UAA29684@eis.iisc.ernet.in> @ 2003-11-22 16:20 ` Linus Torvalds 2003-11-23 23:26 ` David S. Miller 0 siblings, 1 reply; 11+ messages in thread From: Linus Torvalds @ 2003-11-22 16:20 UTC (permalink / raw) To: SVR Anand; +Cc: Kernel Mailing List, netdev On Sat, 22 Nov 2003, SVR Anand wrote: > > The problem is : After 3 to 4 hours of functioning, the bridge stops working > and the machine becomes unusable where it doesn't respond to keyboard, and > there is no video display. Sounds like a memory leak somewhere. It would probably be interesting to watch /proc/slabinfo every five minutes or so, and see what happens.. Linus ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: 2.6.0-test9 : bridge freezes 2003-11-22 16:20 ` Linus Torvalds @ 2003-11-23 23:26 ` David S. Miller 0 siblings, 0 replies; 11+ messages in thread From: David S. Miller @ 2003-11-23 23:26 UTC (permalink / raw) To: Linus Torvalds; +Cc: anand, linux-kernel, netdev On Sat, 22 Nov 2003 08:20:40 -0800 (PST) Linus Torvalds <torvalds@osdl.org> wrote: > On Sat, 22 Nov 2003, SVR Anand wrote: > > > > The problem is : After 3 to 4 hours of functioning, the bridge stops working > > and the machine becomes unusable where it doesn't respond to keyboard, and > > there is no video display. > > Sounds like a memory leak somewhere. It would probably be interesting to > watch /proc/slabinfo every five minutes or so, and see what happens.. Also, we've certainly fixed some serious networking bugs since test9 came out. ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2003-12-17 18:27 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-12-15 13:15 2.6.0-test9 : bridge freezes Steve Hill
2003-12-16 1:17 ` David S. Miller
2003-12-16 7:43 ` Bart De Schuymer
2003-12-16 7:46 ` David S. Miller
2003-12-16 9:00 ` Steve Hill
2003-12-16 21:46 ` Bart De Schuymer
2003-12-16 21:49 ` David S. Miller
2003-12-17 8:36 ` Steve Hill
2003-12-17 18:27 ` Bart De Schuymer
[not found] <200311221527.UAA29684@eis.iisc.ernet.in>
2003-11-22 16:20 ` Linus Torvalds
2003-11-23 23:26 ` David S. Miller
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).