Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 Aug 1996 14:57:39 -0500
From:      jgreco@ns.sol.net
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   kern/1533: VM Crash with massive numbers of mmap's
Message-ID:  <199608221957.OAA23038@anacreon.sol.net>
Resent-Message-ID: <199608222000.NAA11802@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         1533
>Category:       kern
>Synopsis:       Machine can be panicked by a userland program.
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Aug 22 13:00:02 PDT 1996
>Last-Modified:
>Originator:     Joe Greco
>Organization:
sol.net Network Services
>Release:        FreeBSD 2.1-STABLE i386
>Environment:

	Pentium 133, ASUS Triton-II motherboard, 192MB RAM, 
	3 x NCR 810 SCSI controllers, 15 Hawk 1GB drives plus 2 Barra 4G's,
	SMC EtherPower 10/100

	Kernel configuration:

Local modifications:	DK_NDRIVE --> 32
			MSG_BSIZE --> (16384 - 3 * sizeof(unsigned int))

sysctl -w kern.update=300

/sys/i386/conf/NEWSREADER_DB:

#
# NEWSREADER_DB -- Generic machine with WD/AHx/NCR/BTx family disks
#
#	$Id: NEWSREADER_DB,v 1.46.2.18 1996/07/16 08:53:04 davidg Exp $
#

machine		"i386"
#cpu		"I386_CPU"
cpu		"I486_CPU"
cpu		"I586_CPU"
ident		"NEWSREADER_DB"
maxusers	256

options         "MAXMEM=262720"         #real memory  = 67698688 (16528 pages)
                                        #+192MB = 256MB

options		MATH_EMULATE		#Support for x87 emulation
options		INET			#InterNETworking
options		FFS			#Berkeley Fast Filesystem
options		NFS			#Network Filesystem
options		MSDOSFS			#MSDOS Filesystem
options		"CD9660"		#ISO 9660 Filesystem
options		PROCFS			#Process filesystem
options		"COMPAT_43"		#Compatible with BSD 4.3
options		"SCSI_DELAY=5"		#Be pessimistic about Joe SCSI device
options		BOUNCE_BUFFERS		#include support for DMA bounce buffers
options		UCONSOLE		#Allow users to grab the console

options               "CHILD_MAX=512"
options               "OPEN_MAX=256"
#options               "NMBCLUSTERS=512"

options		SYSVSHM
options		SYSVSEM
options		SYSVMSG

config		kernel	root on wd0 

controller	isa0
controller	eisa0
controller	pci0

controller	fdc0	at isa? port "IO_FD1" bio irq 6 drq 2 vector fdintr
disk		fd0	at fdc0 drive 0
#disk		fd1	at fdc0 drive 1
#tape		ft0	at fdc0 drive 2

#controller	wdc0	at isa? port "IO_WD1" bio irq 14 vector wdintr
#disk		wd0	at wdc0 drive 0
#disk		wd1	at wdc0 drive 1

#controller	wdc1	at isa? port "IO_WD2" bio irq 15 vector wdintr
#disk		wd2	at wdc1 drive 0
#disk		wd3	at wdc1 drive 1

#options         ATAPI   #Enable ATAPI support for IDE bus
#device          wcd0    #IDE CD-ROM

controller	ncr0
controller	ncr1
controller	ncr2
controller	ahc0
controller	ahc1

#controller	bt0	at isa? port "IO_BT0" bio irq ? vector bt_isa_intr
#controller	uha0	at isa? port "IO_UHA0" bio irq ? drq 5 vector uhaintr
#controller	aha0	at isa? port "IO_AHA0" bio irq ? drq 5 vector ahaintr
#controller	aic0    at isa? port 0x340 bio irq 11 vector aicintr
#controller	nca0	at isa? port 0x1f88 bio irq 10 vector ncaintr
#controller	nca1	at isa? port 0x350 bio irq 5 vector ncaintr
#controller	sea0	at isa? bio irq 5 iomem 0xc8000 iosiz 0x2000 vector seaintr

controller      scbus0  at ncr0

disk  sd0 at scbus0     target 0 unit 0
disk  sd1 at scbus0     target 1 unit 0
disk  sd2 at scbus0     target 2 unit 0
disk  sd3 at scbus0     target 3 unit 0
disk  sd4 at scbus0     target 4 unit 0
disk  sd5 at scbus0     target 5 unit 0
disk  sd6 at scbus0     target 6 unit 0

controller      scbus1  at ncr1

disk sd10 at scbus1     target 0 unit 0
disk sd11 at scbus1     target 1 unit 0
disk sd12 at scbus1     target 2 unit 0
disk sd13 at scbus1     target 3 unit 0
disk sd14 at scbus1     target 4 unit 0
disk sd15 at scbus1     target 5 unit 0
disk sd16 at scbus1     target 6 unit 0

controller      scbus2  at ncr2

disk sd20 at scbus2     target 0 unit 0
disk sd21 at scbus2     target 1 unit 0
disk sd22 at scbus2     target 2 unit 0
disk sd23 at scbus2     target 3 unit 0
disk sd24 at scbus2     target 4 unit 0
disk sd25 at scbus2     target 5 unit 0
disk sd26 at scbus2     target 6 unit 0

#device		sd0

device		st0

#device		cd0	#Only need one of these, the code dynamically grows

#device		wt0	at isa? port 0x300 bio irq 5 drq 1 vector wtintr
#device		mcd0	at isa? port 0x300 bio irq 10 vector mcdintr

#controller	matcd0	at isa? port 0x230 bio

#device		scd0	at isa? port 0x230 bio

# syscons is the default console driver, resembling an SCO console
device		sc0	at isa? port "IO_KBD" tty irq 1 vector scintr
# Enable this and PCVT_FREEBSD for pcvt vt220 compatible console driver
#device		vt0	at isa? port "IO_KBD" tty irq 1 vector pcrint
#options		"PCVT_FREEBSD=210"	# pcvt running on FreeBSD 2.1
#options		XSERVER			# include code for XFree86
# If you have a ThinkPAD, uncomment this along with the rest of the PCVT lines
#options		PCVT_SCANSET=2		# IBM keyboards are non-std

# Mandatory, don't remove
device		npx0	at isa? port "IO_NPX" irq 13 vector npxintr

#
# Laptop support (see LINT for more options)
#
#device		apm0    at isa?		# Advanced Power Management
#options		APM_BROKEN_STATCLOCK	# Workaround some buggy APM BIOS

device		sio0	at isa? port "IO_COM1" tty irq 4 vector siointr
device		sio1	at isa? port "IO_COM2" tty irq 3 vector siointr
device		sio2	at isa? port "IO_COM3" tty irq 5 vector siointr
device		sio3	at isa? port "IO_COM4" tty irq 9 vector siointr

device		lpt0	at isa? port? tty irq 7 vector lptintr
device		lpt1	at isa? port? tty
#device		mse0	at isa? port 0x23c tty irq 5 vector mseintr
device		psm0	at isa? disable port "IO_KBD" conflicts tty irq 12 vector psmintr

# Order is important here due to intrusive probes, do *not* alphabetize
# this list of network interfaces until the probes have been fixed.
# Right now it appears that the ie0 must be probed before ep0. See
# revision 1.20 of this file.
device de0
#device fxp0
#device vx0
device ed0 at isa? port 0x280 net irq  5 iomem 0xd8000 vector edintr
device ed1 at isa? port 0x300 net irq  5 iomem 0xd8000 vector edintr
#device ie0 at isa? port 0x360 net irq  7 iomem 0xd0000 vector ieintr
#device ep0 at isa? port 0x300 net irq 10 vector epintr
#device ix0 at isa? port 0x300 net irq 10 iomem 0xd0000 iosiz 32768 vector ixintr
#device le0 at isa? port 0x300 net irq 5 iomem 0xd0000 vector le_intr
#device lnc0 at isa? port 0x280 net irq 10 drq 0 vector lncintr
#device ze0 at isa? port 0x300 net irq 5 iomem 0xd8000 vector zeintr
#device zp0 at isa? port 0x300 net irq 10 iomem 0xd8000 vector zpintr

pseudo-device	ccd	12	#Concatenated disk driver

pseudo-device	loop
pseudo-device	ether
pseudo-device	log
pseudo-device	sl	1
# ijppp uses tun instead of ppp device
pseudo-device	ppp	1
pseudo-device	tun	1
pseudo-device	pty	16
pseudo-device	gzip		# Exec gzipped a.out's
pseudo-device	vn		#Vnode driver (turns a file into a device)
pseudo-device	bpfilter	8	#Berkeley packet filter

>Description:

	Attempting to mmap() thousands of files caused the system to
	reboot or panic (can't tell which, the system is many miles away,
	but dmesg shows no saved data).  It freaked both times I tried it.

	The same program, run under Solaris, eventually quit with an
	ENOMEM error.

>How-To-Repeat:

Program:

#include        <stdio.h>
#include        <sys/types.h>
#include        <sys/stat.h>
#include        <sys/mman.h>
#include        <fcntl.h>

#define         MAX             1048576

caddr_t array[MAX];

int main()
{
        int i = 0;
        int fd;
        char filename[2048];
        struct stat s;
        caddr_t this;

        while (i < MAX) {
                gets(filename);
                if ((fd = open(filename, O_RDONLY, 0)) < 0) {
                        perror(filename);
                        sleep(1);
                } else {
                        if (fstat(fd, &s) < 0) {
                                perror("fstat");
                                sleep(1);
                        } else {
                                this = mmap((caddr_t) 0, s.st_size, PROT_READ,
                                        MAP_PRIVATE, fd, (off_t) 0);
                                if ((int) this == -1) {
                                        perror("mmap");
                                        sleep(1);
                                } else {
                                        array[i++] = this;
                                }
                        }
                        close(fd);
                }
                if (! (i % 512)) {
                        fprintf(stderr, "[%d] .. ", i);
                }
        }
}

I ran this on a news spool, as follows:

daily-bugle% find /news -type f -print | /tmp/a.out
{output output...} [34816] .. [35328] .. [35840] .. [36352] .. [36864] .. [37376] .. [37888] .. [38400] .. [38912] .. [39424] .. [39936] .. [40448] .. [40960] .. [41472] .. [41984] .. [42496] .. {hang}

In another window I was running "vmstat 1 |grep vnodes|grep K" once a second:

       vnodes 16009  2000K   2017K 19661K    17174    0     0  16,128,256
       vnodes 16009  2000K   2017K 19661K    17174    0     0  16,128,256
       vnodes 16009  2000K   2017K 19661K    17174    0     0  16,128,256
       vnodes 16009  2000K   2017K 19661K    17174    0     0  16,128,256
       vnodes 16009  2000K   2017K 19661K    17174    0     0  16,128,256
       vnodes 16009  2000K   2017K 19661K    17174    0     0  16,128,256
       vnodes 16009  2000K   2017K 19661K    17174    0     0  16,128,256
       vnodes 16009  2000K   2017K 19661K    17174    0     0  16,128,256
       vnodes 16009  2000K   2017K 19661K    17174    0     0  16,128,256
       vnodes 16037  2003K   2017K 19661K    17202    0     0  16,128,256
       vnodes 16203  2024K   2024K 19661K    17368    0     0  16,128,256
       vnodes 16347  2042K   2042K 19661K    17512    0     0  16,128,256
       vnodes 16354  2043K   2043K 19661K    17519    0     0  16,128,256
{etc etc}
       vnodes 42315  5288K   5288K 19661K    43480    0     0  16,128,256
       vnodes 42315  5288K   5288K 19661K    43480    0     0  16,128,256
       vnodes 42319  5288K   5288K 19661K    43484    0     0  16,128,256
       vnodes 42320  5288K   5288K 19661K    43485    0     0  16,128,256
       vnodes 42320  5288K   5288K 19661K    43485    0     0  16,128,256
       vnodes 42322  5288K   5288K 19661K    43487    0     0  16,128,256
       vnodes 42324  5289K   5289K 19661K    43489    0     0  16,128,256
       vnodes 42324  5289K   5289K 19661K    43489    0     0  16,128,256
       vnodes 42324  5289K   5289K 19661K    43489    0     0  16,128,256
       vnodes 42324  5289K   5289K 19661K    43489    0     0  16,128,256
       vnodes 42324  5289K   5289K 19661K    43489    0     0  16,128,256
       vnodes 42324  5289K   5289K 19661K    43489    0     0  16,128,256
       vnodes 42447  5304K   5304K 19661K    43612    0     0  16,128,256
       vnodes 42504  5311K   5311K 19661K    43669    0     0  16,128,256
       vnodes 42504  5311K   5311K 19661K    43669    0     0  16,128,256
       vnodes 42900  5361K   5361K 19661K    44065    0     0  16,128,256
{hang}

>Fix:
	
	Don't mmap trillions of files.  :-)  Probably not a good sol'n.

>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199608221957.OAA23038>