From owner-svn-src-all@FreeBSD.ORG Tue Aug 13 22:40:44 2013 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 711BECA4; Tue, 13 Aug 2013 22:40:44 +0000 (UTC) (envelope-from jeff@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 5E08B2B64; Tue, 13 Aug 2013 22:40:44 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7DMeiRS006382; Tue, 13 Aug 2013 22:40:44 GMT (envelope-from jeff@svn.freebsd.org) Received: (from jeff@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7DMehSc006378; Tue, 13 Aug 2013 22:40:43 GMT (envelope-from jeff@svn.freebsd.org) Message-Id: <201308132240.r7DMehSc006378@svn.freebsd.org> From: Jeff Roberson Date: Tue, 13 Aug 2013 22:40:43 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r254307 - in head/sys: kern vm X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 13 Aug 2013 22:40:44 -0000 Author: jeff Date: Tue Aug 13 22:40:43 2013 New Revision: 254307 URL: http://svnweb.freebsd.org/changeset/base/254307 Log: - Add a statically allocated memguard arena since it is needed very early on. - Pass the appropriate flags to vmem_xalloc() when allocating space for the arena from kmem_arena. Sponsored by: EMC / Isilon Storage Division Modified: head/sys/kern/subr_vmem.c head/sys/vm/memguard.c head/sys/vm/vm_kern.h Modified: head/sys/kern/subr_vmem.c ============================================================================== --- head/sys/kern/subr_vmem.c Tue Aug 13 22:05:50 2013 (r254306) +++ head/sys/kern/subr_vmem.c Tue Aug 13 22:40:43 2013 (r254307) @@ -57,6 +57,8 @@ __FBSDID("$FreeBSD$"); #include #include +#include "opt_vm.h" + #include #include #include @@ -223,6 +225,11 @@ vmem_t *kmem_arena = &kmem_arena_storage vmem_t *buffer_arena = &buffer_arena_storage; vmem_t *transient_arena = &transient_arena_storage; +#ifdef DEBUG_MEMGUARD +static struct vmem memguard_arena_storage; +vmem_t *memguard_arena = &memguard_arena_storage; +#endif + /* * Fill the vmem's boundary tag cache. We guarantee that boundary tag * allocation will not fail once bt_fill() passes. To do so we cache Modified: head/sys/vm/memguard.c ============================================================================== --- head/sys/vm/memguard.c Tue Aug 13 22:05:50 2013 (r254306) +++ head/sys/vm/memguard.c Tue Aug 13 22:40:43 2013 (r254307) @@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -100,7 +101,6 @@ SYSCTL_PROC(_vm_memguard, OID_AUTO, desc CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_MPSAFE, 0, 0, memguard_sysctl_desc, "A", "Short description of memory type to monitor"); -static vmem_t *memguard_map = NULL; static vm_offset_t memguard_cursor; static vm_offset_t memguard_base; static vm_size_t memguard_mapsize; @@ -206,8 +206,8 @@ memguard_init(vmem_t *parent) { vm_offset_t base; - vmem_alloc(parent, memguard_mapsize, M_WAITOK, &base); - memguard_map = vmem_create("memguard arena", base, memguard_mapsize, + vmem_alloc(parent, memguard_mapsize, M_BESTFIT | M_WAITOK, &base); + vmem_init(memguard_arena, "memguard arena", base, memguard_mapsize, PAGE_SIZE, 0, M_WAITOK); memguard_cursor = base; memguard_base = base; @@ -311,7 +311,7 @@ memguard_alloc(unsigned long req_size, i * of physical memory whether we allocate or hand off to * uma_large_alloc(), so keep those. */ - if (vmem_size(memguard_map, VMEM_ALLOC) >= memguard_physlimit && + if (vmem_size(memguard_arena, VMEM_ALLOC) >= memguard_physlimit && req_size < PAGE_SIZE) { addr = (vm_offset_t)NULL; memguard_fail_pgs++; @@ -328,8 +328,9 @@ memguard_alloc(unsigned long req_size, i * map, unless vm_map_findspace() is tweaked. */ for (;;) { - if (vmem_xalloc(memguard_map, size_v, 0, 0, 0, memguard_cursor, - VMEM_ADDR_MAX, M_BESTFIT | M_NOWAIT, &addr) == 0) + if (vmem_xalloc(memguard_arena, size_v, 0, 0, 0, + memguard_cursor, VMEM_ADDR_MAX, + M_BESTFIT | M_NOWAIT, &addr) == 0) break; /* * The map has no space. This may be due to @@ -348,7 +349,7 @@ memguard_alloc(unsigned long req_size, i addr += PAGE_SIZE; rv = kmem_back(kmem_object, addr, size_p, flags); if (rv != KERN_SUCCESS) { - vmem_xfree(memguard_map, addr, size_v); + vmem_xfree(memguard_arena, addr, size_v); memguard_fail_pgs++; addr = (vm_offset_t)NULL; goto out; @@ -419,7 +420,7 @@ memguard_free(void *ptr) kmem_unback(kmem_object, addr, size); if (sizev > size) addr -= PAGE_SIZE; - vmem_xfree(memguard_map, addr, sizev); + vmem_xfree(memguard_arena, addr, sizev); if (req_size < PAGE_SIZE) memguard_wasted -= (PAGE_SIZE - req_size); } Modified: head/sys/vm/vm_kern.h ============================================================================== --- head/sys/vm/vm_kern.h Tue Aug 13 22:05:50 2013 (r254306) +++ head/sys/vm/vm_kern.h Tue Aug 13 22:40:43 2013 (r254307) @@ -71,6 +71,7 @@ extern struct vmem *kernel_arena; extern struct vmem *kmem_arena; extern struct vmem *buffer_arena; extern struct vmem *transient_arena; +extern struct vmem *memguard_arena; extern vm_offset_t swapbkva; extern u_long vm_kmem_size;