Re: [Yaffs] yaffs problem: !!!!!!!!! Allocator out !!!!!!!!!…

Top Page
Attachments:
Message as email
+ (text/plain)
Delete this message
Reply to this message
Author: Charles Manning
Date:  
To: goog long
CC: Paul Wang, yaffs
Subject: Re: [Yaffs] yaffs problem: !!!!!!!!! Allocator out !!!!!!!!!!!!!!!!!
On Friday 24 November 2006 12:13, goog long wrote:
> Thanks for your info, but I have no problem at all with JFFS2 using the
> same NAND driver. I run the full test on JFFS2 without any error.
>
> Ceco


JFFS2 does not use OOB, so any OOB corruptions don't break JFFS2.

>
> Charles Manning <> wrote: This, and all your
> previous recent problems, look like issues in the nand driver.
>
> Allocator out can only happen when a lot of blocks all seem to go bad, or
> there are a lot of nand errors. This is extremely unlikely with real
> flash, but is quite possible if the software is being told that the blocks
> are bad.
>
> My suggestion is to add more tracing to the lower levels (including the
> nand drivers) to figure out what is getting messed up.
>
> -- CHarles
>
> On Friday 24 November 2006 06:11, goog long wrote:
> > I have the same problem. I enable YAFFS_TRACE_ALLOCATE, YAFFS_TRACE_GC
> > and YAFFS_TRACE_GC_DETAIL this time. I also capture /proc/yaffs before
> > and after copying file. There are already some bad blocks marked by the
> > last run. It is noticed that there is a soft lockup in the middle. The
> > log is below.
> >
> >
> > # cat /proc/yaffs
> > YAFFS built:Nov 23 2006 11:50:15
> > $Id: yaffs_fs.c,v 1.54 2006/10/24 18:09:15 charles Exp $
> > $Id: yaffs_guts.c,v 1.45 2006/11/14 03:07:17 charles Exp $
> > # flash_eraseall /dev/mtd5
> >
> > Skipping bad block at 0x00000000
> > Erasing 128 Kibyte @ 20000 -- 0 % complete.
> > Skipping bad block at 0x00040000
> >
> > Skipping bad block at 0x00060000
> >
> > ............
> > Skipping bad block at 0x00340000
> >
> > Skipping bad block at 0x00360000
> > Erasing 128 Kibyte @ 7e80000 -- 99 % complete.
> > # mount -t yaffs2 /dev/mtdblock5 /yaffs2
> > [42949509.130000] yaffs: dev is 32505861 name is "mtdblock5"
> > [42949509.130000] yaffs: Attempting MTD mount on 31.5, "mtdblock5"
> > [42949509.180000] block 1 is bad
> > [42949509.180000] block 3 is bad
> >
> > ...........[42949509.260000] block 27 is bad
> > [42949509.270000] block 28 is bad
> > # cat /proc/yaffsYAFFS built:Nov 23 2006 11:50:15
> > $Id: yaffs_fs.c,v 1.54 2006/10/24 18:09:15 charles Exp $
> > $Id: yaffs_guts.c,v 1.45 2006/11/14 03:07:17 charles Exp $
> >
> > Device 0 "File system"
> > startBlock......... 0
> > endBlock........... 1012
> > chunkGroupBits..... 0
> > chunkGroupSize..... 1
> > nErasedBlocks...... 986
> > nTnodesCreated..... 0
> > nFreeTnodes........ 0
> > nObjectsCreated.... 200
> > nFreeObjects....... 96
> > nFreeChunks........ 63104
> > nPageWrites........ 0
> > nPageReads......... 0
> > nBlockErasures..... 0
> > nGCCopies.......... 0
> > garbageCollections. 0
> > passiveGCs......... 0
> > nRetriedWrites..... 0
> > nRetireBlocks...... 0
> > eccFixed........... 0
> > eccUnfixed......... 0
> > tagsEccFixed....... 0
> > tagsEccUnfixed..... 0
> > cacheHits.......... 0
> > nDeletedFiles...... 0
> > nUnlinkedFiles..... 0
> > nBackgroudDeletions 0
> > useNANDECC......... 1
> > isYaffs2........... 1# dd if=test_file of=/yaffs2/test_file
> > [42949586.060000] yaffs: Tnodes added
> > [42949586.070000] Allocated block 2, seq 4097, 985 left
> > [42949586.080000] **>> Block 2 needs retiring
> > [42949586.080000] yaffs_BlockBecameDirty block 2 state 5 needs retiring
> > [42949586.090000] **>> Block 2 retired
> > [42949586.090000] Allocated block 29, seq 4098, 984 left
> > [42949586.100000] **>> Block 29 needs retiring
> > [42949586.100000] yaffs_BlockBecameDirty block 29 state 5 needs retiring
> > [42949586.110000] **>> Block 29 retired
> > [42949586.110000] Allocated block 30, seq 4099, 983 left
> > [42949586.120000] **>> Block 30 needs retiring
> > [42949586.130000] yaffs_BlockBecameDirty block 30 state 5 needs retiring
> > [42949586.130000] **>> Block 30 retired
> > [42949586.140000] Allocated block 31, seq 4100, 982 left
> >
> > ...............
> > [42949595.250000] **>> Block 425 needs retiring
> > [42949595.250000] yaffs_BlockBecameDirty block 425 state 5 needs retiring
> > [42949595.260000] **>> Block 425 retired
> > [42949595.260000] Allocated block 426, seq  4495, 587 left
> > [42949595.270000] **>> Block 426 needs retiring
> > [42949595.270000] yaffs_BlockBecameDirty block 426 state 5 needs retiring
> > [42949595.280000] **>> Block 426 retired
> > [42949595.290000] Allocated block 427, seq  4496, 586 left
> > [42949595.290000] **>> Block 427 needs retiring
> > [42949595.300000] BUG: soft lockup detected on CPU#0!
> > [42949595.300000]
> > [42949595.300000] Pid: 227, comm:                   dd
> > [42949595.300000] CPU: 0
> > [42949595.300000] PC is at release_console_sem+0xb0/0x224
> > [42949595.300000] LR is at release_console_sem+0xac/0x224
> > [42949595.300000] pc : []    lr : []    Not tainted
> > [42949595.300000] sp : c3817b30  ip : 0001a8bf  fp : c3817b5c
> > [42949595.300000] r10: c02cd49c  r9 : c02cd498  r8 : fffe5741
> > [42949595.300000] r7 : c026a664  r6 : 60000013  r5 : 0001a8bf  r4 :
> > 0001a8bf [42949595.300000] r3 : c02cd084  r2 : c0278870  r1 : 0001a8bf 
> > r0

> >
> > : 0001a8bf [42949595.300000] Flags: nZCv IRQs on FIQs on Mode SVC_32
> >
> > Segment user [42949595.300000] Control: C5387F Table: 83848000 DAC:
> > 00000015
> > [42949595.300000] [] (show_regs+0x0/0x50) from []
> > (softlock)[42949595.300000] r5 = C02EE824 [42949595.300000] []
> > (softlockup_tick+0x0/0x84) from [] (do)[42949595.300000] r4 =
> > 00000000 [42949595.300000] [] (do_timer+0x0/0x514) from
> > [] (timer_ti)[42949595.300000] [] (timer_tick+0x0/0xf8)
> > from [] (omap2_g)[42949595.300000] r6 = 00000026 r5 = C3817AE8
> > r4 = C02ED7D0 [42949595.300000] []
> > (omap2_gp_timer_interrupt+0x0/0x7c) from [> 00000000 r4 = C0269168
> > [42949595.300000] [] (__do_irq+0x0/0xfc) from []
> > (do_level_)[42949595.300000] r8 = C3817AE8 r7 =
> > C0265C88 r6 = C3817AE8 r5 = 00000026 [42949595.300000] r4 = C02C7A7C
> > [42949595.300000] [] (do_level_IRQ+0x0/0xc4) from []
> > (asm_d)[42949595.300000] r6 = 60000013 r5 = D80FE000 r4 = C3816000
> > [42949595.300000] [] (asm_do_IRQ+0x0/0x154) from []
> > (__irq_)[42949595.300000] [] (release_console_sem+0x0/0x224) from
> > [)[42949595.300000] [] (vprintk+0x0/0x330) from
> > [] (printk+0x)[42949595.300000] [] (printk+0x0/0x24)
> > from [] (yaffs_Write)[42949595.300000] r3 = 40001055 r2 =
> > 0000000F r1 = 000001AB r0 = C0238270 [42949595.300000] []
> > (yaffs_WriteNewChunkWithTagsToNAND+0x0/0x560) fr)[42949595.300000]
> > [] (yaffs_UpdateObjectHeader+0x0/0x3a8) from
> > [] (yaffs_MknodObject+0x0/0x16c) from
> > [] )[42949595.300000] [] (yaffs_MknodFile+0x0/0x50)
> > from [] (ya)[42949595.300000] r4 = C38440F8 [42949595.300000]
> > [] (yaffs_mknod+0x0/0x2b4) from []
> > (yaffs)[42949595.300000] [] (yaffs_create+0x0/0x6c) from
> > [] (vfs_c)[42949595.300000] r6 = C3D0E6D0 r5 = 000001A4 r4 =
> > 00000000 [42949595.300000] [] (vfs_create+0x0/0xbc) from
> > [] (open_na)[42949595.300000] r8 = C3820EE8 r7 = 00000242 r6 =
> > C3820BB8 r5 = C3817F00 [42949595.300000] r4 = C3820BB8
> > [42949595.300000] [] (open_namei+0x0/0x570) from []
> > (filp_o)[42949595.300000] [] (filp_open+0x0/0xa0) from
> > [] (do_sys_o)[42949595.300000] r8 = C00252A8 r7 = C3FDD000 r6
> > = 000001B6 r5 = 00000004 [42949595.300000] r4 = 00000241
> > [42949595.300000] [] (do_sys_open+0x0/0xf0) from []
> > (sys_op)[42949595.300000] [] (sys_open+0x0/0x14) from
> > [] (ret_fast_)[42949595.310000] yaffs_BlockBecameDirty block 427
> > state 5 needs retiring [42949595.320000] **>> Block 427 retired
> > [42949595.320000] Allocated block 428, seq 4497, 585 left
> > [42949595.330000] **>> Block 428 needs retiring
> > [42949595.330000] yaffs_BlockBecameDirty block 428 state 5 needs retiring
> > [42949595.340000] **>> Block 428 retired
> >
> > ............
> >
> > [42949608.540000] **>> Block 998 retired
> > [42949608.540000] Allocated block 999, seq 5068, 14 left
> > [42949608.550000] **>> yaffs write required 971 attempts
> > dd: /yaffs2/test_file: Cannot allocate memory
> > # cat /proc/yaffs
> > YAFFS built:Nov 23 2006 11:50:15
> > $Id: yaffs_fs.c,v 1.54 2006/10/24 18:09:15 charles Exp $
> > $Id: yaffs_guts.c,v 1.45 2006/11/14 03:07:17 charles Exp $
> >
> > Device 0 "File system"
> > startBlock......... 0
> > endBlock........... 1012
> > chunkGroupBits..... 0
> > chunkGroupSize..... 1
> > nErasedBlocks...... 14
> > nTnodesCreated..... 100
> > nFreeTnodes........ 100
> > nObjectsCreated.... 200
> > nFreeObjects....... 96
> > nFreeChunks........ 960
> > nPageWrites........ 0
> > nPageReads......... 0
> > nBlockErasures..... 0
> > nGCCopies.......... 0
> > garbageCollections. 0
> > passiveGCs......... 0
> > nRetriedWrites..... 970
> > nRetireBlocks...... 971
> > eccFixed........... 0
> > eccUnfixed......... 0
> > tagsEccFixed....... 0
> > tagsEccUnfixed..... 0
> > cacheHits.......... 0
> > nDeletedFiles...... 0
> > nUnlinkedFiles..... 1
> > nBackgroudDeletions 0
> > useNANDECC......... 1
> > isYaffs2........... 1
> > # umount /yaffs2
> >
> > Charles Manning wrote: On Tuesday 24 October 2006
>
> 16:27, Paul Wang wrote:
> > > Hi,
> > >
> > > Thanks for your valuable answer.
> > > Yes, I forget to erase the mtdblock first.
> > >
> > > After I used "mkyaffs" to erase the block, It shows from /proc/yaffs
> > > that nEraseblocks is 815. I can write some files without the errors.
> > >
> > > Then I got another problem, after I write some files(the total
> > > blocksize is 13M and I write around 5M data), the nEraseblock went down
> > > to 0 and I got the same error message again. Even I delete some files
> > > and the nEraseblock is always 0.
> > > That means the flash is not fully released.
> > >
> > > How to do the garbage collection?
> > > How can my application know when to do the garbage collection?
> >
> > The garbage collection is done automatically by yaffgs as a by-product of
> > any operation that modifies the file system.
> >
> > It seems to me that one of two things has happened here:
> > 1) Garbage collection triggering is broken somehow, so yaffs does not
> > triger garbage collection.
> > 2) The garbage collection is failing because the erasure is failing or
> > some simil;ar problem. Thsi means that attempts to do garbage collection
> > do not free up any space.
> >
> > Try turning on tracing for YAFFS_TRACE_ALLOCATE, YAFFS_TRACE_GC and
> > YAFFS_TRACE_GC_DETAIL. These should give a far better indication of what
> > is happening.
> >
> > > Regards
> > > Paul
> > > ----- Original Message -----
> > > From: "Charles Manning"
> > > To:
> > > Cc: "Paul Wang" ; ;
> >
> > ; ; Sent: Tuesday,
> >
> > > October 24, 2006 8:23 AM
> > > Subject: Re: [Yaffs] yaffs problem: !!!!!!!!! Allocator out
> > > !!!!!!!!!!!!!!!!!
> > >
> > > On Sunday 22 October 2006 03:56, Paul Wang wrote:
> > > > Hello,
> > > >
> > > > Sorry to disturb, I saw you discussed this problem last month.
> > > > Is there any solution?
> > > >
> > > > I meet this problem and have no idea what to do.
> > > > Currently I'm using Linux 2.6.12.
> > > > And it's a 32M nand flash with 3 mtdbolcks.
> > > > first 3M bytes              reserved
> > > > following 16M bytes         file system(cramfs)
> > > > last 13M bytes              yaffs

> > > >
> > > > I can see it reports few bad blocks for the yaffs.
> > > > I always get this error message
> > > > -----------------
> > > > yaffs tragedy: no more eraased blocks
> > > > !!!!!!!!! Allocator out !!!!!!!!!!!!!!!!!
> > >
> > > This happens because you have no erased blocks to use for further
> > > allocation.
> > >
> > > > ---------------------
> > > > And what I did is just using VI to edit a file(no more than 30
> > > > bytes).
> > > >
> > > > I have attached the /proc/yaffs file and the message during linux
> > > > start up.
> > >
> > > From the /proc/yaffs
> > >
> > > nErasedBlocks...... 0
> > >
> > > What you don't say is when you captured the /proc/yaffs and how you got
> > > the system into this state.
> > >
> > > There should never be fewer than about 5 erased blocks.
> > >
> > > Can you do the following:
> > >
> > > 1) Erase partition
> > > 2) Mount
> > > 3) capture /proc/yaffs and output from ls -ial
> > > 4) Do whatever it is you do to get into this state. With some
> > > explanation. 5) capture /proc/yaffs.
> > >
> > >
> > > Thanx
> > >
> > > -- Charles
> >
> > _______________________________________________
> > yaffs mailing list
> >
> > http://lists.aleph1.co.uk/cgi-bin/mailman/listinfo/yaffs
> >
> >
> >
> >
> > ---------------------------------
> > Access over 1 million songs - Yahoo! Music Unlimited.
>
> ---------------------------------
> Access over 1 million songs - Yahoo! Music Unlimited.