svn commit: r248431 - user/attilio/vmcontention/sys/vm
Alan Cox
alc at FreeBSD.org
Sun Mar 17 16:49:38 UTC 2013
Author: alc
Date: Sun Mar 17 16:49:37 2013
New Revision: 248431
URL: http://svnweb.freebsd.org/changeset/base/248431
Log:
The M_ZERO can be eliminated from the uma_zalloc() call in
vm_radix_node_get() with a small change to vm_radix_reclaim_allnodes_int().
This change further reduced the average number of cycles per
vm_page_insert() call from 532 to 519.
Reviewed by: attilio
Sponsored by: EMC / Isilon Storage Division
Modified:
user/attilio/vmcontention/sys/vm/vm_radix.c
Modified: user/attilio/vmcontention/sys/vm/vm_radix.c
==============================================================================
--- user/attilio/vmcontention/sys/vm/vm_radix.c Sun Mar 17 16:31:09 2013 (r248430)
+++ user/attilio/vmcontention/sys/vm/vm_radix.c Sun Mar 17 16:49:37 2013 (r248431)
@@ -110,7 +110,7 @@ vm_radix_node_get(vm_pindex_t owner, uin
{
struct vm_radix_node *rnode;
- rnode = uma_zalloc(vm_radix_node_zone, M_NOWAIT | M_ZERO);
+ rnode = uma_zalloc(vm_radix_node_zone, M_NOWAIT);
/*
* The required number of nodes should already be pre-allocated
@@ -314,6 +314,7 @@ vm_radix_reclaim_allnodes_int(struct vm_
continue;
if (vm_radix_node_page(rnode->rn_child[slot]) == NULL)
vm_radix_reclaim_allnodes_int(rnode->rn_child[slot]);
+ rnode->rn_child[slot] = NULL;
rnode->rn_count--;
}
vm_radix_node_put(rnode);
@@ -327,15 +328,32 @@ static void
vm_radix_node_zone_dtor(void *mem, int size __unused, void *arg __unused)
{
struct vm_radix_node *rnode;
+ int slot;
rnode = mem;
KASSERT(rnode->rn_count == 0,
- ("vm_radix_node_put: Freeing node %p with %d children\n", mem,
+ ("vm_radix_node_put: rnode %p has %d children", rnode,
rnode->rn_count));
+ for (slot = 0; slot < VM_RADIX_COUNT; slot++)
+ KASSERT(rnode->rn_child[slot] == NULL,
+ ("vm_radix_node_put: rnode %p has a child", rnode));
}
#endif
/*
+ * Radix node zone initializer.
+ */
+static int
+vm_radix_node_zone_init(void *mem, int size __unused, int flags __unused)
+{
+ struct vm_radix_node *rnode;
+
+ rnode = mem;
+ memset(rnode->rn_child, 0, sizeof(rnode->rn_child));
+ return (0);
+}
+
+/*
* Pre-allocate intermediate nodes from the UMA slab zone.
*/
static void
@@ -365,7 +383,8 @@ vm_radix_init(void)
#else
NULL,
#endif
- NULL, NULL, VM_RADIX_PAD, UMA_ZONE_VM | UMA_ZONE_NOFREE);
+ vm_radix_node_zone_init, NULL, VM_RADIX_PAD, UMA_ZONE_VM |
+ UMA_ZONE_NOFREE);
}
/*
More information about the svn-src-user
mailing list