Skip site navigation (1)Skip section navigation (2)
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>