Date: Sat, 27 Apr 2013 16:44:59 +0000 (UTC) From: Alan Cox <alc@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r249986 - head/sys/vm Message-ID: <201304271645.r3RGj08r069331@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: alc Date: Sat Apr 27 16:44:59 2013 New Revision: 249986 URL: http://svnweb.freebsd.org/changeset/base/249986 Log: Avoid some lookup restarts in vm_radix_lookup_{ge,le}(). Sponsored by: EMC / Isilon Storage Division Modified: head/sys/vm/vm_radix.c Modified: head/sys/vm/vm_radix.c ============================================================================== --- head/sys/vm/vm_radix.c Sat Apr 27 14:21:36 2013 (r249985) +++ head/sys/vm/vm_radix.c Sat Apr 27 16:44:59 2013 (r249986) @@ -527,26 +527,26 @@ restart: maplevels[rnode->rn_clev] = TRUE; /* - * If the keys differ before the current bisection node - * the search key might rollback to the earliest - * available bisection node, or to the smaller value - * in the current domain (if the owner is bigger than the + * If the keys differ before the current bisection node, + * then the search key might rollback to the earliest + * available bisection node or to the smallest key + * in the current node (if the owner is bigger than the * search key). * The maplevels array records any node has been seen * at a given level. This aids the search for a valid * bisection node. */ if (vm_radix_keybarr(rnode, index)) { - difflev = vm_radix_keydiff(index, rnode->rn_owner); if (index > rnode->rn_owner) { + difflev = vm_radix_keydiff(index, + rnode->rn_owner); if (vm_radix_addlev(&index, maplevels, difflev) > 0) break; + rnode = vm_radix_getroot(rtree); + goto restart; } else - index = vm_radix_trimkey(rnode->rn_owner, - difflev); - rnode = vm_radix_getroot(rtree); - goto restart; + index = rnode->rn_owner; } slot = vm_radix_slot(index, rnode->rn_clev); child = rnode->rn_child[slot]; @@ -628,26 +628,28 @@ restart: maplevels[rnode->rn_clev] = TRUE; /* - * If the keys differ before the current bisection node - * the search key might rollback to the earliest - * available bisection node, or to the higher value - * in the current domain (if the owner is smaller than the + * If the keys differ before the current bisection node, + * then the search key might rollback to the earliest + * available bisection node or to the largest key + * in the current node (if the owner is smaller than the * search key). * The maplevels array records any node has been seen * at a given level. This aids the search for a valid * bisection node. */ if (vm_radix_keybarr(rnode, index)) { - difflev = vm_radix_keydiff(index, rnode->rn_owner); if (index > rnode->rn_owner) { - index = vm_radix_trimkey(rnode->rn_owner, - difflev); - index |= VM_RADIX_UNITLEVEL(difflev) - 1; - } else if (vm_radix_declev(&index, maplevels, - difflev) > 0) - break; - rnode = vm_radix_getroot(rtree); - goto restart; + index = rnode->rn_owner + VM_RADIX_COUNT * + VM_RADIX_UNITLEVEL(rnode->rn_clev) - 1; + } else { + difflev = vm_radix_keydiff(index, + rnode->rn_owner); + if (vm_radix_declev(&index, maplevels, + difflev) > 0) + break; + rnode = vm_radix_getroot(rtree); + goto restart; + } } slot = vm_radix_slot(index, rnode->rn_clev); child = rnode->rn_child[slot];
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201304271645.r3RGj08r069331>