ENOMEM failure on mmap call

Ezequiel García elezegarcia at yahoo.com.ar
Mon Oct 10 19:07:59 EDT 2011


Hi,

I have a SH4 board:

$ uname -a
Linux LINUX7109 2.6.23.17_stm23_A18B-HMP_7109-STSDK #1 PREEMPT Fri Aug 6 16:08:19 ART 2010
sh4 unknown
and suppose I have eaten pretty much all the memory, and have only 9 MB left (aprox.)

$ free
 total       used       free     shared    buffers     cached
Mem:         48072      42276       5796          0        172       3264
-/+ buffers/cache:      38840       9232
Swap:            0          0          0

Now, when I try to launch a single thread with default stack size (8 MB) the pthread_create() call fails with ENOMEM. If I strace my test code, I can see that the function that is failing is mmap:

old_mmap(NULL, 8388608, PROT_READ|PROT_WRITE|PROT_EXEC,                       
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Cannot allocate memory)
However, when I set the stack size to a lower value using ulimit -s:

ulimit -s 7500
I can now launch 10 threads. Each thread does not allocate anything, so it is only consuming the minimum overhead (aprox. 8 kb per thread, right?).

So, my question is:

Knowing that mmap doesnt actually consume the memory (due to overcommit=0, right?):

Why is pthread_create (or mmap) failing when memory available is above the thread stack size ? Where in linux source is the decision made to permit or not the mmap call ?

Thanks!
Ezequiel.



More information about the Kernelnewbies mailing list