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