Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 24 Apr 2013 13:54:56 +0000 (UTC)
From:      Andre Oppermann <andre@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r249843 - head/sys/kern
Message-ID:  <201304241354.r3ODsu9P056909@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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)



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