From owner-svn-src-projects@FreeBSD.ORG Wed Nov 19 06:13:56 2014 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 8BFEA222; Wed, 19 Nov 2014 06:13:56 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 6D029F3; Wed, 19 Nov 2014 06:13:56 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id sAJ6Du4G023515; Wed, 19 Nov 2014 06:13:56 GMT (envelope-from glebius@FreeBSD.org) Received: (from glebius@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id sAJ6DuCS023513; Wed, 19 Nov 2014 06:13:56 GMT (envelope-from glebius@FreeBSD.org) Message-Id: <201411190613.sAJ6DuCS023513@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: glebius set sender to glebius@FreeBSD.org using -f From: Gleb Smirnoff Date: Wed, 19 Nov 2014 06:13:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r274688 - projects/sendfile/sys/vm X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 Nov 2014 06:13:56 -0000 Author: glebius Date: Wed Nov 19 06:13:55 2014 New Revision: 274688 URL: https://svnweb.freebsd.org/changeset/base/274688 Log: Provide emulation of asynchronous operation in swap_pager.c itself, not in the vm_pager.h inliner. Suggested by: kib Sponsored by: Netflix Sponsored by: Nginx, Inc. Modified: projects/sendfile/sys/vm/swap_pager.c projects/sendfile/sys/vm/vm_pager.h Modified: projects/sendfile/sys/vm/swap_pager.c ============================================================================== --- projects/sendfile/sys/vm/swap_pager.c Wed Nov 19 05:58:34 2014 (r274687) +++ projects/sendfile/sys/vm/swap_pager.c Wed Nov 19 06:13:55 2014 (r274688) @@ -361,6 +361,8 @@ static vm_object_t vm_prot_t prot, vm_ooffset_t offset, struct ucred *); static void swap_pager_dealloc(vm_object_t object); static int swap_pager_getpages(vm_object_t, vm_page_t *, int, int); +static int swap_pager_getpages_async(vm_object_t, vm_page_t *, int, int, + void(*)(void *, vm_page_t *, int, int), void *); static void swap_pager_putpages(vm_object_t, vm_page_t *, int, boolean_t, int *); static boolean_t swap_pager_haspage(vm_object_t object, vm_pindex_t pindex, int *before, int *after); @@ -373,6 +375,7 @@ struct pagerops swappagerops = { .pgo_alloc = swap_pager_alloc, /* allocate an OBJT_SWAP object */ .pgo_dealloc = swap_pager_dealloc, /* deallocate an OBJT_SWAP object */ .pgo_getpages = swap_pager_getpages, /* pagein */ + .pgo_getpages_async = swap_pager_getpages_async, /* pagein (async) */ .pgo_putpages = swap_pager_putpages, /* pageout */ .pgo_haspage = swap_pager_haspage, /* get backing store status for page */ .pgo_pageunswapped = swap_pager_unswapped, /* remove swap related to page */ @@ -1257,6 +1260,26 @@ swap_pager_getpages(vm_object_t object, } /* + * swap_pager_getpages_async(): + * + * Right now this is emulation of asynchronous operation on top of + * swap_pager_getpages(). + */ +static int +swap_pager_getpages_async(vm_object_t object, vm_page_t *m, int count, + int reqpage, void(*iodone)(void *, vm_page_t *, int, int), void *arg) +{ + int r; + + r = swap_pager_getpages(object, m, count, reqpage); + VM_OBJECT_WUNLOCK(object); + (iodone)(arg, m, count, r); + VM_OBJECT_WLOCK(object); + + return (r); +} + +/* * swap_pager_putpages: * * Assign swap (if necessary) and initiate I/O on the specified pages. Modified: projects/sendfile/sys/vm/vm_pager.h ============================================================================== --- projects/sendfile/sys/vm/vm_pager.h Wed Nov 19 05:58:34 2014 (r274687) +++ projects/sendfile/sys/vm/vm_pager.h Wed Nov 19 06:13:55 2014 (r274688) @@ -145,17 +145,8 @@ vm_pager_get_pages_async(vm_object_t obj int r; VM_OBJECT_ASSERT_WLOCKED(object); - - if (*pagertab[object->type]->pgo_getpages_async == NULL) { - /* Emulate async operation. */ - r = vm_pager_get_pages(object, m, count, reqpage); - VM_OBJECT_WUNLOCK(object); - (iodone)(arg, m, count, r); - VM_OBJECT_WLOCK(object); - } else - r = (*pagertab[object->type]->pgo_getpages_async)(object, m, - count, reqpage, iodone, arg); - + r = (*pagertab[object->type]->pgo_getpages_async)(object, m, count, + reqpage, iodone, arg); return (r); }