summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2013-08-13 22:40:43 +0000
committerjeff <jeff@FreeBSD.org>2013-08-13 22:40:43 +0000
commitd330a11545fdd7f4f3a76b565f3a6ef0afe404e4 (patch)
tree09c45cbc7188677f718f5cb4ad44fc0f0b15bb09
parent20df47e8777c5ad65596edefc77ae78f58e54253 (diff)
downloadFreeBSD-src-d330a11545fdd7f4f3a76b565f3a6ef0afe404e4.zip
FreeBSD-src-d330a11545fdd7f4f3a76b565f3a6ef0afe404e4.tar.gz
- 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
-rw-r--r--sys/kern/subr_vmem.c7
-rw-r--r--sys/vm/memguard.c17
-rw-r--r--sys/vm/vm_kern.h1
3 files changed, 17 insertions, 8 deletions
diff --git a/sys/kern/subr_vmem.c b/sys/kern/subr_vmem.c
index d3a758d..cff28b7 100644
--- a/sys/kern/subr_vmem.c
+++ b/sys/kern/subr_vmem.c
@@ -57,6 +57,8 @@ __FBSDID("$FreeBSD$");
#include <sys/taskqueue.h>
#include <sys/vmem.h>
+#include "opt_vm.h"
+
#include <vm/uma.h>
#include <vm/vm.h>
#include <vm/pmap.h>
@@ -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
diff --git a/sys/vm/memguard.c b/sys/vm/memguard.c
index 8b02161..167c223 100644
--- a/sys/vm/memguard.c
+++ b/sys/vm/memguard.c
@@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$");
#include <vm/vm_page.h>
#include <vm/vm_map.h>
#include <vm/vm_object.h>
+#include <vm/vm_kern.h>
#include <vm/vm_extern.h>
#include <vm/uma_int.h>
#include <vm/memguard.h>
@@ -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, int flags)
* 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, int flags)
* 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, int flags)
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);
}
diff --git a/sys/vm/vm_kern.h b/sys/vm/vm_kern.h
index 284b777..aec3ebd 100644
--- a/sys/vm/vm_kern.h
+++ b/sys/vm/vm_kern.h
@@ -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;
OpenPOWER on IntegriCloud