Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 21 Jan 2012 05:03:10 +0000 (UTC)
From:      Alan Cox <alc@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r230418 - stable/9/sys/kern
Message-ID:  <201201210503.q0L53ACK075146@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: alc
Date: Sat Jan 21 05:03:10 2012
New Revision: 230418
URL: http://svn.freebsd.org/changeset/base/230418

Log:
  MFC r226163, r228317, and r228324
    Fix the handling of an empty kmem map by sysctl_kmem_map_free().
  
    Eliminate the possibility of 32-bit arithmetic overflow in the
    calculation of vm_kmem_size that may occur if the system
    administrator has specified a vm.vm_kmem_size tunable value that
    exceeds the hard cap.
  
    Eliminate stale numbers from a comment.
  
  PR:		162741

Modified:
  stable/9/sys/kern/kern_malloc.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/amd64/include/xen/   (props changed)
  stable/9/sys/boot/   (props changed)
  stable/9/sys/boot/i386/efi/   (props changed)
  stable/9/sys/boot/ia64/efi/   (props changed)
  stable/9/sys/boot/ia64/ski/   (props changed)
  stable/9/sys/boot/powerpc/boot1.chrp/   (props changed)
  stable/9/sys/boot/powerpc/ofw/   (props changed)
  stable/9/sys/cddl/contrib/opensolaris/   (props changed)
  stable/9/sys/conf/   (props changed)
  stable/9/sys/contrib/dev/acpica/   (props changed)
  stable/9/sys/contrib/octeon-sdk/   (props changed)
  stable/9/sys/contrib/pf/   (props changed)
  stable/9/sys/contrib/x86emu/   (props changed)

Modified: stable/9/sys/kern/kern_malloc.c
==============================================================================
--- stable/9/sys/kern/kern_malloc.c	Sat Jan 21 04:24:19 2012	(r230417)
+++ stable/9/sys/kern/kern_malloc.c	Sat Jan 21 05:03:10 2012	(r230418)
@@ -265,8 +265,8 @@ sysctl_kmem_map_free(SYSCTL_HANDLER_ARGS
 	u_long size;
 
 	vm_map_lock_read(kmem_map);
-	size = kmem_map->root != NULL ?
-	    kmem_map->root->max_free : kmem_map->size;
+	size = kmem_map->root != NULL ? kmem_map->root->max_free :
+	    kmem_map->max_offset - kmem_map->min_offset;
 	vm_map_unlock_read(kmem_map);
 	return (sysctl_handle_long(oidp, &size, 0, req));
 }
@@ -661,12 +661,9 @@ kmeminit(void *dummy)
 
 	/*
 	 * Try to auto-tune the kernel memory size, so that it is
-	 * more applicable for a wider range of machine sizes.
-	 * On an X86, a VM_KMEM_SIZE_SCALE value of 4 is good, while
-	 * a VM_KMEM_SIZE of 12MB is a fair compromise.  The
+	 * more applicable for a wider range of machine sizes.  The
 	 * VM_KMEM_SIZE_MAX is dependent on the maximum KVA space
-	 * available, and on an X86 with a total KVA space of 256MB,
-	 * try to keep VM_KMEM_SIZE_MAX at 80MB or below.
+	 * available.
 	 *
 	 * Note that the kmem_map is also used by the zone allocator,
 	 * so make sure that there is enough space.
@@ -703,11 +700,11 @@ kmeminit(void *dummy)
 	/*
 	 * Limit kmem virtual size to twice the physical memory.
 	 * This allows for kmem map sparseness, but limits the size
-	 * to something sane. Be careful to not overflow the 32bit
-	 * ints while doing the check.
+	 * to something sane.  Be careful to not overflow the 32bit
+	 * ints while doing the check or the adjustment.
 	 */
-	if (((vm_kmem_size / 2) / PAGE_SIZE) > cnt.v_page_count)
-		vm_kmem_size = 2 * cnt.v_page_count * PAGE_SIZE;
+	if (vm_kmem_size / 2 / PAGE_SIZE > mem_size)
+		vm_kmem_size = 2 * mem_size * PAGE_SIZE;
 
 #ifdef DEBUG_MEMGUARD
 	tmp = memguard_fudge(vm_kmem_size, vm_kmem_size_max);



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