From owner-freebsd-bugs Wed Jan 15 11:39:22 1997 Return-Path: Received: (from root@localhost) by freefall.freebsd.org (8.8.4/8.8.4) id LAA19283 for bugs-outgoing; Wed, 15 Jan 1997 11:39:22 -0800 (PST) Received: from root.com (implode.root.com [198.145.90.17]) by freefall.freebsd.org (8.8.4/8.8.4) with ESMTP id LAA19210; Wed, 15 Jan 1997 11:38:00 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by root.com (8.7.6/8.6.5) with SMTP id LAA08193; Wed, 15 Jan 1997 11:35:54 -0800 (PST) Message-Id: <199701151935.LAA08193@root.com> X-Authentication-Warning: implode.root.com: Host localhost [127.0.0.1] didn't use HELO protocol To: Bruce Evans cc: bugs@freebsd.org, dyson@freebsd.org, wollman@freebsd.org Subject: Re: malloc(..., M_WAITOK) found harmful In-reply-to: Your message of "Thu, 16 Jan 1997 04:54:18 +1100." <199701151754.EAA31434@godzilla.zeta.org.au> From: David Greenman Reply-To: dg@root.com Date: Wed, 15 Jan 1997 11:35:54 -0800 Sender: owner-bugs@freebsd.org X-Loop: FreeBSD.org Precedence: bulk >The maps are special-cased in too many other places. I added a check for Here are my diffs to combine the maps. -DG David Greenman Core-team/Principal Architect, The FreeBSD Project Index: conf/param.c =================================================================== RCS file: /home/ncvs/src/sys/conf/param.c,v retrieving revision 1.21 diff -c -r1.21 param.c *** param.c 1997/01/14 06:34:54 1.21 --- param.c 1997/01/15 19:22:50 *************** *** 100,107 **** #endif int nmbclusters = NMBCLUSTERS; ! /* allocate same amount of virtual address space for mbufs XXX */ ! int nmbufs = NMBCLUSTERS * (MCLBYTES / MSIZE); int fscale = FSCALE; /* kernel uses `FSCALE', user uses `fscale' */ --- 100,107 ---- #endif int nmbclusters = NMBCLUSTERS; ! /* allocate 1/4th amount of virtual address space for mbufs XXX */ ! int nmbufs = NMBCLUSTERS * 4; int fscale = FSCALE; /* kernel uses `FSCALE', user uses `fscale' */ Index: i386/i386/machdep.c =================================================================== RCS file: /home/ncvs/src/sys/i386/i386/machdep.c,v retrieving revision 1.224 diff -c -r1.224 machdep.c *** machdep.c 1997/01/14 06:38:51 1.224 --- machdep.c 1997/01/15 19:28:33 *************** *** 344,359 **** * Finally, allocate mbuf pool. Since mclrefcnt is an off-size * we use the more space efficient malloc in place of kmem_alloc. */ - mclrefcnt = (char *)malloc(nmbclusters+PAGE_SIZE/MCLBYTES, - M_MBUF, M_NOWAIT); - bzero(mclrefcnt, nmbclusters+PAGE_SIZE/MCLBYTES); - mcl_map = kmem_suballoc(kmem_map, (vm_offset_t *)&mbutl, &maxaddr, - nmbclusters * MCLBYTES, FALSE); { ! vm_size_t mb_map_size; ! mb_map_size = nmbufs * MSIZE; ! mb_map = kmem_suballoc(kmem_map, &minaddr, &maxaddr, ! round_page(mb_map_size), FALSE); } /* --- 344,358 ---- * Finally, allocate mbuf pool. Since mclrefcnt is an off-size * we use the more space efficient malloc in place of kmem_alloc. */ { ! vm_offset_t mb_map_size; ! ! mb_map_size = nmbufs * MSIZE + nmbclusters * MCLBYTES; ! mb_map_size = roundup2(mb_map_size, max(MCLBYTES, PAGE_SIZE)); ! mclrefcnt = malloc(mb_map_size / MCLBYTES, M_MBUF, M_NOWAIT); ! bzero(mclrefcnt, mb_map_size / MCLBYTES); ! mb_map = kmem_suballoc(kmem_map, (vm_offset_t *)&mbutl, &maxaddr, ! mb_map_size, FALSE); } /* Index: kern/uipc_mbuf.c =================================================================== RCS file: /home/ncvs/src/sys/kern/uipc_mbuf.c,v retrieving revision 1.25 diff -c -r1.25 uipc_mbuf.c *** uipc_mbuf.c 1997/01/14 06:44:16 1.25 --- uipc_mbuf.c 1997/01/15 18:59:32 *************** *** 150,160 **** * to get any more (nothing is ever freed back to the * map). */ ! if (mcl_map_full) return (0); npg = ncl; ! p = (caddr_t)kmem_malloc(mcl_map, ctob(npg), nowait ? M_NOWAIT : M_WAITOK); /* * Either the map is now full, or this is nowait and there --- 150,160 ---- * to get any more (nothing is ever freed back to the * map). */ ! if (mb_map_full) return (0); npg = ncl; ! p = (caddr_t)kmem_malloc(mb_map, ctob(npg), nowait ? M_NOWAIT : M_WAITOK); /* * Either the map is now full, or this is nowait and there Index: vm/vm_kern.c =================================================================== RCS file: /home/ncvs/src/sys/vm/vm_kern.c,v retrieving revision 1.30 diff -c -r1.30 vm_kern.c *** vm_kern.c 1997/01/14 06:57:28 1.30 --- vm_kern.c 1997/01/15 19:01:18 *************** *** 98,105 **** vm_map_t buffer_map=0; vm_map_t mb_map=0; int mb_map_full=0; - vm_map_t mcl_map=0; - int mcl_map_full=0; vm_map_t io_map=0; vm_map_t phys_map=0; --- 98,103 ---- *************** *** 289,296 **** vm_offset_t addr; vm_page_t m; ! if (map != kmem_map && map != mb_map && map != mcl_map) ! panic("kmem_malloc: map != {kmem,mb,mcl}_map"); size = round_page(size); addr = vm_map_min(map); --- 287,294 ---- vm_offset_t addr; vm_page_t m; ! if (map != kmem_map && map != mb_map) ! panic("kmem_malloc: map != {kmem,mb}_map"); size = round_page(size); addr = vm_map_min(map); *************** *** 305,317 **** vm_map_unlock(map); if (map == mb_map) { mb_map_full = TRUE; ! log(LOG_ERR, "Out of mbufs - increase maxusers!\n"); ! return (0); ! } ! if (map == mcl_map) { ! mcl_map_full = TRUE; ! log(LOG_ERR, ! "Out of mbuf clusters - increase maxusers!\n"); return (0); } if (waitflag == M_WAITOK) --- 303,309 ---- vm_map_unlock(map); if (map == mb_map) { mb_map_full = TRUE; ! log(LOG_ERR, "Out of mbuf clusters - increase maxusers!\n"); return (0); } if (waitflag == M_WAITOK) Index: vm/vm_kern.h =================================================================== RCS file: /home/ncvs/src/sys/vm/vm_kern.h,v retrieving revision 1.9 diff -c -r1.9 vm_kern.h *** vm_kern.h 1997/01/14 06:57:30 1.9 --- vm_kern.h 1997/01/15 19:01:27 *************** *** 73,80 **** extern vm_map_t kmem_map; extern vm_map_t mb_map; extern int mb_map_full; - extern vm_map_t mcl_map; - extern int mcl_map_full; extern vm_map_t io_map; extern vm_map_t clean_map; extern vm_map_t phys_map; --- 73,78 ----