Date: Wed, 15 Jan 1997 11:35:54 -0800 From: David Greenman <dg@root.com> To: Bruce Evans <bde@zeta.org.au> Cc: bugs@freebsd.org, dyson@freebsd.org, wollman@freebsd.org Subject: Re: malloc(..., M_WAITOK) found harmful Message-ID: <199701151935.LAA08193@root.com> In-Reply-To: Your message of "Thu, 16 Jan 1997 04:54:18 %2B1100." <199701151754.EAA31434@godzilla.zeta.org.au>
next in thread | previous in thread | raw e-mail | index | archive | help
>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 ----
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199701151935.LAA08193>
