svn commit: r249843 - head/sys/kern

Andre Oppermann andre at FreeBSD.org
Wed Apr 24 13:54:56 UTC 2013


Author: andre
Date: Wed Apr 24 13:54:55 2013
New Revision: 249843
URL: http://svnweb.freebsd.org/changeset/base/249843

Log:
  Base the calculation of maxmbufmem in part on kmem_map size
  instead of kernel_map size to prevent kernel memory exhaustion
  by mbufs and a subsequent panic on physical page allocation
  failure.
  
  On architectures without a direct map all mbuf memory (except
  for jumbo mbufs larger than PAGE_SIZE) comes from kmem_map.
  It is the limiting factor hence.
  
  For architectures with a direct map using the size of kmem_map
  is a good proxy of available kernel memory as well.  If it is
  much smaller the mbuf limit may be sub-optimal but remains
  reasonable, while avoiding panics under exhaustion.
  
  The overall mbuf memory limit calculation may be reconsidered
  again later, however due to the many different mbuf sizes and
  different backing KVM maps it is a tricky subject.
  
  Found by:	pho's new network stress test
  Pointed out by:	alc (kmem_map instead of kernel_map)
  Tested by:	pho

Modified:
  head/sys/kern/kern_mbuf.c

Modified: head/sys/kern/kern_mbuf.c
==============================================================================
--- head/sys/kern/kern_mbuf.c	Wed Apr 24 13:19:48 2013	(r249842)
+++ head/sys/kern/kern_mbuf.c	Wed Apr 24 13:54:55 2013	(r249843)
@@ -118,7 +118,7 @@ tunable_mbinit(void *dummy)
 	 * At most it can be 3/4 of available kernel memory.
 	 */
 	realmem = qmin((quad_t)physmem * PAGE_SIZE,
-	    vm_map_max(kernel_map) - vm_map_min(kernel_map));
+	    vm_map_max(kmem_map) - vm_map_min(kmem_map));
 	maxmbufmem = realmem / 2;
 	TUNABLE_QUAD_FETCH("kern.maxmbufmem", &maxmbufmem);
 	if (maxmbufmem > realmem / 4 * 3)


More information about the svn-src-all mailing list