[PATCH] jffs2: fix soft lockup when read flash error

chenjie6 at huawei.com chenjie6 at huawei.com
Wed Nov 12 03:01:48 PST 2014


From: chenjie <chenjie6 at huawei.com>

we find soft lockup when read flash error
------------------CPU#1-----------------------------------
BUG: soft lockup - CPU#1 stuck for 60009ms! [link.test:17707]
INFO: rcu_sched detected stalls on CPUs/tasks: { 1} (detected by 0, t=247997 jiffies, g=127234, c=127233, q=373616)
Task dump for CPU 1:
link.test       R running      0 17707  17611 0x00000003
locked:
e844ea78   &inode->i_mutex  1  [<c010a518>] do_unlinkat+0x74/0x170
e873f9f8   &inode->i_mutex  1  [<c010a3e8>] vfs_unlink+0x38/0xf4
e8bc4444   &c->alloc_sem    1  [<bf051120>] jffs2_reserve_space+0x2c/0x3b4 [jffs2]
e8bc4568   &c->erase_free_sem 1  [<bf058d6c>] jffs2_erase_pending_blocks+0x20/0x860 [jffs2]
c0479d30   console_sem      1  [<c00245cc>] console_trylock+0xc/0x50
[<c02dee00>] (__schedule+0x478/0x644) from [<00000000>] (  (null))
Modules linked in: rtos_kbox_panic(O) flash(O) eth(O) mdio(O) gpio(O) watchdog(O) nfsv4 nfsv3 nfs lockd nfs_acl sunrpc xt_tcpudp ipt_REJECT iptable_filter ip_tables x_tables jffs2 cfi_cmdset_0002 cfi_probe cfi_util gen_probe cmdlinepart chipreg mtdblock mtd_blkdevs mtd uio [last unloaded: kernel_mem_manage]

CPU: 1 PID: 17707 Comm: link.test Tainted: G           O 3.10.53 #1
task: e80b6e80 ti: c8e9e000 task.ti: c8e9e000
PC is at jffs2_erase_pending_blocks+0x808/0x860 [jffs2]
LR is at jffs2_erase_pending_blocks+0x2c/0x860 [jffs2]
pc : [<bf059554>]    lr : [<bf058d78>]    psr: 60000113
sp : c8e9fdc8  ip : e80b6eb0  fp : e8bc44f8
r10: 00000000  r9 : c8e9fecc  r8 : 00000034
r7 : e8bc4520  r6 : e8bc4568  r5 : e8bc44f8  r4 : e8bc4400
r3 : 00000120  r2 : 00006a20  r1 : 00000000  r0 : e8bc4520
Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
Control: 18c53c7d  Table: 9b79004a  DAC: 00000015
CPU: 1 PID: 17707 Comm: link.test Tainted: G           O 3.10.53 #1
[<c0017198>] (unwind_backtrace+0x0/0x120) from [<c0012a14>] (show_stack+0x10/0x14)
[<c0012a14>] (show_stack+0x10/0x14) from [<c008bbd4>] (watchdog_timer_fn+0x16c/0x208)
[<c008bbd4>] (watchdog_timer_fn+0x16c/0x208) from [<c0047bf4>] (__run_hrtimer+0xd4/0x1c4)
[<c0047bf4>] (__run_hrtimer+0xd4/0x1c4) from [<c00484dc>] (hrtimer_interrupt+0x128/0x2b0)
[<c00484dc>] (hrtimer_interrupt+0x128/0x2b0) from [<c0016584>] (twd_handler+0x38/0x44)
[<c0016584>] (twd_handler+0x38/0x44) from [<c008f5fc>] (handle_percpu_devid_irq+0x9c/0x124)
[<c008f5fc>] (handle_percpu_devid_irq+0x9c/0x124) from [<c008bec8>] (generic_handle_irq+0x20/0x30)
[<c008bec8>] (generic_handle_irq+0x20/0x30) from [<c000fa44>] (handle_IRQ+0xa0/0xf4)
[<c000fa44>] (handle_IRQ+0xa0/0xf4) from [<c000855c>] (gic_handle_irq+0x3c/0x60)
[<c000855c>] (gic_handle_irq+0x3c/0x60) from [<c02e0424>] (__irq_svc+0x44/0x58)
Exception stack(0xc8e9fd80 to 0xc8e9fdc8)
fd80: e8bc4520 00000000 00006a20 00000120 e8bc4400 e8bc44f8 e8bc4568 e8bc4520
fda0: 00000034 c8e9fecc 00000000 e8bc44f8 e80b6eb0 c8e9fdc8 bf058d78 bf059554
fdc0: 60000113 ffffffff
[<c02e0424>] (__irq_svc+0x44/0x58) from [<bf059554>] (jffs2_erase_pending_blocks+0x808/0x860 [jffs2])
[<bf059554>] (jffs2_erase_pending_blocks+0x808/0x860 [jffs2]) from [<bf050f04>] (jffs2_do_reserve_space+0x31c/0x47c [jffs2])
[<bf050f04>] (jffs2_do_reserve_space+0x31c/0x47c [jffs2]) from [<bf051424>] (jffs2_reserve_space+0x330/0x3b4 [jffs2])
[<bf051424>] (jffs2_reserve_space+0x330/0x3b4 [jffs2]) from [<bf054460>] (jffs2_do_unlink+0x48/0x228 [jffs2])
[<bf054460>] (jffs2_do_unlink+0x48/0x228 [jffs2]) from [<bf04e26c>] (jffs2_unlink+0x3c/0x80 [jffs2])
[<bf04e26c>] (jffs2_unlink+0x3c/0x80 [jffs2]) from [<c010a40c>] (vfs_unlink+0x5c/0xf4)
[<c010a40c>] (vfs_unlink+0x5c/0xf4) from [<c010a568>] (do_unlinkat+0xc4/0x170)
[<c010a568>] (do_unlinkat+0xc4/0x170) from [<c000f0c0>] (ret_fast_syscall+0x0/0x58)

jffs2_find_nextblock
        --->jffs2_erase_pending_blocks
        --->jffs2_mark_erased_block
                but jffs2_block_check_erase failed or jffs2_write_nand_cleanmarker failed
The jffs2_find_nextblock return -EAGAIN ,so soft lockup had occurred

Cc: <stable at vger.kernel.org> 
Signed-off-by: chenjie <chenjie6 at huawei.com>

---
 fs/jffs2/nodemgmt.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/fs/jffs2/nodemgmt.c b/fs/jffs2/nodemgmt.c
index b6bd4af..f689bb1 100644
--- a/fs/jffs2/nodemgmt.c
+++ b/fs/jffs2/nodemgmt.c
@@ -322,6 +322,7 @@ static int jffs2_find_nextblock(struct jffs2_sb_info *c)
 
 		spin_unlock(&c->erase_completion_lock);
 		/* Don't wait for it; just erase one right now */
+		cond_resched();
 		jffs2_erase_pending_blocks(c, 1);
 		spin_lock(&c->erase_completion_lock);
 
-- 
1.8.0




More information about the linux-mtd mailing list