svn commit: r194376 - head/sys/vm

Alan Cox alc at FreeBSD.org
Wed Jun 17 17:19:49 UTC 2009


Author: alc
Date: Wed Jun 17 17:19:48 2009
New Revision: 194376
URL: http://svn.freebsd.org/changeset/base/194376

Log:
  Refactor contigmalloc() into two functions: a simple front-end that deals
  with the malloc tag and calls a new back-end, kmem_alloc_contig(), that
  allocates the pages and maps them.
  
  The motivations for this change are two-fold: (1) A cache mode parameter
  will be added to kmem_alloc_contig().  In other words, kmem_alloc_contig()
  will be extended to support the allocation of memory with caller-specified
  caching. (2) The UMA allocation function that is used by the two jumbo
  frames zones can use kmem_alloc_contig() in place of contigmalloc() and
  thereby avoid having free jumbo frames held by the zone counted as live
  malloc()ed memory.

Modified:
  head/sys/vm/vm_contig.c
  head/sys/vm/vm_extern.h

Modified: head/sys/vm/vm_contig.c
==============================================================================
--- head/sys/vm/vm_contig.c	Wed Jun 17 16:56:21 2009	(r194375)
+++ head/sys/vm/vm_contig.c	Wed Jun 17 17:19:48 2009	(r194376)
@@ -193,7 +193,7 @@ vm_page_release_contig(vm_page_t m, vm_p
  *	specified through the given flags, then the pages are zeroed
  *	before they are mapped.
  */
-static void *
+static vm_offset_t
 contigmapping(vm_map_t map, vm_size_t size, vm_page_t m, int flags)
 {
 	vm_object_t object = kernel_object;
@@ -202,7 +202,7 @@ contigmapping(vm_map_t map, vm_size_t si
 	vm_map_lock(map);
 	if (vm_map_findspace(map, vm_map_min(map), size, &addr)) {
 		vm_map_unlock(map);
-		return (NULL);
+		return (0);
 	}
 	vm_object_reference(object);
 	vm_map_insert(map, object, addr - VM_MIN_KERNEL_ADDRESS,
@@ -220,7 +220,7 @@ contigmapping(vm_map_t map, vm_size_t si
 	VM_OBJECT_UNLOCK(object);
 	vm_map_wire(map, addr, addr + size,
 	    VM_MAP_WIRE_SYSTEM | VM_MAP_WIRE_NOHOLES);
-	return ((void *)addr);
+	return (addr);
 }
 
 void *
@@ -234,6 +234,19 @@ contigmalloc(
 	unsigned long boundary)
 {
 	void *ret;
+
+	ret = (void *)kmem_alloc_contig(kernel_map, size, flags, low, high,
+	    alignment, boundary);
+	if (ret != NULL)
+		malloc_type_allocated(type, round_page(size));
+	return (ret);
+}
+
+vm_offset_t
+kmem_alloc_contig(vm_map_t map, vm_size_t size, int flags, vm_paddr_t low,
+    vm_paddr_t high, unsigned long alignment, unsigned long boundary)
+{
+	vm_offset_t ret;
 	vm_page_t pages;
 	unsigned long npgs;
 	int actl, actmax, inactl, inactmax, tries;
@@ -265,13 +278,11 @@ again:
 			tries++;
 			goto retry;
 		}
-		ret = NULL;
+		ret = 0;
 	} else {
-		ret = contigmapping(kernel_map, size, pages, flags);
-		if (ret == NULL)
+		ret = contigmapping(map, size, pages, flags);
+		if (ret == 0)
 			vm_page_release_contig(pages, npgs);
-		else
-			malloc_type_allocated(type, npgs << PAGE_SHIFT);
 	}
 	return (ret);
 }

Modified: head/sys/vm/vm_extern.h
==============================================================================
--- head/sys/vm/vm_extern.h	Wed Jun 17 16:56:21 2009	(r194375)
+++ head/sys/vm/vm_extern.h	Wed Jun 17 17:19:48 2009	(r194376)
@@ -44,6 +44,9 @@ struct vnode;
 
 int kernacc(void *, int, int);
 vm_offset_t kmem_alloc(vm_map_t, vm_size_t);
+vm_offset_t kmem_alloc_contig(vm_map_t map, vm_size_t size, int flags,
+    vm_paddr_t low, vm_paddr_t high, unsigned long alignment,
+    unsigned long boundary);
 vm_offset_t kmem_alloc_nofault(vm_map_t, vm_size_t);
 vm_offset_t kmem_alloc_wait(vm_map_t, vm_size_t);
 void kmem_free(vm_map_t, vm_offset_t, vm_size_t);


More information about the svn-src-all mailing list