* Deadlocks @ 2004-06-09 18:09 Phil Oester 2004-06-10 8:07 ` Deadlocks Jozsef Kadlecsik 2004-06-13 19:58 ` Deadlocks Patrick McHardy 0 siblings, 2 replies; 17+ messages in thread From: Phil Oester @ 2004-06-09 18:09 UTC (permalink / raw) To: netfilter-devel For the past 3 months I've been experiencing deadlocks on some heavily used gateway/firewall boxes which started after upgrading from 2.4.20. I can confirm that moving back to 2.4.20 stops the hangs, moving to 2.4.21 (or any kernel after that) makes them return. I am in the process of testing out each individual 2.4.21-pre to find out where exactly the problem is. In the interim, I've collected some SysRq output which may help in the analysis. Below are two separate lockups on a 2.6.6 kernel. Anyone have any bright ideas? Phil Oester Lockup #1: Pid: 0, comm: swapper EIP: 0060:[<c024a3e7>] CPU: 1 EIP is at __write_lock_failed+0xf/0x20 EFLAGS: 00000287 Not tainted (2.6.6) EAX: c0283360 EBX: ffffffff ECX: 7d9d14aa EDX: ee83c1e0 ESI: f454b910 EDI: ffffffff EBP: 0000007d DS: 007b ES: 007b CR0: 8005003b CR2: 08076ac4 CR3: 37b34000 CR4: 00000690 Call Trace: [<c0237f28>] .text.lock.ip_conntrack_core+0x7d/0xd5 [<c023cf6d>] do_bindings+0x8d/0x260 [<c0238855>] try_rfc959+0x25/0x30 [<c0238dd7>] help+0x2f7/0x430 [<c0238830>] try_rfc959+0x0/0x30 [<c0238251>] tcp_packet+0xd1/0x160 [<c0236ea0>] ip_conntrack_in+0x100/0x220 [<c01fd182>] nf_iterate+0x72/0xb0 [<c0205fc0>] ip_rcv_finish+0x0/0x245 [<c01fd468>] nf_hook_slow+0x78/0x110 [<c0205fc0>] ip_rcv_finish+0x0/0x245 [<c0205da1>] ip_rcv+0x3c1/0x480 [<c0205fc0>] ip_rcv_finish+0x0/0x245 [<c01effe2>] alloc_skb+0x32/0xd0 [<c01f4d72>] netif_receive_skb+0x162/0x190 [<c01c9889>] e1000_clean_rx_irq+0x399/0x410 [<c01c9244>] e1000_clean+0x34/0xb0 [<c01f4f3f>] net_rx_action+0x7f/0x110 [<c011ae84>] __do_softirq+0xb4/0xc0 [<c0106b9c>] do_softirq+0x4c/0x60 ======================= [<c0106275>] do_IRQ+0x145/0x180 [<c010467c>] common_interrupt+0x18/0x20 [<c0101e20>] default_idle+0x0/0x40 [<c0101e4c>] default_idle+0x2c/0x40 [<c0101edb>] cpu_idle+0x3b/0x50 [<c01177b7>] __call_console_drivers+0x57/0x60 [<c01178af>] call_console_drivers+0x7f/0x100 Lockup #2: Pid: 0, comm: swapper EIP: 0060:[<c0261bd0>] CPU: 0 EIP is at .text.lock.ip_nat_ftp+0x19/0x29 EFLAGS: 00000286 Not tainted (2.6.6) EAX: 00000001 EBX: c0306000 ECX: d31c3034 EDX: eaeb8ac0 ESI: 00000019 EDI: eaeb8a48 EBP: c0306d24 DS: 007b ES: 007b CR0: 8005003b CR2: 4024f0ec CR3: 31515000 CR4: 00000690 Call Trace: [<c0260592>] tcp_exp_matches_pkt+0x32/0x79 [<c0266e5f>] do_bindings+0x34f/0x570 [<c0264c17>] ip_nat_fn+0x77/0x310 [<c021f0be>] nf_iterate+0x6e/0xc0 [<c022dcb0>] ip_finish_output2+0x0/0x1cb [<c021f406>] nf_hook_slow+0x86/0x150 [<c022dcb0>] ip_finish_output2+0x0/0x1cb [<c022b8b3>] ip_finish_output+0x43/0x50 [<c022dcb0>] ip_finish_output2+0x0/0x1cb [<c022a47c>] ip_forward_finish+0x2c/0x50 [<c021f45a>] nf_hook_slow+0xda/0x150 [<c022a450>] ip_forward_finish+0x0/0x50 [<c022a3b7>] ip_forward+0x137/0x1d0 [<c022a450>] ip_forward_finish+0x0/0x50 [<c02290b8>] ip_rcv_finish+0x1e8/0x25d [<c021f0be>] nf_iterate+0x6e/0xc0 [<c0228ed0>] ip_rcv_finish+0x0/0x25d [<c021f45a>] nf_hook_slow+0xda/0x150 [<c0228ed0>] ip_rcv_finish+0x0/0x25d [<c0228cad>] ip_rcv+0x18d/0x240 [<c0228ed0>] ip_rcv_finish+0x0/0x25d [<c0215a14>] netif_receive_skb+0x174/0x1a0 [<c01e60f8>] e1000_clean_rx_irq+0x3d8/0x490 [<c01e5a2c>] e1000_clean+0x3c/0xb0 [<c0215bf0>] net_rx_action+0x90/0x130 [<c011f204>] __do_softirq+0xb4/0xc0 [<c010764f>] do_softirq+0x4f/0x60 ======================= [<c0106979>] do_IRQ+0x1a9/0x260 [<c011091c>] smp_apic_timer_interrupt+0xcc/0x130 [<c0104bb0>] common_interrupt+0x18/0x20 [<c0102150>] default_idle+0x0/0x40 [<c010217f>] default_idle+0x2f/0x40 [<c010220b>] cpu_idle+0x3b/0x50 [<c02d7520>] unknown_bootoption+0x0/0x120 [<c02d7943>] start_kernel+0x173/0x1c0 [<c02d7520>] unknown_bootoption+0x0/0x120 ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: Deadlocks 2004-06-09 18:09 Deadlocks Phil Oester @ 2004-06-10 8:07 ` Jozsef Kadlecsik 2004-06-10 15:02 ` Deadlocks Phil Oester 2004-06-13 19:58 ` Deadlocks Patrick McHardy 1 sibling, 1 reply; 17+ messages in thread From: Jozsef Kadlecsik @ 2004-06-10 8:07 UTC (permalink / raw) To: Phil Oester; +Cc: netfilter-devel On Wed, 9 Jun 2004, Phil Oester wrote: > For the past 3 months I've been experiencing deadlocks on some heavily > used gateway/firewall boxes which started after upgrading from 2.4.20. > > I can confirm that moving back to 2.4.20 stops the hangs, moving to 2.4.21 > (or any kernel after that) makes them return. I am in the process of testing > out each individual 2.4.21-pre to find out where exactly the problem is. > > In the interim, I've collected some SysRq output which may help in the > analysis. Below are two separate lockups on a 2.6.6 kernel. Anyone have > any bright ideas? Could you try out the 05_linux-2.4.26-orphaned_expect.patch or 05_linux-2.6.6-orphaned_expect.patch depending on the kernel from pom-ng/updates? I think that is the fix for your lockups. Best regards, Jozsef - E-mail : kadlec@blackhole.kfki.hu, kadlec@sunserv.kfki.hu PGP key : http://www.kfki.hu/~kadlec/pgp_public_key.txt Address : KFKI Research Institute for Particle and Nuclear Physics H-1525 Budapest 114, POB. 49, Hungary ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: Deadlocks 2004-06-10 8:07 ` Deadlocks Jozsef Kadlecsik @ 2004-06-10 15:02 ` Phil Oester 0 siblings, 0 replies; 17+ messages in thread From: Phil Oester @ 2004-06-10 15:02 UTC (permalink / raw) To: Jozsef Kadlecsik; +Cc: netfilter-devel I always apply the orphaned expectations patch (I'm the one who tracked that one down and submitted the original patch ;-) That is not the problem here -- this is a locking bug as shown by the SysRq output. I'm temporarily running 2.6.6 without SMP support to work around it. Phil On Thu, Jun 10, 2004 at 10:07:16AM +0200, Jozsef Kadlecsik wrote: > On Wed, 9 Jun 2004, Phil Oester wrote: > > > For the past 3 months I've been experiencing deadlocks on some heavily > > used gateway/firewall boxes which started after upgrading from 2.4.20. > > > > I can confirm that moving back to 2.4.20 stops the hangs, moving to 2.4.21 > > (or any kernel after that) makes them return. I am in the process of testing > > out each individual 2.4.21-pre to find out where exactly the problem is. > > > > In the interim, I've collected some SysRq output which may help in the > > analysis. Below are two separate lockups on a 2.6.6 kernel. Anyone have > > any bright ideas? > > Could you try out the 05_linux-2.4.26-orphaned_expect.patch or > 05_linux-2.6.6-orphaned_expect.patch depending on the kernel > from pom-ng/updates? I think that is the fix for your lockups. ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: Deadlocks 2004-06-09 18:09 Deadlocks Phil Oester 2004-06-10 8:07 ` Deadlocks Jozsef Kadlecsik @ 2004-06-13 19:58 ` Patrick McHardy 2004-06-15 4:47 ` Deadlocks Phil Oester 1 sibling, 1 reply; 17+ messages in thread From: Patrick McHardy @ 2004-06-13 19:58 UTC (permalink / raw) To: Phil Oester; +Cc: netfilter-devel On Wed, 2004-06-09 at 20:09, Phil Oester wrote: > For the past 3 months I've been experiencing deadlocks on some heavily > used gateway/firewall boxes which started after upgrading from 2.4.20. > > I can confirm that moving back to 2.4.20 stops the hangs, moving to 2.4.21 > (or any kernel after that) makes them return. I am in the process of testing > out each individual 2.4.21-pre to find out where exactly the problem is. > > In the interim, I've collected some SysRq output which may help in the > analysis. Below are two separate lockups on a 2.6.6 kernel. Anyone have > any bright ideas? This looks like the problem I described a couple of month ago: http://lists.netfilter.org/pipermail/netfilter-devel/2003-November/013130.html I went through the 2.4.21 patch, but couldn't find anything that looks related to this. The patch attached to the email above should apply to something around 2.4.23. Please also enable CONFIG_NETFILTER_DEBUG, so we can see where exactly the problem occurs. Regards Patrick > > Phil Oester > > > Lockup #1: > Pid: 0, comm: swapper > EIP: 0060:[<c024a3e7>] CPU: 1 > EIP is at __write_lock_failed+0xf/0x20 > EFLAGS: 00000287 Not tainted (2.6.6) > EAX: c0283360 EBX: ffffffff ECX: 7d9d14aa EDX: ee83c1e0 > ESI: f454b910 EDI: ffffffff EBP: 0000007d DS: 007b ES: 007b > CR0: 8005003b CR2: 08076ac4 CR3: 37b34000 CR4: 00000690 > Call Trace: > [<c0237f28>] .text.lock.ip_conntrack_core+0x7d/0xd5 > [<c023cf6d>] do_bindings+0x8d/0x260 > [<c0238855>] try_rfc959+0x25/0x30 > [<c0238dd7>] help+0x2f7/0x430 > [<c0238830>] try_rfc959+0x0/0x30 > [<c0238251>] tcp_packet+0xd1/0x160 > [<c0236ea0>] ip_conntrack_in+0x100/0x220 > [<c01fd182>] nf_iterate+0x72/0xb0 > [<c0205fc0>] ip_rcv_finish+0x0/0x245 > [<c01fd468>] nf_hook_slow+0x78/0x110 > [<c0205fc0>] ip_rcv_finish+0x0/0x245 > [<c0205da1>] ip_rcv+0x3c1/0x480 > [<c0205fc0>] ip_rcv_finish+0x0/0x245 > [<c01effe2>] alloc_skb+0x32/0xd0 > [<c01f4d72>] netif_receive_skb+0x162/0x190 > [<c01c9889>] e1000_clean_rx_irq+0x399/0x410 > [<c01c9244>] e1000_clean+0x34/0xb0 > [<c01f4f3f>] net_rx_action+0x7f/0x110 > [<c011ae84>] __do_softirq+0xb4/0xc0 > [<c0106b9c>] do_softirq+0x4c/0x60 > ======================= > [<c0106275>] do_IRQ+0x145/0x180 > [<c010467c>] common_interrupt+0x18/0x20 > [<c0101e20>] default_idle+0x0/0x40 > [<c0101e4c>] default_idle+0x2c/0x40 > [<c0101edb>] cpu_idle+0x3b/0x50 > [<c01177b7>] __call_console_drivers+0x57/0x60 > [<c01178af>] call_console_drivers+0x7f/0x100 > > > Lockup #2: > Pid: 0, comm: swapper > EIP: 0060:[<c0261bd0>] CPU: 0 > EIP is at .text.lock.ip_nat_ftp+0x19/0x29 > EFLAGS: 00000286 Not tainted (2.6.6) > EAX: 00000001 EBX: c0306000 ECX: d31c3034 EDX: eaeb8ac0 > ESI: 00000019 EDI: eaeb8a48 EBP: c0306d24 DS: 007b ES: 007b > CR0: 8005003b CR2: 4024f0ec CR3: 31515000 CR4: 00000690 > Call Trace: > [<c0260592>] tcp_exp_matches_pkt+0x32/0x79 > [<c0266e5f>] do_bindings+0x34f/0x570 > [<c0264c17>] ip_nat_fn+0x77/0x310 > [<c021f0be>] nf_iterate+0x6e/0xc0 > [<c022dcb0>] ip_finish_output2+0x0/0x1cb > [<c021f406>] nf_hook_slow+0x86/0x150 > [<c022dcb0>] ip_finish_output2+0x0/0x1cb > [<c022b8b3>] ip_finish_output+0x43/0x50 > [<c022dcb0>] ip_finish_output2+0x0/0x1cb > [<c022a47c>] ip_forward_finish+0x2c/0x50 > [<c021f45a>] nf_hook_slow+0xda/0x150 > [<c022a450>] ip_forward_finish+0x0/0x50 > [<c022a3b7>] ip_forward+0x137/0x1d0 > [<c022a450>] ip_forward_finish+0x0/0x50 > [<c02290b8>] ip_rcv_finish+0x1e8/0x25d > [<c021f0be>] nf_iterate+0x6e/0xc0 > [<c0228ed0>] ip_rcv_finish+0x0/0x25d > [<c021f45a>] nf_hook_slow+0xda/0x150 > [<c0228ed0>] ip_rcv_finish+0x0/0x25d > [<c0228cad>] ip_rcv+0x18d/0x240 > [<c0228ed0>] ip_rcv_finish+0x0/0x25d > [<c0215a14>] netif_receive_skb+0x174/0x1a0 > [<c01e60f8>] e1000_clean_rx_irq+0x3d8/0x490 > [<c01e5a2c>] e1000_clean+0x3c/0xb0 > [<c0215bf0>] net_rx_action+0x90/0x130 > [<c011f204>] __do_softirq+0xb4/0xc0 > [<c010764f>] do_softirq+0x4f/0x60 > ======================= > [<c0106979>] do_IRQ+0x1a9/0x260 > [<c011091c>] smp_apic_timer_interrupt+0xcc/0x130 > [<c0104bb0>] common_interrupt+0x18/0x20 > [<c0102150>] default_idle+0x0/0x40 > [<c010217f>] default_idle+0x2f/0x40 > [<c010220b>] cpu_idle+0x3b/0x50 > [<c02d7520>] unknown_bootoption+0x0/0x120 > [<c02d7943>] start_kernel+0x173/0x1c0 > [<c02d7520>] unknown_bootoption+0x0/0x120 > > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: Deadlocks 2004-06-13 19:58 ` Deadlocks Patrick McHardy @ 2004-06-15 4:47 ` Phil Oester 2004-06-15 6:23 ` Deadlocks Patrick McHardy 0 siblings, 1 reply; 17+ messages in thread From: Phil Oester @ 2004-06-15 4:47 UTC (permalink / raw) To: Patrick McHardy; +Cc: netfilter-devel I agree I am likely experiencing the deadlock you refer to: CPU1: conntrack-helper:help: lock(private_lock) ip_conntrack_expect_related: write_lock(ip_conntrack_lock) CPU2: nat-core:do_bindings: read_lock(ip_conntrack_lock) nat-helper:help: lock(private_lock) However, it's unclear to me that the ip_ftp_lock can be trivially eliminated. This code path looks particularly prickly in ip_nat_ftp.c: help ftp_data_fixup ip_conntrack_change_expect so the nat helper is changing the expectation -- potentially at the same time the conntrack helper is calling ip_conntrack_expect. If the private lock were removed, could this not cause a race condition if the expectation got created just after the nat-helper changed the expectation? It seems the ip_ftp_lock is needed, but perhaps needs to be reworked to avoid the deadlock condition illustrated above. Thoughts? Phil On Sun, Jun 13, 2004 at 09:58:29PM +0200, Patrick McHardy wrote: > On Wed, 2004-06-09 at 20:09, Phil Oester wrote: > > For the past 3 months I've been experiencing deadlocks on some heavily > > used gateway/firewall boxes which started after upgrading from 2.4.20. > > > > I can confirm that moving back to 2.4.20 stops the hangs, moving to 2.4.21 > > (or any kernel after that) makes them return. I am in the process of testing > > out each individual 2.4.21-pre to find out where exactly the problem is. > > > > In the interim, I've collected some SysRq output which may help in the > > analysis. Below are two separate lockups on a 2.6.6 kernel. Anyone have > > any bright ideas? > > This looks like the problem I described a couple of month ago: > http://lists.netfilter.org/pipermail/netfilter-devel/2003-November/013130.html > I went through the 2.4.21 patch, but couldn't find anything that looks > related to this. The patch attached to the email above should apply to > something around 2.4.23. Please also enable CONFIG_NETFILTER_DEBUG, so > we can see where exactly the problem occurs. > > Regards > Patrick > > > > > Phil Oester > > > > > > Lockup #1: > > Pid: 0, comm: swapper > > EIP: 0060:[<c024a3e7>] CPU: 1 > > EIP is at __write_lock_failed+0xf/0x20 > > EFLAGS: 00000287 Not tainted (2.6.6) > > EAX: c0283360 EBX: ffffffff ECX: 7d9d14aa EDX: ee83c1e0 > > ESI: f454b910 EDI: ffffffff EBP: 0000007d DS: 007b ES: 007b > > CR0: 8005003b CR2: 08076ac4 CR3: 37b34000 CR4: 00000690 > > Call Trace: > > [<c0237f28>] .text.lock.ip_conntrack_core+0x7d/0xd5 > > [<c023cf6d>] do_bindings+0x8d/0x260 > > [<c0238855>] try_rfc959+0x25/0x30 > > [<c0238dd7>] help+0x2f7/0x430 > > [<c0238830>] try_rfc959+0x0/0x30 > > [<c0238251>] tcp_packet+0xd1/0x160 > > [<c0236ea0>] ip_conntrack_in+0x100/0x220 > > [<c01fd182>] nf_iterate+0x72/0xb0 > > [<c0205fc0>] ip_rcv_finish+0x0/0x245 > > [<c01fd468>] nf_hook_slow+0x78/0x110 > > [<c0205fc0>] ip_rcv_finish+0x0/0x245 > > [<c0205da1>] ip_rcv+0x3c1/0x480 > > [<c0205fc0>] ip_rcv_finish+0x0/0x245 > > [<c01effe2>] alloc_skb+0x32/0xd0 > > [<c01f4d72>] netif_receive_skb+0x162/0x190 > > [<c01c9889>] e1000_clean_rx_irq+0x399/0x410 > > [<c01c9244>] e1000_clean+0x34/0xb0 > > [<c01f4f3f>] net_rx_action+0x7f/0x110 > > [<c011ae84>] __do_softirq+0xb4/0xc0 > > [<c0106b9c>] do_softirq+0x4c/0x60 > > ======================= > > [<c0106275>] do_IRQ+0x145/0x180 > > [<c010467c>] common_interrupt+0x18/0x20 > > [<c0101e20>] default_idle+0x0/0x40 > > [<c0101e4c>] default_idle+0x2c/0x40 > > [<c0101edb>] cpu_idle+0x3b/0x50 > > [<c01177b7>] __call_console_drivers+0x57/0x60 > > [<c01178af>] call_console_drivers+0x7f/0x100 > > > > > > Lockup #2: > > Pid: 0, comm: swapper > > EIP: 0060:[<c0261bd0>] CPU: 0 > > EIP is at .text.lock.ip_nat_ftp+0x19/0x29 > > EFLAGS: 00000286 Not tainted (2.6.6) > > EAX: 00000001 EBX: c0306000 ECX: d31c3034 EDX: eaeb8ac0 > > ESI: 00000019 EDI: eaeb8a48 EBP: c0306d24 DS: 007b ES: 007b > > CR0: 8005003b CR2: 4024f0ec CR3: 31515000 CR4: 00000690 > > Call Trace: > > [<c0260592>] tcp_exp_matches_pkt+0x32/0x79 > > [<c0266e5f>] do_bindings+0x34f/0x570 > > [<c0264c17>] ip_nat_fn+0x77/0x310 > > [<c021f0be>] nf_iterate+0x6e/0xc0 > > [<c022dcb0>] ip_finish_output2+0x0/0x1cb > > [<c021f406>] nf_hook_slow+0x86/0x150 > > [<c022dcb0>] ip_finish_output2+0x0/0x1cb > > [<c022b8b3>] ip_finish_output+0x43/0x50 > > [<c022dcb0>] ip_finish_output2+0x0/0x1cb > > [<c022a47c>] ip_forward_finish+0x2c/0x50 > > [<c021f45a>] nf_hook_slow+0xda/0x150 > > [<c022a450>] ip_forward_finish+0x0/0x50 > > [<c022a3b7>] ip_forward+0x137/0x1d0 > > [<c022a450>] ip_forward_finish+0x0/0x50 > > [<c02290b8>] ip_rcv_finish+0x1e8/0x25d > > [<c021f0be>] nf_iterate+0x6e/0xc0 > > [<c0228ed0>] ip_rcv_finish+0x0/0x25d > > [<c021f45a>] nf_hook_slow+0xda/0x150 > > [<c0228ed0>] ip_rcv_finish+0x0/0x25d > > [<c0228cad>] ip_rcv+0x18d/0x240 > > [<c0228ed0>] ip_rcv_finish+0x0/0x25d > > [<c0215a14>] netif_receive_skb+0x174/0x1a0 > > [<c01e60f8>] e1000_clean_rx_irq+0x3d8/0x490 > > [<c01e5a2c>] e1000_clean+0x3c/0xb0 > > [<c0215bf0>] net_rx_action+0x90/0x130 > > [<c011f204>] __do_softirq+0xb4/0xc0 > > [<c010764f>] do_softirq+0x4f/0x60 > > ======================= > > [<c0106979>] do_IRQ+0x1a9/0x260 > > [<c011091c>] smp_apic_timer_interrupt+0xcc/0x130 > > [<c0104bb0>] common_interrupt+0x18/0x20 > > [<c0102150>] default_idle+0x0/0x40 > > [<c010217f>] default_idle+0x2f/0x40 > > [<c010220b>] cpu_idle+0x3b/0x50 > > [<c02d7520>] unknown_bootoption+0x0/0x120 > > [<c02d7943>] start_kernel+0x173/0x1c0 > > [<c02d7520>] unknown_bootoption+0x0/0x120 > > > > > > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: Deadlocks 2004-06-15 4:47 ` Deadlocks Phil Oester @ 2004-06-15 6:23 ` Patrick McHardy 2004-06-17 15:59 ` Deadlocks Phil Oester 0 siblings, 1 reply; 17+ messages in thread From: Patrick McHardy @ 2004-06-15 6:23 UTC (permalink / raw) To: Phil Oester; +Cc: netfilter-devel [-- Attachment #1: Type: text/plain, Size: 1531 bytes --] Phil Oester wrote: > I agree I am likely experiencing the deadlock you refer to: > > CPU1: > conntrack-helper:help: lock(private_lock) > ip_conntrack_expect_related: write_lock(ip_conntrack_lock) > > CPU2: > nat-core:do_bindings: read_lock(ip_conntrack_lock) > nat-helper:help: lock(private_lock) > > However, it's unclear to me that the ip_ftp_lock can be trivially eliminated. > > This code path looks particularly prickly in ip_nat_ftp.c: > > help > ftp_data_fixup > ip_conntrack_change_expect > > so the nat helper is changing the expectation -- potentially at the same time > the conntrack helper is calling ip_conntrack_expect. If the private lock > were removed, could this not cause a race condition if the expectation got > created just after the nat-helper changed the expectation? I don't understand what you mean. The nat-helper can not change the expectation before it's created, and once it's created it can not be touched by the conntrack helper anymore. ip_ftp_lock is protecting ftp_buffer and ct_ftp_info, so it can be dropped directly after the call to find_pattern. The help function in the nat_helper only touches the expectation, which is protected by ip_conntrack_lock, so it doesn't need ip_ftp_lock lock at all. > > It seems the ip_ftp_lock is needed, but perhaps needs to be reworked to avoid > the deadlock condition illustrated above. I've attached an untested patch which should fix this problem for the ftp helper. Care to give it a try ? Regards Patrick > > Thoughts? > > Phil [-- Attachment #2: x --] [-- Type: text/plain, Size: 4945 bytes --] ===== include/linux/netfilter_ipv4/ip_conntrack_ftp.h 1.4 vs edited ===== --- 1.4/include/linux/netfilter_ipv4/ip_conntrack_ftp.h 2002-08-19 20:41:51 +02:00 +++ edited/include/linux/netfilter_ipv4/ip_conntrack_ftp.h 2004-06-15 08:20:59 +02:00 @@ -4,11 +4,6 @@ #ifdef __KERNEL__ -#include <linux/netfilter_ipv4/lockhelp.h> - -/* Protects ftp part of conntracks */ -DECLARE_LOCK_EXTERN(ip_ftp_lock); - #define FTP_PORT 21 #endif /* __KERNEL__ */ ===== net/ipv4/netfilter/ip_conntrack_ftp.c 1.19 vs edited ===== --- 1.19/net/ipv4/netfilter/ip_conntrack_ftp.c 2004-03-30 06:18:56 +02:00 +++ edited/net/ipv4/netfilter/ip_conntrack_ftp.c 2004-06-15 08:20:28 +02:00 @@ -27,7 +27,7 @@ /* This is slow, but it's simple. --RR */ static char ftp_buffer[65536]; -DECLARE_LOCK(ip_ftp_lock); +static DECLARE_LOCK(ip_ftp_lock); struct module *ip_conntrack_ftp = THIS_MODULE; #define MAX_PORTS 8 @@ -327,6 +327,7 @@ search[i].getnum); if (found) break; } + UNLOCK_BH(&ip_ftp_lock); if (found == -1) { /* We don't usually drop packets. After all, this is connection tracking, not packet filtering. @@ -336,12 +337,9 @@ printk("conntrack_ftp: partial %s %u+%u\n", search[i].pattern, ntohl(tcph.seq), datalen); - ret = NF_DROP; - goto out; - } else if (found == 0) { /* No match */ - ret = NF_ACCEPT; - goto out; - } + return NF_DROP; + } else if (found == 0) /* No match */ + return NF_ACCEPT; DEBUGP("conntrack_ftp: match `%.*s' (%u bytes at %u)\n", (int)matchlen, data + matchoff, @@ -349,11 +347,8 @@ /* Allocate expectation which will be inserted */ exp = ip_conntrack_expect_alloc(); - if (exp == NULL) { - ret = NF_ACCEPT; - goto out; - } - + if (exp == NULL) + return NF_ACCEPT; exp_ftp_info = &exp->help.exp_ftp_info; /* Update the ftp info */ @@ -376,10 +371,8 @@ <lincoln@cesar.org.br> for reporting this potential problem (DMZ machines opening holes to internal networks, or the packet filter itself). */ - if (!loose) { - ret = NF_ACCEPT; - goto out; - } + if (!loose) + return NF_ACCEPT; } exp->tuple = ((struct ip_conntrack_tuple) @@ -397,7 +390,8 @@ /* Ignore failure; should only happen with NAT */ ip_conntrack_expect_related(exp, ct); - ret = NF_ACCEPT; + return NF_ACCEPT; + out: UNLOCK_BH(&ip_ftp_lock); return ret; @@ -457,7 +451,6 @@ } PROVIDES_CONNTRACK(ftp); -EXPORT_SYMBOL(ip_ftp_lock); module_init(init); module_exit(fini); ===== net/ipv4/netfilter/ip_nat_ftp.c 1.13 vs edited ===== --- 1.13/net/ipv4/netfilter/ip_nat_ftp.c 2004-01-29 00:59:33 +01:00 +++ edited/net/ipv4/netfilter/ip_nat_ftp.c 2004-06-15 08:23:13 +02:00 @@ -37,8 +37,6 @@ MODULE_PARM(ports, "1-" __MODULE_STRING(MAX_PORTS) "i"); #endif -DECLARE_LOCK_EXTERN(ip_ftp_lock); - /* FIXME: Time out? --RR */ static unsigned int @@ -61,8 +59,6 @@ DEBUGP("nat_expected: We have a connection!\n"); exp_ftp_info = &ct->master->help.exp_ftp_info; - LOCK_BH(&ip_ftp_lock); - if (exp_ftp_info->ftptype == IP_CT_FTP_PORT || exp_ftp_info->ftptype == IP_CT_FTP_EPRT) { /* PORT command: make connection go to the client. */ @@ -77,7 +73,6 @@ DEBUGP("nat_expected: PASV cmd. %u.%u.%u.%u->%u.%u.%u.%u\n", NIPQUAD(newsrcip), NIPQUAD(newdstip)); } - UNLOCK_BH(&ip_ftp_lock); if (HOOK2MANIP(hooknum) == IP_NAT_MANIP_SRC) newip = newsrcip; @@ -113,8 +108,6 @@ { char buffer[sizeof("nnn,nnn,nnn,nnn,nnn,nnn")]; - MUST_BE_LOCKED(&ip_ftp_lock); - sprintf(buffer, "%u,%u,%u,%u,%u,%u", NIPQUAD(newip), port>>8, port&0xFF); @@ -136,8 +129,6 @@ { char buffer[sizeof("|1|255.255.255.255|65535|")]; - MUST_BE_LOCKED(&ip_ftp_lock); - sprintf(buffer, "|1|%u.%u.%u.%u|%u|", NIPQUAD(newip), port); DEBUGP("calling ip_nat_mangle_tcp_packet\n"); @@ -158,8 +149,6 @@ { char buffer[sizeof("|||65535|")]; - MUST_BE_LOCKED(&ip_ftp_lock); - sprintf(buffer, "|||%u|", port); DEBUGP("calling ip_nat_mangle_tcp_packet\n"); @@ -191,7 +180,6 @@ u_int16_t port; struct ip_conntrack_tuple newtuple; - MUST_BE_LOCKED(&ip_ftp_lock); DEBUGP("FTP_NAT: seq %u + %u in %u\n", expect->seq, ct_ftp_info->len, ntohl(tcph->seq)); @@ -270,15 +258,12 @@ } datalen = (*pskb)->len - iph->ihl * 4 - tcph->doff * 4; - LOCK_BH(&ip_ftp_lock); /* If it's in the right range... */ if (between(exp->seq + ct_ftp_info->len, ntohl(tcph->seq), ntohl(tcph->seq) + datalen)) { - if (!ftp_data_fixup(ct_ftp_info, ct, pskb, ctinfo, exp)) { - UNLOCK_BH(&ip_ftp_lock); + if (!ftp_data_fixup(ct_ftp_info, ct, pskb, ctinfo, exp)) return NF_DROP; - } } else { /* Half a match? This means a partial retransmisison. It's a cracker being funky. */ @@ -288,11 +273,8 @@ ntohl(tcph->seq), ntohl(tcph->seq) + datalen); } - UNLOCK_BH(&ip_ftp_lock); return NF_DROP; } - UNLOCK_BH(&ip_ftp_lock); - return NF_ACCEPT; } ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: Deadlocks 2004-06-15 6:23 ` Deadlocks Patrick McHardy @ 2004-06-17 15:59 ` Phil Oester 2004-06-17 16:20 ` Deadlocks Patrick McHardy 0 siblings, 1 reply; 17+ messages in thread From: Phil Oester @ 2004-06-17 15:59 UTC (permalink / raw) To: Patrick McHardy; +Cc: netfilter-devel Yes, my statement was not clear at all. What I meant was something like: cpu 1: conntrack helper calls ip_conntrack_expect_related cpu 2: nat helper calls ip_conntrack_change_expect CPU 2 ends up causing a duplicate expectation, because the nat helper changed the expectation to match the one created by cpu 1. I do see duplicate expectations occasionally: # grep EXP /proc/net/ip_conntrack EXPECTING: - use=1 proto=6 src=10.20.116.197 dst=10.20.153.248 sport=0 dport=4309 EXPECTING: - use=1 proto=6 src=10.20.116.197 dst=10.20.153.248 sport=0 dport=4309 which may or may not be related to the above. In any event, I have applied your patch to 2.6.7, and am running it. Typically the box would not last more than a couple days, so I'll let you know what happens. Phil On Tue, Jun 15, 2004 at 08:23:26AM +0200, Patrick McHardy wrote: > Phil Oester wrote: > >so the nat helper is changing the expectation -- potentially at the same > >time > >the conntrack helper is calling ip_conntrack_expect. If the private lock > >were removed, could this not cause a race condition if the expectation got > >created just after the nat-helper changed the expectation? > > I don't understand what you mean. The nat-helper can not change the > expectation before it's created, and once it's created it can not > be touched by the conntrack helper anymore. ip_ftp_lock is protecting > ftp_buffer and ct_ftp_info, so it can be dropped directly after the > call to find_pattern. The help function in the nat_helper only touches > the expectation, which is protected by ip_conntrack_lock, so it doesn't > need ip_ftp_lock lock at all. ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: Deadlocks 2004-06-17 15:59 ` Deadlocks Phil Oester @ 2004-06-17 16:20 ` Patrick McHardy 2004-06-18 17:12 ` Deadlocks Phil Oester 0 siblings, 1 reply; 17+ messages in thread From: Patrick McHardy @ 2004-06-17 16:20 UTC (permalink / raw) To: Phil Oester; +Cc: netfilter-devel Phil Oester wrote: > Yes, my statement was not clear at all. What I meant was something like: > > cpu 1: > conntrack helper calls ip_conntrack_expect_related > > cpu 2: > nat helper calls ip_conntrack_change_expect > > CPU 2 ends up causing a duplicate expectation, because the nat helper > changed the expectation to match the one created by cpu 1. This can't happen because ip_conntrack_change_expect in is called under read_locked ip_conntrack_lock and checks for duplicates and ip_conntrack_expect_related write_locks ip_conntrack_lock and checks for duplicates. ip_conntrack_change_expect additionally write_locks ip_conntrack_expect_tuple_lock so it won't race with itself on another CPU. > > I do see duplicate expectations occasionally: > > # grep EXP /proc/net/ip_conntrack > EXPECTING: - use=1 proto=6 src=10.20.116.197 dst=10.20.153.248 sport=0 dport=4309 > EXPECTING: - use=1 proto=6 src=10.20.116.197 dst=10.20.153.248 sport=0 dport=4309 > > which may or may not be related to the above. Probably not, unless I missed something. I'm going to see if I can find something else. > > In any event, I have applied your patch to 2.6.7, and am running it. Typically > the box would not last more than a couple days, so I'll let you know what > happens. Great, I'm really interested .. Regards Patrick > > Phil > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: Deadlocks 2004-06-17 16:20 ` Deadlocks Patrick McHardy @ 2004-06-18 17:12 ` Phil Oester 2004-06-21 0:46 ` Deadlocks Patrick McHardy 0 siblings, 1 reply; 17+ messages in thread From: Phil Oester @ 2004-06-18 17:12 UTC (permalink / raw) To: Patrick McHardy; +Cc: netfilter-devel Well, it lasted about 36 hours -- not much longer than usual. Unfortunately, the stack appears to have been corrupted, so I can't get a decent backtrace. Here is what I could get off of SysRQ-P: Pid: 0, comm: swapper EIP: 0060:[<c0258b15>] CPU: 1 EIP is at tcp_find_option+0x55/0xa0 EFLAGS: 00000203 Not tainted (2.6.7) EAX: 000000fe EBX: 00000040 ECX: 00000002 EDX: 00000034 ESI: 00000018 EDI: f89c39bc EBP: 00000000 DS: 007b ES: 007b CR0: 8005003b CR2: 080da0b4 CR3: 379cc000 CR4: 000006d0 Stack pointer is garbage, not printing trace Perhaps of interest, not sure, but the FTP server at 10.0.16.197 frequently shows duplicate expectations, as shown below shortly after rebooting: EXPECTING: - use=1 proto=6 src=10.0.16.197 dst=10.0.53.248 sport=0 dport=4353 EXPECTING: - use=1 proto=6 src=10.0.16.197 dst=10.0.53.248 sport=0 dport=4353 EXPECTING: - use=1 proto=6 src=10.0.16.197 dst=10.0.53.248 sport=0 dport=4353 Unless you've got any other ideas, may have to revert this box to non-SMP so I can have a peaceful weekend ;-) Phil On Thu, Jun 17, 2004 at 06:20:15PM +0200, Patrick McHardy wrote: > Phil Oester wrote: > >In any event, I have applied your patch to 2.6.7, and am running it. > >Typically > >the box would not last more than a couple days, so I'll let you know what > >happens. > > Great, I'm really interested .. ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: Deadlocks 2004-06-18 17:12 ` Deadlocks Phil Oester @ 2004-06-21 0:46 ` Patrick McHardy 2004-06-22 4:31 ` Deadlocks Phil Oester 2004-06-29 17:54 ` Deadlocks Phil Oester 0 siblings, 2 replies; 17+ messages in thread From: Patrick McHardy @ 2004-06-21 0:46 UTC (permalink / raw) To: Phil Oester; +Cc: netfilter-devel Phil Oester wrote: > Well, it lasted about 36 hours -- not much longer than usual. Unfortunately, > the stack appears to have been corrupted, so I can't get a decent backtrace. > Here is what I could get off of SysRQ-P: > > Pid: 0, comm: swapper > EIP: 0060:[<c0258b15>] CPU: 1 > EIP is at tcp_find_option+0x55/0xa0 > EFLAGS: 00000203 Not tainted (2.6.7) > EAX: 000000fe EBX: 00000040 ECX: 00000002 EDX: 00000034 > ESI: 00000018 EDI: f89c39bc EBP: 00000000 DS: 007b ES: 007b > CR0: 8005003b CR2: 080da0b4 CR3: 379cc000 CR4: 000006d0 > Stack pointer is garbage, not printing trace > > Perhaps of interest, not sure, but the FTP server at 10.0.16.197 frequently > shows duplicate expectations, as shown below shortly after rebooting: > > EXPECTING: - use=1 proto=6 src=10.0.16.197 dst=10.0.53.248 sport=0 dport=4353 > EXPECTING: - use=1 proto=6 src=10.0.16.197 dst=10.0.53.248 sport=0 dport=4353 > EXPECTING: - use=1 proto=6 src=10.0.16.197 dst=10.0.53.248 sport=0 dport=4353 Not sure either, but it's a start. Have you tried running the box with netfilter debugging enabled ? Please also apply the ip_nf_assert fix from pom-ng, otherwise CONFIG_NETFILTER_DEBUG won't help much. BTW: Is the box a router or is conntrack running on the FTP server itself ? > Unless you've got any other ideas, may have to revert this box to non-SMP > so I can have a peaceful weekend ;-) No more ideas currently .. ;( > Phil > Regards Patrick ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: Deadlocks 2004-06-21 0:46 ` Deadlocks Patrick McHardy @ 2004-06-22 4:31 ` Phil Oester 2004-06-22 9:52 ` Deadlocks Patrick McHardy 2004-06-29 17:54 ` Deadlocks Phil Oester 1 sibling, 1 reply; 17+ messages in thread From: Phil Oester @ 2004-06-22 4:31 UTC (permalink / raw) To: Patrick McHardy; +Cc: netfilter-devel On Mon, Jun 21, 2004 at 02:46:19AM +0200, Patrick McHardy wrote: > Not sure either, but it's a start. Have you tried running the box with > netfilter debugging enabled ? Please also apply the ip_nf_assert fix > from pom-ng, otherwise CONFIG_NETFILTER_DEBUG won't help much. > BTW: Is the box a router or is conntrack running on the FTP server > itself ? The box is a router -- the ftp server is a separate box. Thanks for the tip on the ip_nf_assert patch - I'd been running with debugging enabled but wondered why I never saw anything... Now that I enabled debugging (for real), I hit this one a few hundred times per minute: NF_IP_ASSERT: net/ipv4/netfilter/ip_conntrack_core.c:717(init_conntrack) which is in this chunk of code: if (expected) { DEBUGP("conntrack: expectation arrives ct=%p exp=%p\n", conntrack, expected); /* Welcome, Mr. Bond. We've been expecting you... */ IP_NF_ASSERT(master_ct(conntrack)); __set_bit(IPS_EXPECTED_BIT, &conntrack->status); conntrack->master = expected; expected->sibling = conntrack; LIST_DELETE(&ip_conntrack_expect_list, expected); expected->expectant->expecting--; nf_conntrack_get(&master_ct(conntrack)->infos[0]); } Other than being mildly annoying, this doesn't explain the deadlocks, so I'll let it run for a few more days... Phil ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: Deadlocks 2004-06-22 4:31 ` Deadlocks Phil Oester @ 2004-06-22 9:52 ` Patrick McHardy 0 siblings, 0 replies; 17+ messages in thread From: Patrick McHardy @ 2004-06-22 9:52 UTC (permalink / raw) To: Phil Oester; +Cc: netfilter-devel Phil Oester wrote: > Thanks for the tip on the ip_nf_assert patch - I'd been running with debugging > enabled but wondered why I never saw anything... > > Now that I enabled debugging (for real), I hit this one a few hundred times > per minute: > > NF_IP_ASSERT: net/ipv4/netfilter/ip_conntrack_core.c:717(init_conntrack) Yes, this assertion is bogus, I need to update the patch in pom-ng. Just delete the ASSERTION, it tests for conntrack->master, which is assigned two lines below. Hopefully we get to see something more interesting .. Regards Patrick ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: Deadlocks 2004-06-21 0:46 ` Deadlocks Patrick McHardy 2004-06-22 4:31 ` Deadlocks Phil Oester @ 2004-06-29 17:54 ` Phil Oester 2004-06-29 18:00 ` Deadlocks Patrick McHardy 1 sibling, 1 reply; 17+ messages in thread From: Phil Oester @ 2004-06-29 17:54 UTC (permalink / raw) To: Patrick McHardy; +Cc: netfilter-devel Well, the box has now lasted 7 days without a deadlock, so I'd venture to say your patch has solved the issue, and should probably be added to mainline. Thanks for the help Phil On Mon, Jun 21, 2004 at 02:46:19AM +0200, Patrick McHardy wrote: > Not sure either, but it's a start. Have you tried running the box with > netfilter debugging enabled ? Please also apply the ip_nf_assert fix > from pom-ng, otherwise CONFIG_NETFILTER_DEBUG won't help much. > BTW: Is the box a router or is conntrack running on the FTP server > itself ? > > >Unless you've got any other ideas, may have to revert this box to non-SMP > >so I can have a peaceful weekend ;-) > > No more ideas currently .. ;( ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: Deadlocks 2004-06-29 17:54 ` Deadlocks Phil Oester @ 2004-06-29 18:00 ` Patrick McHardy 2004-06-29 20:09 ` Deadlocks Phil Oester 0 siblings, 1 reply; 17+ messages in thread From: Patrick McHardy @ 2004-06-29 18:00 UTC (permalink / raw) To: Phil Oester; +Cc: netfilter-devel Phil Oester wrote: > Well, the box has now lasted 7 days without a deadlock, so I'd venture > to say your patch has solved the issue, and should probably be added to > mainline. Thanks for the update, but I thought it kept crashing when you first tried the patch ? Regards Patrick > > Thanks for the help > > Phil ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: Deadlocks 2004-06-29 18:00 ` Deadlocks Patrick McHardy @ 2004-06-29 20:09 ` Phil Oester 2004-06-30 9:50 ` Deadlocks Patrick McHardy 0 siblings, 1 reply; 17+ messages in thread From: Phil Oester @ 2004-06-29 20:09 UTC (permalink / raw) To: Patrick McHardy; +Cc: netfilter-devel On Tue, Jun 29, 2004 at 08:00:45PM +0200, Patrick McHardy wrote: > Phil Oester wrote: > >Well, the box has now lasted 7 days without a deadlock, so I'd venture > >to say your patch has solved the issue, and should probably be added to > >mainline. > > Thanks for the update, but I thought it kept crashing when you first > tried the patch ? It crashed once, but appears to have been stack corruption which could've been caused by anything. After it crashed I enabled CONFIG_NETFILTER_DEBUG and it's been quiet ever since. Possible that enabling debugging prevents the issue? Phil ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: Deadlocks 2004-06-29 20:09 ` Deadlocks Phil Oester @ 2004-06-30 9:50 ` Patrick McHardy 2004-07-01 16:12 ` Deadlocks Phil Oester 0 siblings, 1 reply; 17+ messages in thread From: Patrick McHardy @ 2004-06-30 9:50 UTC (permalink / raw) To: Phil Oester; +Cc: netfilter-devel Phil Oester wrote: > On Tue, Jun 29, 2004 at 08:00:45PM +0200, Patrick McHardy wrote: >> >>Thanks for the update, but I thought it kept crashing when you first >>tried the patch ? > > It crashed once, but appears to have been stack corruption which > could've been caused by anything. After it crashed I enabled > CONFIG_NETFILTER_DEBUG and it's been quiet ever since. Possible > that enabling debugging prevents the issue? Could be, but I doubt it. Could you try without CONFIG_NETFILTER_DEBUG once more ? Regards Patrick > > Phil > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: Deadlocks 2004-06-30 9:50 ` Deadlocks Patrick McHardy @ 2004-07-01 16:12 ` Phil Oester 0 siblings, 0 replies; 17+ messages in thread From: Phil Oester @ 2004-07-01 16:12 UTC (permalink / raw) To: Patrick McHardy; +Cc: netfilter-devel On Wed, Jun 30, 2004 at 11:50:50AM +0200, Patrick McHardy wrote: > Could be, but I doubt it. Could you try without CONFIG_NETFILTER_DEBUG > once more ? Interestingly, when it crashed that one time it was in tcp_find_option, and I had a uniprocessor box hang in tcp_find_option yesterday also. It looks like I'm hitting the infinite loop discussed here: http://www.netfilter.org/security/2004-06-30-2.6-tcpoption.html since I have 2 tcp-option rules: $IPT -A badtcp -p tcp --tcp-option 64 -j logdrop $IPT -A badtcp -p tcp --tcp-option 128 -j logdrop So I'll apply that patch along with your FTP locking patch and see how it works out. Phil ^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2004-07-01 16:12 UTC | newest] Thread overview: 17+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2004-06-09 18:09 Deadlocks Phil Oester 2004-06-10 8:07 ` Deadlocks Jozsef Kadlecsik 2004-06-10 15:02 ` Deadlocks Phil Oester 2004-06-13 19:58 ` Deadlocks Patrick McHardy 2004-06-15 4:47 ` Deadlocks Phil Oester 2004-06-15 6:23 ` Deadlocks Patrick McHardy 2004-06-17 15:59 ` Deadlocks Phil Oester 2004-06-17 16:20 ` Deadlocks Patrick McHardy 2004-06-18 17:12 ` Deadlocks Phil Oester 2004-06-21 0:46 ` Deadlocks Patrick McHardy 2004-06-22 4:31 ` Deadlocks Phil Oester 2004-06-22 9:52 ` Deadlocks Patrick McHardy 2004-06-29 17:54 ` Deadlocks Phil Oester 2004-06-29 18:00 ` Deadlocks Patrick McHardy 2004-06-29 20:09 ` Deadlocks Phil Oester 2004-06-30 9:50 ` Deadlocks Patrick McHardy 2004-07-01 16:12 ` Deadlocks Phil Oester
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.