Re: [slab poison overwritten] Re: [GIT] Networking
From: Simon Horman <horms@verge.net.au>
Date: 2011-03-22 00:17:14
Also in:
lkml
On Tue, Mar 22, 2011 at 09:01:33AM +0900, Simon Horman wrote:
On Tue, Mar 22, 2011 at 08:29:21AM +0900, Simon Horman wrote:quoted
On Tue, Mar 22, 2011 at 07:13:58AM +0900, Simon Horman wrote:quoted
On Mon, Mar 21, 2011 at 09:15:40PM +0100, Eric Dumazet wrote:quoted
Le lundi 21 mars 2011 à 19:07 +0100, Eric Dumazet a écrit :quoted
Le lundi 21 mars 2011 à 18:39 +0100, Ingo Molnar a écrit :quoted
here's the same but with kallsyms enabled. Thanks, Ingo [ 9.585627] initcall 0xffffffff81d5b806 returned 0 after 0 usecs [ 9.588960] calling 0xffffffff81d5b9da @ 1 [ 9.592303] IPVS: Creating netns size=1272 id=0 [ 9.595646] IPVS: __ip_vs_control_init(): alloc_percpu. [ 9.602298] IPVS: cannot register namespace. [ 9.605627] IPVS: can't setup controlIt seems IPVS is busted in case of memory allocation error in __ip_vs_control_init() IPVS deinits its "struct netns_ipvs" space, but something (in IPVS) uses it after free. __ip_vs_init() seems to be called before ip_vs_init() completes correctly. We then keep in net->ipvs a pointer to some freed memory. Commit 14e405461e664b7 did some changes in this area Simon, any idea ?For the time being, we can avoid the false memory allocation error (and leak)Sorry, that typo is my work.With your patch applied I now see the following ffff880003bbf1a0 corresponds to &ipvs->app_key in __ip_vs_app_init(). I'll continue looking into this. [ 12.610000] IPVS: Creating netns size=2456 id=0 [ 12.630000] IPVS: Registered protocols (TCP, UDP, SCTP, AH, ESP) [ 12.640000] BUG: key ffff880003bbf1a0 not in .data! [ 12.640000] ------------[ cut here ]------------ [ 12.640000] WARNING: at kernel/lockdep.c:2701 lockdep_init_map+0x37b/0x570() [ 12.640000] Hardware name: Bochs [ 12.640000] Pid: 1, comm: swapper Tainted: G W 2.6.38-kexec-06330-g69b7efe-dirty #122 [ 12.650000] Call Trace: [ 12.650000] [<ffffffff8102e685>] warn_slowpath_common+0x75/0xb0 [ 12.650000] [<ffffffff8102e6d5>] warn_slowpath_null+0x15/0x20 [ 12.650000] [<ffffffff8105967b>] lockdep_init_map+0x37b/0x570 [ 12.650000] [<ffffffff8105829d>] ? trace_hardirqs_on+0xd/0x10 [ 12.650000] [<ffffffff81055ad8>] debug_mutex_init+0x38/0x50 [ 12.650000] [<ffffffff8104bc4c>] __mutex_init+0x5c/0x70 [ 12.650000] [<ffffffff81685ee7>] __ip_vs_app_init+0x64/0x86 [ 12.660000] [<ffffffff81685a3b>] ? ip_vs_init+0x0/0xff [ 12.660000] [<ffffffff811b1c33>] T.620+0x43/0x170 [ 12.660000] [<ffffffff811b1e9a>] ? register_pernet_subsys+0x1a/0x40 [ 12.660000] [<ffffffff81685a3b>] ? ip_vs_init+0x0/0xff [ 12.660000] [<ffffffff81685a3b>] ? ip_vs_init+0x0/0xff [ 12.660000] [<ffffffff811b1db7>] register_pernet_operations+0x57/0xb0 [ 12.660000] [<ffffffff81685a3b>] ? ip_vs_init+0x0/0xff [ 12.670000] [<ffffffff811b1ea9>] register_pernet_subsys+0x29/0x40 [ 12.670000] [<ffffffff81685f19>] ip_vs_app_init+0x10/0x12 [ 12.670000] [<ffffffff81685a87>] ip_vs_init+0x4c/0xff [ 12.670000] [<ffffffff8166562c>] do_one_initcall+0x7a/0x12e [ 12.670000] [<ffffffff8166583e>] kernel_init+0x13e/0x1c2 [ 12.670000] [<ffffffff8128c134>] kernel_thread_helper+0x4/0x10 [ 12.670000] [<ffffffff8128ad40>] ? restore_args+0x0/0x30 [ 12.680000] [<ffffffff81665700>] ? kernel_init+0x0/0x1c2 [ 12.680000] [<ffffffff8128c130>] ? kernel_thread_helper+0x0/0x10 [ 12.680000] ---[ end trace 4eaa2a86a8e2da23 ]---It seems that the problem above was introduced by ab8a5e8408c3 ("IPVS: netns awareness to ip_vs_app"). I assume the hungs are the cause:
s/hungs/hunks below/ I am a little unsure of what to do about this. The problem seems to be that ipvs->app_key is not in static storage. But I'm not sure how to resolve that given that the struct netns_ipvs is per-network namespace. So I guess that the locking needs to be re-worked. Again, I'm a little unsure of what the best way forward is.
quoted hunk ↗ jump to hunk
diff --git a/net/netfilter/ipvs/ip_vs_app.c b/net/netfilter/ipvs/ip_vs_app.c index 40b09cc..286f465 100644 --- a/net/netfilter/ipvs/ip_vs_app.c +++ b/net/netfilter/ipvs/ip_vs_app.c@@ -43,11 +43,6 @@ EXPORT_SYMBOL(register_ip_vs_app); EXPORT_SYMBOL(unregister_ip_vs_app); EXPORT_SYMBOL(register_ip_vs_app_inc); -/* ipvs application list head */ -static LIST_HEAD(ip_vs_app_list); -static DEFINE_MUTEX(__ip_vs_app_mutex); - - /* * Get an ip_vs_app object */@@ -571,9 +580,13 @@ static const struct file_operations ip_vs_app_fops = { static int __net_init __ip_vs_app_init(struct net *net) { + struct netns_ipvs *ipvs = net_ipvs(net); + if (!net_eq(net, &init_net)) /* netns not enabled yet */ return -EPERM; + INIT_LIST_HEAD(&ipvs->app_list); + __mutex_init(&ipvs->app_mutex, "ipvs->app_mutex", &ipvs->app_key); proc_net_fops_create(net, "ip_vs_app", 0, &ip_vs_app_fops); return 0; }