Date: Wed, 19 Nov 2014 06:13:56 +0000 (UTC) From: Gleb Smirnoff <glebius@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r274688 - projects/sendfile/sys/vm Message-ID: <201411190613.sAJ6DuCS023513@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201411190613.sAJ6DuCS023513>