public inbox for ecos-discuss@sourceware.org
 help / color / mirror / Atom feed
* [ECOS] Re: FTP runs out of JFFS2 nodes and trashes the file system
       [not found] <47FA32AC.4070705@televic.com>
@ 2008-04-07 23:22 ` Jürgen Lambrecht
  2008-04-08  6:48   ` Andrew Lunn
  0 siblings, 1 reply; 6+ messages in thread
From: Jürgen Lambrecht @ 2008-04-07 23:22 UTC (permalink / raw)
  To: ecos-discuss

Hello,

I have the problem that I cannot FTP more than 200 files at once to my 
board. It always fails with this message:

  arena=301672, uordblks=30728, fordblks=270924, maxfree=261196.
  arena=301672, uordblks=41160, fordblks=260492, maxfree=260188.
  arena=301672, uordblks=44808, fordblks=256844, maxfree=252148.
  arena=301672, uordblks=46000, fordblks=255652, maxfree=252148.
  arena=301672, uordblks=49176, fordblks=252476, maxfree=240948.
  Unable to allocate raw_node_ref
    count=16000
  Unable to allocate raw_node_ref
    count=16000
  Unable to allocate raw_node_ref
    count=16000
  arena=301672, uordblks=47552, fordblks=254100, maxfree=245340.

- My raw node data structures (jffs2_raw_node_ref) are of course 
statically allocated - CYGNUM_FS_JFFS2_RAW_NODE_REF_CACHE_POOL_SIZE is 
set to 16000. (This needs 250kB; the user can use 55MB, so with 4kB 
nodes, I have 1920 free nodes for smaller nodes at the end of a file.)
  Compression is disabled (as I mainly store mp3 files). I put the 
CYGNUM_IO_FILEIO_MAX_INODE_CACHE_DEAD = 0.

- In jffs2/../malloc-ecos.c I added a counter as you can see in the log 
above.
  In this test, after FTP'ing 189 files with in total 3706kB, the file 
system crashes, but in a "valid" way: indeed, as the counter proofs, the 
raw node pool is empty, *but how is this possible?*
Therefore my question about FTP in 
http://ecos.sourceware.org/ml/ecos-discuss/2008-04/msg00110.html.
  I have to unmount/mount or reboot to be able to delete files again. If 
I then don't delete but add files instead, it fails with the same error 
after a few files. When I repeat this cycle of reboot-add files a few 
times (depending on previous state of the file system) *jffs2 
"crashes"*: I cannot anymore delete or add any file - listing 
directories still works, also the application still runs.
I have to format the flash to solve the problem.

- When I do the same test with TFTP, I can put over 1000 files in 1 
directory (and then TFTP times out because jffs2 becomes too slow with 
so many files in the directory).
Mark: the test is reproducible, independent of the SW and HW.

- I use now the flash-v2 driver to avoid problems with the main cvs tree 
non-interrupt save driver.
  But I read this in the documentation: "However the library may not be 
interrupt safe. An interrupt must not cause execution of code that is 
resident in FLASH." If I understand it well, *this means the library is 
thread safe on the condition that all code is always executed in RAM?*
This is ok in my case.

- Our ftp server code is based on the Minimal FTP server from Matthias 
Wandel. After a TCP connect, we just have a loop that calls: 
recv(socket,buf,...); fwrite(buf,...);.
I use FTP client in Total Commander.

- My board has a 32MHz AT91M55800A ARM7TDMI processor, with external 1MB 
SRAM and 64MB flash of which 61MB is in a jffs2 partition. Please don't 
remind me that my amount of SRAM is not enough ;-). But as you can see 
in the log, I still have enough heap.

- Maybe this is a *timing issue*, as jffs2 needs more time the more full 
the file system gets?

Kind regards,
Juergen


-- 
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [ECOS] Re: FTP runs out of JFFS2 nodes and trashes the file  system
  2008-04-07 23:22 ` [ECOS] Re: FTP runs out of JFFS2 nodes and trashes the file system Jürgen Lambrecht
@ 2008-04-08  6:48   ` Andrew Lunn
  2008-04-08  8:41     ` Jürgen Lambrecht
  0 siblings, 1 reply; 6+ messages in thread
From: Andrew Lunn @ 2008-04-08  6:48 UTC (permalink / raw)
  To: j.lambrecht; +Cc: ecos-discuss

>  In this test, after FTP'ing 189 files with in total 3706kB, the file  
> system crashes, but in a "valid" way: indeed, as the counter proofs, the  
> raw node pool is empty, *but how is this possible?*

Jffs2 keeps an in memory copy of the FS meta information. Each write
to the FS results in the creating of a node. Smaller writes results in
more nodes/meta information and so greater RAM usage for the meta
information. Hence you can get into the state of being out of RAM for
meta information but still have space on the filesystem. So i would
suggest writing bigger blocks, use fwrite, not write and use setbuf to
set the buffering to 4K or similar. 

> Therefore my question about FTP in  
> http://ecos.sourceware.org/ml/ecos-discuss/2008-04/msg00110.html.
>  I have to unmount/mount or reboot to be able to delete files again. If  
> I then don't delete but add files instead, it fails with the same error  
> after a few files. When I repeat this cycle of reboot-add files a few  
> times (depending on previous state of the file system) *jffs2  
> "crashes"*: I cannot anymore delete or add any file - listing  
> directories still works, also the application still runs.
> I have to format the flash to solve the problem.

There are a couple of possibilities here. 

umount/mount causes it to rebuild its in RAM meta information which
allows it to remove old nodes which are no longer needed.

It has chance to do a garbage collect of the filesystem so freeing up
some meta information and blocks on the FS.

Note that JFFS2 has unusual behaviour when full. It needs 4 to 5 free
erase blocks in order to do garbage collection. So things like df will
say there is free space, but the filesystem may refuse to write
because garbage collection does not have enough blocks to be able to
run.

>  But I read this in the documentation: "However the library may not be  
> interrupt safe. An interrupt must not cause execution of code that is  
> resident in FLASH." If I understand it well, *this means the library is  
> thread safe on the condition that all code is always executed in RAM?*
> This is ok in my case.

Just watch out for redboot and the virtual vectors. If you are using a
ROM redboot, diag_printf can jump into the ROM redboot. Similar an
exception, or using the debugger could cause the gdb stub in the ROM
redboot to get called. 

        Andrew

-- 
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [ECOS] Re: FTP runs out of JFFS2 nodes and trashes the file   system
  2008-04-08  6:48   ` Andrew Lunn
@ 2008-04-08  8:41     ` Jürgen Lambrecht
  2008-04-08 10:32       ` Andrew Lunn
  0 siblings, 1 reply; 6+ messages in thread
From: Jürgen Lambrecht @ 2008-04-08  8:41 UTC (permalink / raw)
  To: Andrew Lunn, Gary Thomas; +Cc: ecos-discuss

Andrew Lunn wrote:

>> In this test, after FTP'ing 189 files with in total 3706kB, the file  
>>system crashes, but in a "valid" way: indeed, as the counter proofs, the  
>>raw node pool is empty, *but how is this possible?*
>>    
>>
>
>Jffs2 keeps an in memory copy of the FS meta information. Each write
>to the FS results in the creating of a node. Smaller writes results in
>more nodes/meta information and so greater RAM usage for the meta
>information. Hence you can get into the state of being out of RAM for
>meta information but still have space on the filesystem. So i would
>suggest writing bigger blocks, use fwrite, not write and use setbuf to
>set the buffering to 4K or similar. 
>  
>
I already use fwrite, but I'll try 'setbuf'.
But Gary says 
(http://ecos.sourceware.org/ml/ecos-discuss/2008-04/msg00102.html) that 
jffs2 automatically buffers data to fill a node, and I read yesterday 
something about that on infradead.org ???
But I must say: we adapted the eCos TFTP server to buffer 8 512B packets 
to have 4kB per write and with TFTP there is no problem with running out 
of raw nodes.

But there is something more wrong: I have 61MB in flash and 16000 
(statically allocated) raw nodes available.
3706kB/16000 = 237.184 Bytes per node. (ok, a bit more, because I have 
have directories /ERR, /AUDIO/PRM, /AUDIO/JINGLE; and /ERR always 
contains a log file of a few kB).
Is this really possible: only approx. 300B per node? I specially 
replaced my flash chip with a new one on my test board, created the 
directories in the jffs2 partition and then started FTP.
With Ethereal I see that a transfer always has the same behavior, the 
data is transferred with packets of this size in Bytes: 512, 1448, 88, 
and then max. sized 1448 B packets until the complete file is 
transferred. There is 1 strange thing: all data packets have this 
comment in Ethereal: "TCP segment of a reassembled PDU". I don't 
understand why because there is no IP fragmentation (don't fragment bit 
is on, and there are no fragments).
Of course, with TCP, there is no concept of packets anymore: I just do 
recv(socket,buf..);fwrite(buf..);

I will now add debugging to my code to see the actual size of fwrite().
I will also check the mounting - set jffs2 debug to 2 - to see the 
scanning of all nodes.

>>Therefore my question about FTP in  
>>http://ecos.sourceware.org/ml/ecos-discuss/2008-04/msg00110.html.
>> I have to unmount/mount or reboot to be able to delete files again. If  
>>I then don't delete but add files instead, it fails with the same error  
>>after a few files. When I repeat this cycle of reboot-add files a few  
>>times (depending on previous state of the file system) *jffs2  
>>"crashes"*: I cannot anymore delete or add any file - listing  
>>directories still works, also the application still runs.
>>I have to format the flash to solve the problem.
>>    
>>
>
>There are a couple of possibilities here. 
>
>umount/mount causes it to rebuild its in RAM meta information which
>allows it to remove old nodes which are no longer needed.
>
>It has chance to do a garbage collect of the filesystem so freeing up
>some meta information and blocks on the FS.
>  
>
indeed that's the case

>Note that JFFS2 has unusual behaviour when full. It needs 4 to 5 free
>erase blocks in order to do garbage collection. So things like df will
>say there is free space, but the filesystem may refuse to write
>because garbage collection does not have enough blocks to be able to
>run.
>
>  
>
that should not be the case at all: I still have 57 MB free! But I'll 
check it.

>> But I read this in the documentation: "However the library may not be  
>>interrupt safe. An interrupt must not cause execution of code that is  
>>resident in FLASH." If I understand it well, *this means the library is  
>>thread safe on the condition that all code is always executed in RAM?*
>>This is ok in my case.
>>    
>>
>
>Just watch out for redboot and the virtual vectors. If you are using a
>ROM redboot, diag_printf can jump into the ROM redboot. Similar an
>exception, or using the debugger could cause the gdb stub in the ROM
>redboot to get called. 
>
>        Andrew
>
>  
>
As far as I know that is OK: my ROM redboot jumps to the application 
ROMRAM binary, and ROMRAM ecos sets 
CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE to 1 (I checked). So the 
diag_printft in the VVT is overwritten by the RAM version I guess?
And I don't use gdb stubs, they are even disabled to save code size.

Kind regards,
Jürgen

-- 
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [ECOS] Re: FTP runs out of JFFS2 nodes and trashes the file  system
  2008-04-08  8:41     ` Jürgen Lambrecht
@ 2008-04-08 10:32       ` Andrew Lunn
  2008-04-08 15:58         ` Jürgen Lambrecht
  2008-04-09 11:42         ` Jürgen Lambrecht
  0 siblings, 2 replies; 6+ messages in thread
From: Andrew Lunn @ 2008-04-08 10:32 UTC (permalink / raw)
  To: J?rgen Lambrecht; +Cc: Andrew Lunn, Gary Thomas, ecos-discuss

> But Gary says  
> (http://ecos.sourceware.org/ml/ecos-discuss/2008-04/msg00102.html) that  
> jffs2 automatically buffers data to fill a node, and I read yesterday  
> something about that on infradead.org ???

I don't think that is correct for eCos. On Linux the VFS maybe
blocking together writes, but for eCos there is no VFS. Writes go
directly to the filesystem. Enabling debugging may prove this.

         Andrew

-- 
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [ECOS] Re: FTP runs out of JFFS2 nodes and trashes the file system
  2008-04-08 10:32       ` Andrew Lunn
@ 2008-04-08 15:58         ` Jürgen Lambrecht
  2008-04-09 11:42         ` Jürgen Lambrecht
  1 sibling, 0 replies; 6+ messages in thread
From: Jürgen Lambrecht @ 2008-04-08 15:58 UTC (permalink / raw)
  To: Andrew Lunn; +Cc: Gary Thomas, ecos-discuss

Andrew Lunn wrote:

>>But Gary says  
>>(http://ecos.sourceware.org/ml/ecos-discuss/2008-04/msg00102.html) that  
>>jffs2 automatically buffers data to fill a node, and I read yesterday  
>>something about that on infradead.org ???
>>    
>>
>
>I don't think that is correct for eCos. On Linux the VFS maybe
>blocking together writes, but for eCos there is no VFS. Writes go
>directly to the filesystem. Enabling debugging may prove this.
>
>         Andrew
>
>  
>
Here are my debug results:

- When looking to the jffs2 debug output, I see there are nodes with a 
huge number of versions: 326, 628... . Each time of size 0x100 or 256B.
- I have problems with printf... tomorrow hopefully more...

Kind regards,
Jürgen

-- 
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [ECOS] Re: FTP runs out of JFFS2 nodes and trashes the file system
  2008-04-08 10:32       ` Andrew Lunn
  2008-04-08 15:58         ` Jürgen Lambrecht
@ 2008-04-09 11:42         ` Jürgen Lambrecht
  1 sibling, 0 replies; 6+ messages in thread
From: Jürgen Lambrecht @ 2008-04-09 11:42 UTC (permalink / raw)
  To: Andrew Lunn, Gary Thomas, ecos-discuss

Cause of error found! See below.

Andrew Lunn wrote:

>>But Gary says  
>>(http://ecos.sourceware.org/ml/ecos-discuss/2008-04/msg00102.html) that  
>>jffs2 automatically buffers data to fill a node, and I read yesterday  
>>something about that on infradead.org ???
>>    
>>
>
>I don't think that is correct for eCos. On Linux the VFS maybe
>blocking together writes, but for eCos there is no VFS. Writes go
>directly to the filesystem. Enabling debugging may prove this.
>
>         Andrew
>
>  
>
Here are my debug results:

- *jffs2 mount* debug output:
   I see there are nodes with a huge number of versions: 326, 628... . 
Each time of size 0x100 or 256B. The smallest versions are 100!
- *FTP* debug output:
   I see the buffer size is 2kB, and fwrite() is called per 2kB (untill 
the file is finished)
   Solution: I need to set the buffer size to 4kB to fit the jffs2 node 
size. I  guess this is a TCP/IP stack buffer size I have to set with ioctl()?
- *libc fwrite*:
   I see the data is written per 256B!! OK: the default value of 
CYGNUM_LIBC_STDIO_BUFSIZE is 256.
   Solution: set buffer size with setbuf() to 4kB
- *jffs2_fo_write*
   Gets a request to allocate 256B, request a minimum of 196B, and gets 
much more.
   Writes a dnode of 256B.
   So indeed, jffs2 does not buffer to have the optimal node size.
   So this way, my 16000 raw nodes (costing 250kB RAM) can only store 4MB 
instead of 62.5MB!! This explains my problem with FTP.

Conclusion:
To use a flash with jffs2 efficiently
- users should be aware they must call write with the jffs2 buffer size
- users should be aware they must set the stream libc buffer size to the 
jffs2 buffer size before using fwrite!
   -> even better: the default value of CYGNUM_LIBC_STDIO_BUFSIZE should 
be set to the jffs2 buffer size if jffs2 is used. OK, if you use 2 
different file systems this is not valid anymore...

Anyhow, ecos misses a good jffs2 usage manual.
If I want to write one, how should I do that? I don't know sgml.. OK, my 
xemacs knows it ;-).

Thanks for your help!,
Jürgen


-- 
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2008-04-09  9:46 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <47FA32AC.4070705@televic.com>
2008-04-07 23:22 ` [ECOS] Re: FTP runs out of JFFS2 nodes and trashes the file system Jürgen Lambrecht
2008-04-08  6:48   ` Andrew Lunn
2008-04-08  8:41     ` Jürgen Lambrecht
2008-04-08 10:32       ` Andrew Lunn
2008-04-08 15:58         ` Jürgen Lambrecht
2008-04-09 11:42         ` Jürgen Lambrecht

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).