Date: Sun, 17 Mar 2013 16:49:38 +0000 (UTC) From: Alan Cox <alc@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r248431 - user/attilio/vmcontention/sys/vm Message-ID: <201303171649.r2HGnc0I070869@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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); } /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201303171649.r2HGnc0I070869>