Hi (long post) I am not sure this is the right list; my post last week on Opensuse 64 bit forum did not yield comments so far. I am trying to resolve a failure of Google Native Client in Opensuse 64 11.4, discussed in Google Native Client forum: [1] https://groups.google.com/forum/#!topic/native-client-discuss/7DUFfi_BxqM To repeat the issue in a nutshell:: --------------------------------------------- Google native client (Chrome) works on recent versions of at least Ubuntu [1], but fails on Opensuse 11.4 (with all latest updates up to Nov 4). This failure can be reproduced in chrome 14, 15, 16 (from http://dl.google.com/linux/chrome/rpm/stable/x86_64) and verified by loading [2] http://www.gonacl.com/dev/demos/sdk_examples/load_progress/load_progress.htm... The problem / question for opensuse (kernel?) :: ------------------------------------------------------------------ There is a long discussion in the above thread, to get to the point quickly: The Google guys identified an issue with mmap() with MAP_NORESERVE (see below). They believe it may be a bug or a kernel configuration issue(?) A Chrome Nacl person suggest the following code should print "Success" but it fails in my testing: #include <stdio.h> #include <sys/mman.h> int main(void) { void *addr; printf("Hello world\nAllocating 29Gb...\n"); addr = mmap((void *) NULL, 29 * (((size_t) 1) << 30), PROT_NONE, MAP_ANONYMOUS | MAP_NORESERVE | MAP_PRIVATE, -1, 0); /* test 29 or other values */ if (MAP_FAILED == addr) { printf("FAILED\n"); } else { printf("Success: %p\n", addr); } return 0; } This prints FAILED on Opensuse 11.4 64 bit. I did some experiments. On my system: # cat /proc/meminfo MemTotal: 15948428 kB MemFree: 11270612 kB .... CommitLimit: 28945728 kB Committed_AS: 4918284 kB ...
From running the test program above, it looks like *CommitLimit* is clearly used as upper limit of mmap(MAP_ANONYMOUS | MAP_NORESERVE | MAP_PRIVATE), *no matter what vm.overcommit_memory* flag is used.
In concrete terms: mmap((void *) NULL, 29 * (((size_t) 1) << 30), PROT_NONE, MAP_ANONYMOUS | MAP_NORESERVE | MAP_PRIVATE, -1, 0); // always FAILS with value of 29 or higher mmap((void *) NULL, 28 * (((size_t) 1) << 30), PROT_NONE, MAP_ANONYMOUS | MAP_NORESERVE | MAP_PRIVATE, -1, 0); // always SUCCEEDS with value of 28 or lower No matter what setting of sysctl -w vm.overcommit_memory=0 # or 1 or 2 (This seems a Opensuse 11.4 bug in modes 0 and 1, as according to [2] anonymous private readonly should have 0 cost) Any comments or solutions or how to fix this? Thanks, Milan [1] http://www.mjmwired.net/kernel/Documentation/filesystems/proc.txt [2] http://www.mjmwired.net/kernel/Documentation/vm/overcommit-accounting ======================= PS: I am attaching a few pieces of info about my system that may be relevant: The hardware is AMD 4 core AMD Athlon II X4 610e and has 16Gb (sixteen) of memory, running very little (just KDE desktop at this point) # swapon -s Filename Type Size Used Priority /dev/sda1 partition 20971516 0 -1 # cat /proc/sys/vm/overcommit_memory 0 # ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 123980 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) 13556224 open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 123980 virtual memory (kbytes, -v) 29536000 file locks (-x) unlimited # df Filesystem 1K-blocks Used Available Use% Mounted on rootfs 82567856 15558248 62815408 20% / devtmpfs 7934744 244 7934500 1% /dev tmpfs 7974212 1592 7972620 1% /dev/shm /dev/sda2 82567856 15558248 62815408 20% / /dev/sda3 377510440 90623252 267710692 26% /home -- To unsubscribe, e-mail: opensuse-kernel+unsubscribe@opensuse.org To contact the owner, e-mail: opensuse-kernel+owner@opensuse.org