From mboxrd@z Thu Jan 1 00:00:00 1970 From: dingtianhong Subject: [BUG REPORT] ipv6: possible unsafe locking scenario Date: Wed, 8 May 2013 12:44:38 +0800 Message-ID: <5189D836.3060903@huawei.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: QUOTED-PRINTABLE To: "David S. Miller" , Eric Dumazet , Netdev , Li Zefan Return-path: Received: from szxga02-in.huawei.com ([119.145.14.65]:48217 "EHLO szxga02-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750815Ab3EHEpG (ORCPT ); Wed, 8 May 2013 00:45:06 -0400 Sender: netdev-owner@vger.kernel.org List-ID: hi =EF=BC=81 I make the kernel config with CONFIG_PROVE_LOCKING CONFIG_IOSCHED_CFQ C= ONFIG_PREEMPT_RT_FULL on, and do several test case, it works well, but i notice that the log mess= age has some Call Trace for rwlock, it happens only once, maybe the lock use is not safe in ipv6 and need t= o improve. CPU0 CPU1 ---- ---- lock(&mc->mca_lock); lock(&ndev->lock); lock(&mc->mca_lock); lock(&ndev->lock); the kernel version is 3.4.24 the test case include LSB. the problem has report to bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=3D57691&GoAheadAndLogIn=3D1 following the message: linux kernel: [ 5913.077146]=20 Apr 20 11:01:28 euler-linux kernel: [ 5913.077149] =3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Apr 20 11:01:28 euler-linux kernel: [ 5913.077150] [ INFO: possible cir= cular locking dependency detected ] Apr 20 11:01:28 euler-linux kernel: [ 5913.077154] 3.4.24.05-0.1-defaul= t #1 Not tainted Apr 20 11:01:28 euler-linux kernel: [ 5913.077155] --------------------= ----------------------------------- Apr 20 11:01:28 euler-linux kernel: [ 5913.077157] ksoftirqd/0/3 is try= ing to acquire lock: Apr 20 11:01:28 euler-linux kernel: [ 5913.077158] (&ndev->lock){+.+..= =2E}, at: [] ipv6_get_lladdr+0x74/0x120 Apr 20 11:01:28 euler-linux kernel: [ 5913.077168]=20 Apr 20 11:01:28 euler-linux kernel: [ 5913.077169] but task is already = holding lock: Apr 20 11:01:28 euler-linux kernel: [ 5913.077170] (&mc->mca_lock){+.+= =2E..}, at: [] mld_send_report+0x40/0x150 Apr 20 11:01:28 euler-linux kernel: [ 5913.077177]=20 Apr 20 11:01:28 euler-linux kernel: [ 5913.077177] which lock already d= epends on the new lock. Apr 20 11:01:28 euler-linux kernel: [ 5913.077178]=20 Apr 20 11:01:28 euler-linux kernel: [ 5913.077179]=20 Apr 20 11:01:28 euler-linux kernel: [ 5913.077179] the existing depende= ncy chain (in reverse order) is: Apr 20 11:01:28 euler-linux kernel: [ 5913.077181]=20 Apr 20 11:01:28 euler-linux kernel: [ 5913.077182] -> #1 (&mc->mca_lock= ){+.+...}: Apr 20 11:01:28 euler-linux kernel: [ 5913.077184] [] validate_chain+0x637/0x730 Apr 20 11:01:28 euler-linux kernel: [ 5913.077191] [] __lock_acquire+0x2f7/0x500 Apr 20 11:01:28 euler-linux kernel: [ 5913.077195] [] lock_acquire+0x114/0x150 Apr 20 11:01:28 euler-linux kernel: [ 5913.077198] [] rt_spin_lock+0x4a/0x60 Apr 20 11:01:28 euler-linux kernel: [ 5913.077203] [] igmp6_group_added+0x3b/0x120 Apr 20 11:01:28 euler-linux kernel: [ 5913.077206] [] ipv6_mc_up+0x38/0x60 Apr 20 11:01:28 euler-linux kernel: [ 5913.077209] [] ipv6_find_idev+0x3d/0x80 Apr 20 11:01:28 euler-linux kernel: [ 5913.077212] [] addrconf_notify+0x3d5/0x4b0 Apr 20 11:01:28 euler-linux kernel: [ 5913.077215] [] notifier_call_chain+0x3f/0x80 Apr 20 11:01:28 euler-linux kernel: [ 5913.077218] [] raw_notifier_call_chain+0x11/0x20 Apr 20 11:01:28 euler-linux kernel: [ 5913.077224] [] call_netdevice_notifiers+0x32/0x60 Apr 20 11:01:28 euler-linux kernel: [ 5913.077230] [] __dev_notify_flags+0x34/0x80 Apr 20 11:01:28 euler-linux kernel: [ 5913.077233] [] dev_change_flags+0x40/0x70 Apr 20 11:01:28 euler-linux kernel: [ 5913.077236] [] do_setlink+0x237/0x8a0 Apr 20 11:01:28 euler-linux kernel: [ 5913.077240] [] rtnl_newlink+0x3ec/0x600 Apr 20 11:01:28 euler-linux kernel: [ 5913.077243] [] rtnetlink_rcv_msg+0x160/0x310 Apr 20 11:01:28 euler-linux kernel: [ 5913.077246] [] netlink_rcv_skb+0x89/0xb0 Apr 20 11:01:28 euler-linux kernel: [ 5913.077251] [] rtnetlink_rcv+0x27/0x40 Apr 20 11:01:28 euler-linux kernel: [ 5913.077254] [] netlink_unicast+0x140/0x180 Apr 20 11:01:28 euler-linux kernel: [ 5913.077257] [] netlink_sendmsg+0x33e/0x380 Apr 20 11:01:28 euler-linux kernel: [ 5913.077260] [] sock_sendmsg+0x112/0x130 Apr 20 11:01:28 euler-linux kernel: [ 5913.077264] [] __sys_sendmsg+0x44e/0x460 Apr 20 11:01:28 euler-linux kernel: [ 5913.077267] [] sys_sendmsg+0x44/0x70 Apr 20 11:01:28 euler-linux kernel: [ 5913.077269] [] system_call_fastpath+0x16/0x1b Apr 20 11:01:28 euler-linux kernel: [ 5913.077273]=20 Apr 20 11:01:28 euler-linux kernel: [ 5913.077273] -> #0 (&ndev->lock){= +.+...}: Apr 20 11:01:28 euler-linux kernel: [ 5913.077275] [] check_prev_add+0x3de/0x440 Apr 20 11:01:28 euler-linux kernel: [ 5913.077278] [] validate_chain+0x637/0x730 Apr 20 11:01:28 euler-linux kernel: [ 5913.077281] [] __lock_acquire+0x2f7/0x500 Apr 20 11:01:28 euler-linux kernel: [ 5913.077284] [] lock_acquire+0x114/0x150 Apr 20 11:01:28 euler-linux kernel: [ 5913.077287] [] rt_read_lock+0x42/0x60 Apr 20 11:01:28 euler-linux kernel: [ 5913.077290] [] ipv6_get_lladdr+0x74/0x120 Apr 20 11:01:28 euler-linux kernel: [ 5913.077293] [] mld_newpack+0xb6/0x160 Apr 20 11:01:28 euler-linux kernel: [ 5913.077295] [] add_grhead+0xab/0xc0 Apr 20 11:01:28 euler-linux kernel: [ 5913.077298] [] add_grec+0x3ab/0x460 Apr 20 11:01:28 euler-linux kernel: [ 5913.077301] [] mld_send_report+0x5a/0x150 Apr 20 11:01:28 euler-linux kernel: [ 5913.077304] [] igmp6_timer_handler+0x4e/0xb0 Apr 20 11:01:28 euler-linux kernel: [ 5913.077307] [] call_timer_fn+0xca/0x1d0 Apr 20 11:01:28 euler-linux kernel: [ 5913.077312] [] run_timer_softirq+0x1df/0x2e0 Apr 20 11:01:28 euler-linux kernel: [ 5913.077315] [] handle_pending_softirqs+0xf7/0x1f0 Apr 20 11:01:28 euler-linux kernel: [ 5913.077318] [] __do_softirq_common+0x7b/0xf0 Apr 20 11:01:28 euler-linux kernel: [ 5913.077320] [] __thread_do_softirq+0x1af/0x210 Apr 20 11:01:28 euler-linux kernel: [ 5913.077323] [] run_ksoftirqd+0xe1/0x1f0 Apr 20 11:01:28 euler-linux kernel: [ 5913.077325] [] kthread+0xae/0xc0 Apr 20 11:01:28 euler-linux kernel: [ 5913.077327] [] kernel_thread_helper+0x4/0x10 Apr 20 11:01:28 euler-linux kernel: [ 5913.077332]=20 Apr 20 11:01:28 euler-linux kernel: [ 5913.077332] other info that migh= t help us debug this: Apr 20 11:01:28 euler-linux kernel: [ 5913.077333]=20 Apr 20 11:01:28 euler-linux kernel: [ 5913.077334] Possible unsafe loc= king scenario: Apr 20 11:01:28 euler-linux kernel: [ 5913.077335]=20 Apr 20 11:01:28 euler-linux kernel: [ 5913.077336] CPU0 = CPU1 Apr 20 11:01:28 euler-linux kernel: [ 5913.077337] ---- = ---- Apr 20 11:01:28 euler-linux kernel: [ 5913.077338] lock(&mc->mca_lock= ); Apr 20 11:01:28 euler-linux kernel: [ 5913.077339] = lock(&ndev->lock); Apr 20 11:01:28 euler-linux kernel: [ 5913.077341] = lock(&mc->mca_lock); Apr 20 11:01:28 euler-linux kernel: [ 5913.077342] lock(&ndev->lock); Apr 20 11:01:28 euler-linux kernel: [ 5913.077344]=20 Apr 20 11:01:28 euler-linux kernel: [ 5913.077344] *** DEADLOCK *** Apr 20 11:01:28 euler-linux kernel: [ 5913.077345]=20 Apr 20 11:01:28 euler-linux kernel: [ 5913.077346] 4 locks held by ksof= tirqd/0/3: Apr 20 11:01:28 euler-linux kernel: [ 5913.077347] #0: (&per_cpu(loca= l_softirq_lock, __cpu).lock){+.+.+.}, at: [] __thread= _do_softirq+0x8e/0x210 Apr 20 11:01:28 euler-linux kernel: [ 5913.077351] #1: (&mc->mca_time= r){+.+...}, at: [] call_timer_fn+0x0/0x1d0 Apr 20 11:01:28 euler-linux kernel: [ 5913.077355] #2: (&mc->mca_lock= ){+.+...}, at: [] mld_send_report+0x40/0x150 Apr 20 11:01:28 euler-linux kernel: [ 5913.077359] #3: (rcu_read_lock= ){.+.+.+}, at: [] ipv6_get_lladdr+0x0/0x120 Apr 20 11:01:28 euler-linux kernel: [ 5913.077363]=20 Apr 20 11:01:28 euler-linux kernel: [ 5913.077363] stack backtrace: Apr 20 11:01:28 euler-linux kernel: [ 5913.077365] Pid: 3, comm: ksofti= rqd/0 Not tainted 3.4.24.05-0.1-default #1 Apr 20 11:01:28 euler-linux kernel: [ 5913.077367] Call Trace: Apr 20 11:01:28 euler-linux kernel: [ 5913.077371] [= ] print_circular_bug+0x10f/0x120 Apr 20 11:01:28 euler-linux kernel: [ 5913.077375] [= ] check_prev_add+0x3de/0x440 Apr 20 11:01:28 euler-linux kernel: [ 5913.077378] [= ] validate_chain+0x637/0x730 Apr 20 11:01:28 euler-linux kernel: [ 5913.077381] [= ] __lock_acquire+0x2f7/0x500 Apr 20 11:01:28 euler-linux kernel: [ 5913.077385] [= ] lock_acquire+0x114/0x150 Apr 20 11:01:28 euler-linux kernel: [ 5913.077387] [= ] ? ipv6_get_lladdr+0x74/0x120 Apr 20 11:01:28 euler-linux kernel: [ 5913.077391] [= ] ? get_parent_ip+0x11/0x50 Apr 20 11:01:28 euler-linux kernel: [ 5913.077394] [= ] rt_read_lock+0x42/0x60 Apr 20 11:01:28 euler-linux kernel: [ 5913.077396] [= ] ? ipv6_get_lladdr+0x74/0x120 Apr 20 11:01:28 euler-linux kernel: [ 5913.077399] [= ] ipv6_get_lladdr+0x74/0x120 Apr 20 11:01:28 euler-linux kernel: [ 5913.077401] [= ] ? if6_seq_start+0x100/0x100 Apr 20 11:01:28 euler-linux kernel: [ 5913.077404] [= ] mld_newpack+0xb6/0x160 Apr 20 11:01:28 euler-linux kernel: [ 5913.077407] [= ] ? __lock_acquire+0x2f7/0x500 Apr 20 11:01:28 euler-linux kernel: [ 5913.077410] [= ] add_grhead+0xab/0xc0 Apr 20 11:01:28 euler-linux kernel: [ 5913.077413] [= ] add_grec+0x3ab/0x460 Apr 20 11:01:28 euler-linux kernel: [ 5913.077416] [= ] ? ipv6_mc_destroy_dev+0xd0/0xd0 Apr 20 11:01:28 euler-linux kernel: [ 5913.077419] [= ] mld_send_report+0x5a/0x150 Apr 20 11:01:28 euler-linux kernel: [ 5913.077422] [= ] igmp6_timer_handler+0x4e/0xb0 Apr 20 11:01:28 euler-linux kernel: [ 5913.077425] [= ] call_timer_fn+0xca/0x1d0 Apr 20 11:01:28 euler-linux kernel: [ 5913.077427] [= ] ? del_timer+0x130/0x130 Apr 20 11:01:28 euler-linux kernel: [ 5913.077431] [= ] ? ipv6_mc_destroy_dev+0xd0/0xd0 Apr 20 11:01:28 euler-linux kernel: [ 5913.077434] [= ] run_timer_softirq+0x1df/0x2e0 Apr 20 11:01:28 euler-linux kernel: [ 5913.077437] [= ] handle_pending_softirqs+0xf7/0x1f0 Apr 20 11:01:29 euler-linux kernel: [ 5913.077439] [= ] __do_softirq_common+0x7b/0xf0 Apr 20 11:01:29 euler-linux kernel: [ 5913.077442] [= ] __thread_do_softirq+0x1af/0x210 Apr 20 11:01:29 euler-linux kernel: [ 5913.077444] [= ] run_ksoftirqd+0xe1/0x1f0 Apr 20 11:01:29 euler-linux kernel: [ 5913.077446] [= ] ? __thread_do_softirq+0x210/0x210 Apr 20 11:01:29 euler-linux kernel: [ 5913.077449] [= ] ? __thread_do_softirq+0x210/0x210 Apr 20 11:01:29 euler-linux kernel: [ 5913.077451] [= ] kthread+0xae/0xc0 Apr 20 11:01:29 euler-linux kernel: [ 5913.077455] [= ] kernel_thread_helper+0x4/0x10 Apr 20 11:01:29 euler-linux kernel: [ 5913.077459] [= ] ? finish_task_switch+0x86/0x120 Apr 20 11:01:29 euler-linux kernel: [ 5913.077462] [= ] ? retint_restore_args+0x13/0x13 Apr 20 11:01:29 euler-linux kernel: [ 5913.077465] [= ] ? kthreadd+0x310/0x310 Apr 20 11:01:29 euler-linux kernel: [ 5913.077468] [= ] ? gs_change+0x13/0x13 Apr 20 11:01:29 euler-linux kernel: [ 7880.565457] Adding 12284k swap o= n /home/swap. Priority:-2 extents:5 across:12588k=20 Apr 20 11:01:29 euler-linux kernel: [ 7880.832285] Adding 12284k swap o= n /home/swap. Priority:-2 extents:5 across:12364k=20 Apr 20 11:01:29 euler-linux kernel: [ 7881.278362] process `sysctl' is = using deprecated sysctl (syscall) net.ipv6.neigh.default.base_reachable= _time; Use net.ipv6.neigh.default.base_reachable_time_ms instead.