From owner-svn-src-user@FreeBSD.ORG Sun Mar 17 16:23:19 2013 Return-Path: <owner-svn-src-user@FreeBSD.ORG> Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id E87DE6BE; Sun, 17 Mar 2013 16:23:19 +0000 (UTC) (envelope-from alc@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id C37738C5; Sun, 17 Mar 2013 16:23:19 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.6/8.14.6) with ESMTP id r2HGNJIj063682; Sun, 17 Mar 2013 16:23:19 GMT (envelope-from alc@svn.freebsd.org) Received: (from alc@localhost) by svn.freebsd.org (8.14.6/8.14.5/Submit) id r2HGNJHc063681; Sun, 17 Mar 2013 16:23:19 GMT (envelope-from alc@svn.freebsd.org) Message-Id: <201303171623.r2HGNJHc063681@svn.freebsd.org> From: Alan Cox <alc@FreeBSD.org> Date: Sun, 17 Mar 2013 16:23:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r248429 - user/attilio/vmcontention/sys/vm X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" <svn-src-user.freebsd.org> List-Unsubscribe: <http://lists.freebsd.org/mailman/options/svn-src-user>, <mailto:svn-src-user-request@freebsd.org?subject=unsubscribe> List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user> List-Post: <mailto:svn-src-user@freebsd.org> List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help> List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>, <mailto:svn-src-user-request@freebsd.org?subject=subscribe> X-List-Received-Date: Sun, 17 Mar 2013 16:23:20 -0000 Author: alc Date: Sun Mar 17 16:23:19 2013 New Revision: 248429 URL: http://svnweb.freebsd.org/changeset/base/248429 Log: Most allocation of pages to objects proceeds from lower to higher indices. Consequentially, vm_page_insert() should use vm_radix_lookup_le() instead of vm_radix_lookup_ge(). Here's why. In the expected case, vm_radix_lookup_le() will quickly find a page less than the specified key at the same radix node. In contrast, vm_radix_lookup_ge() is expected to return NULL, but to do that it must examine every slot in the radix tree that is greater than the key. Prior to this change, the average cost of a vm_page_insert() call on my test machine was 992 cycles. After this change, the average cost is only 532 cycles, a reduction of 46%. Reviewed by: attilio Sponsored by: EMC / Isilon Storage Division Modified: user/attilio/vmcontention/sys/vm/vm_page.c Modified: user/attilio/vmcontention/sys/vm/vm_page.c ============================================================================== --- user/attilio/vmcontention/sys/vm/vm_page.c Sun Mar 17 16:06:03 2013 (r248428) +++ user/attilio/vmcontention/sys/vm/vm_page.c Sun Mar 17 16:23:19 2013 (r248429) @@ -827,14 +827,14 @@ vm_page_insert(vm_page_t m, vm_object_t if (object->resident_page_count == 0) { TAILQ_INSERT_TAIL(&object->memq, m, listq); } else { - neighbor = vm_radix_lookup_ge(&object->rtree, pindex); + neighbor = vm_radix_lookup_le(&object->rtree, pindex); if (neighbor != NULL) { - KASSERT(pindex < neighbor->pindex, - ("vm_page_insert: offset %ju not minor than %ju", + KASSERT(pindex > neighbor->pindex, + ("vm_page_insert: offset %ju less than %ju", (uintmax_t)pindex, (uintmax_t)neighbor->pindex)); - TAILQ_INSERT_BEFORE(neighbor, m, listq); + TAILQ_INSERT_AFTER(&object->memq, neighbor, m, listq); } else - TAILQ_INSERT_TAIL(&object->memq, m, listq); + TAILQ_INSERT_HEAD(&object->memq, m, listq); } vm_radix_insert(&object->rtree, m);