• KOSAKI Motohiro's avatar
    On ia64, the following test program exit abnormally, because glibc thread · 6c431a13
    KOSAKI Motohiro authored
    library called abort().
    
     ========================================================
     (gdb) bt
     #0  0xa000000000010620 in __kernel_syscall_via_break ()
     #1  0x20000000003208e0 in raise () from /lib/libc.so.6.1
     #2  0x2000000000324090 in abort () from /lib/libc.so.6.1
     #3  0x200000000027c3e0 in __deallocate_stack () from /lib/libpthread.so.0
     #4  0x200000000027f7c0 in start_thread () from /lib/libpthread.so.0
     #5  0x200000000047ef60 in __clone2 () from /lib/libc.so.6.1
     ========================================================
    
    The fact is, glibc call munmap() when thread exitng time for freeing
    stack, and it assume munlock() never fail.  However, munmap() often make
    vma splitting and it with many mapcount make -ENOMEM.
    
    Oh well, that's crazy, because stack unmapping never increase mapcount. 
    The maxcount exceeding is only temporary.  internal temporary exceeding
    shouldn't make ENOMEM.
    
    This patch does it.
    
     test_max_mapcount.c
     ==================================================================
      #include<stdio.h>
      #include<stdlib.h>
      #include<string.h>
      #include<pthread.h>
      #include<errno.h>
      #include<unistd.h>
    
      #define THREAD_NUM 30000
      #define MAL_SIZE (8*1024*1024)
    
     void *wait_thread(void *args)
     {
     	void *addr;
    
     	addr = malloc(MAL_SIZE);
     	sleep(10);
    
     	return NULL;
     }
    
     void *wait_thread2(void *args)
     {
     	sleep(60);
    
     	return NULL;
     }
    
     int main(int argc, char *argv[])
     {
     	int i;
     	pthread_t thread[THREAD_NUM], th;
     	int ret, count = 0;
     	pthread_attr_t attr;
    
     	ret = pthread_attr_init(&attr);
     	if(ret) {
     		perror("pthread_attr_init");
     	}
    
     	ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
     	if(ret) {
     		perror("pthread_attr_setdetachstate");
     	}
    
     	for (i = 0; i < THREAD_NUM; i++) {
     		ret = pthread_create(&th, &attr, wait_thread, NULL);
     		if(ret) {
     			fprintf(stderr, "[%d] ", count);
     			perror("pthread_create");
     		} else {
     			printf("[%d] create OK.\n", count);
     		}
     		count++;
    
     		ret = pthread_create(&thread[i], &attr, wait_thread2, NULL);
     		if(ret) {
     			fprintf(stderr, "[%d] ", count);
     			perror("pthread_create");
     		} else {
     			printf("[%d] create OK.\n", count);
     		}
     		count++;
     	}
    
     	sleep(3600);
     	return 0;
     }
     ==================================================================
    Signed-off-by: default avatarKOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    Signed-off-by: default avatarHugh Dickins <hugh.dickins@tiscali.co.uk>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    6c431a13
mmap.c 65.3 KB