From owner-freebsd-bugs Mon Feb 7 14: 9:18 2000 Delivered-To: freebsd-bugs@freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.ORG [204.216.27.21]) by builder.freebsd.org (Postfix) with ESMTP id 5183F4041 for ; Mon, 7 Feb 2000 14:09:14 -0800 (PST) Received: (from gnats@localhost) by freefall.freebsd.org (8.9.3/8.9.2) id OAA54970; Mon, 7 Feb 2000 14:10:01 -0800 (PST) (envelope-from gnats@FreeBSD.org) Received: from jason.kmost.express.ru (jason.kmost.express.ru [212.24.37.101]) by builder.freebsd.org (Postfix) with ESMTP id 59C794011 for ; Mon, 7 Feb 2000 14:00:21 -0800 (PST) Received: (from jason@localhost) by jason.kmost.express.ru (8.9.3/8.9.3) id AAA00553; Tue, 8 Feb 2000 00:57:28 +0300 (MSK) (envelope-from jason) Message-Id: <200002072157.AAA00553@jason.kmost.express.ru> Date: Tue, 8 Feb 2000 00:57:28 +0300 (MSK) From: jason@express.ru Reply-To: jason@express.ru To: FreeBSD-gnats-submit@freebsd.org X-Send-Pr-Version: 3.2 Subject: kern/16573: extensive fork()+mmap() causes 4.0 kernel to panic() Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org >Number: 16573 >Category: kern >Synopsis: extensive fork()+mmap() causes 4.0 kernel to panic() >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Mon Feb 7 14:10:01 PST 2000 >Closed-Date: >Last-Modified: >Originator: Dmitry Kim >Release: FreeBSD 4.0-20000127-CURRENT i386 >Organization: BTU "Russian Express" >Environment: [jason@jsn jason]$ uname -a FreeBSD jsn.kmost.express.ru 4.0-20000127-CURRENT FreeBSD 4.0-20000127-CURRENT #3: Mon Feb 7 23:31:48 MSK 2000 root@jsn.kmost.express.ru:/usr/src/sys/compile/JSN i386 >Description: on 4.0-20000127-CURRENT i386: when doing while(1) { if( !fork() { mmap(); exit() } }, after certain number of iteraions (probably ~10000), fork() ends up with kernel panic. >How-To-Repeat: file x.c #include #include #include #include #include #include #define MAX 1048576 int fork_and_mmap( char *fname ) { int pid = fork() ; if( pid == -1 ) { perror( "fork()" ) ; sleep( 1 ) ; } else if ( pid == 0 ) { int fd ; struct stat s; caddr_t this ; if ((fd = open(fname, O_RDONLY, 0)) < 0) { perror(fname); exit( 1 ) ; } if (fstat(fd, &s) < 0) { perror("fstat") ; exit(0) ; } this = mmap((caddr_t) 0, s.st_size, PROT_READ, MAP_PRIVATE, fd, (off_t) 0) ; if ((int) this == -1) { perror("mmap"); sleep(1); } close( fd ) ; fprintf( stderr, "!" ) ; exit( 0 ) ; } else { fprintf( stderr, "(" ) ; /* wait(&pid) ; */ fprintf( stderr, ")" ) ; } } int main() { int i = 0; int fd; char filename[2048]; caddr_t this; while (i ++ < MAX) { if( gets(filename) == NULL ) { fprintf( stderr, "end of file list reached\n" ) ; break ; } fork_and_mmap( filename ) ; if (! (i % 512)) { fprintf(stderr, "[%d] .. ", i); } if ( i > 200000 ) { fprintf( stderr, "200000 reached, exiting\n" ) ; return 0 ; } } } gcc -o x x.c find / -type f -print > filelist ./x < filelist >Fix: >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message