diff options
author | markj <markj@FreeBSD.org> | 2017-09-17 15:45:39 +0000 |
---|---|---|
committer | Luiz Souza <luiz@netgate.com> | 2018-02-21 15:13:54 -0300 |
commit | 62c6e695b6f7a2c5e540ea38aa90547f8b3923e8 (patch) | |
tree | 488f5917760714f28dac56faccc68e6bbd477dee /sys/kern/kern_sendfile.c | |
parent | ff6af41082b99173f1f3faea0b7f58d1f70384e9 (diff) | |
download | FreeBSD-src-62c6e695b6f7a2c5e540ea38aa90547f8b3923e8.zip FreeBSD-src-62c6e695b6f7a2c5e540ea38aa90547f8b3923e8.tar.gz |
MFC r322405, r322406:
Modify vm_page_grab_pages() to handle VM_ALLOC_NOWAIT, use it in
sendfile_swapin().
(cherry picked from commit 00ffd58e267b0466241a684db7dbfd7f2fecbf80)
Diffstat (limited to 'sys/kern/kern_sendfile.c')
-rw-r--r-- | sys/kern/kern_sendfile.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/sys/kern/kern_sendfile.c b/sys/kern/kern_sendfile.c index 973e476..aafa697 100644 --- a/sys/kern/kern_sendfile.c +++ b/sys/kern/kern_sendfile.c @@ -308,7 +308,7 @@ sendfile_swapin(vm_object_t obj, struct sf_io *sfio, off_t off, off_t len, int npages, int rhpages, int flags) { vm_page_t *pa = sfio->pa; - int nios; + int grabbed, nios; nios = 0; flags = (flags & SF_NODISKIO) ? VM_ALLOC_NOWAIT : 0; @@ -318,14 +318,14 @@ sendfile_swapin(vm_object_t obj, struct sf_io *sfio, off_t off, off_t len, * only required pages. Readahead pages are dealt with later. */ VM_OBJECT_WLOCK(obj); - for (int i = 0; i < npages; i++) { - pa[i] = vm_page_grab(obj, OFF_TO_IDX(vmoff(i, off)), - VM_ALLOC_WIRED | VM_ALLOC_NORMAL | flags); - if (pa[i] == NULL) { - npages = i; - rhpages = 0; - break; - } + + grabbed = vm_page_grab_pages(obj, OFF_TO_IDX(off), + VM_ALLOC_NORMAL | VM_ALLOC_WIRED | flags, pa, npages); + if (grabbed < npages) { + for (int i = grabbed; i < npages; i++) + pa[i] = NULL; + npages = grabbed; + rhpages = 0; } for (int i = 0; i < npages;) { |