Date: Tue, 24 Dec 2013 09:19:49 +0000 (UTC) From: Gleb Smirnoff <glebius@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r259819 - projects/sendfile/sys/kern Message-ID: <201312240919.rBO9Jn9q008164@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: glebius Date: Tue Dec 24 09:19:49 2013 New Revision: 259819 URL: http://svnweb.freebsd.org/changeset/base/259819 Log: Inline functions are more readable. Modified: projects/sendfile/sys/kern/uipc_syscalls.c Modified: projects/sendfile/sys/kern/uipc_syscalls.c ============================================================================== --- projects/sendfile/sys/kern/uipc_syscalls.c Tue Dec 24 08:49:55 2013 (r259818) +++ projects/sendfile/sys/kern/uipc_syscalls.c Tue Dec 24 09:19:49 2013 (r259819) @@ -2089,44 +2089,62 @@ freebsd4_sendfile(struct thread *td, str } #endif /* COMPAT_FREEBSD4 */ + /* + * How much data to put into page i of n. + * Only first and last pages are special. + */ +static inline off_t +xfsize(int i, int n, off_t off, off_t len) +{ + + if (i == 0) + return (omin(PAGE_SIZE - (off & PAGE_MASK), len)); + + if (i == n - 1) + return ((off + len) & PAGE_MASK); + + return (PAGE_SIZE); +} + +/* + * Offset within object for i page. + */ +static inline vm_offset_t +vmoff(int i, off_t off) +{ + + if (i == 0) + return ((vm_offset_t)off); + + return (trunc_page(off + i * PAGE_SIZE)); +} + static void sendfile_swapin(vm_object_t obj, vm_page_t *pa, int npages, off_t off, off_t len) { int rv; - /* - * Macros to calculate size and offset for given (i) page, - * starting from offset (o) with maximum length of (l). - * Used in this function and vn_sendfile(). - */ -#define XFSIZE(i, o, l) ((i) == 0 ? \ - omin(PAGE_SIZE - ((o) & PAGE_MASK), (l)) : \ - ((i) == (npages - 1) ? \ - (((o) + (l)) & PAGE_MASK) : PAGE_SIZE)) -#define OFFSET(i, o) (vm_offset_t)((i) == 0 ? (o) : \ - trunc_page((o) + i * PAGE_SIZE)) - VM_OBJECT_WLOCK(obj); for (int i = 0; i < npages; i++) - pa[i] = vm_page_grab(obj, OFF_TO_IDX(OFFSET(i, off)), + pa[i] = vm_page_grab(obj, OFF_TO_IDX(vmoff(i, off)), VM_ALLOC_WIRED | VM_ALLOC_NORMAL); for (int i = 0; i < npages; i++) { int j, a; - if (vm_page_is_valid(pa[i], OFFSET(i, off) & PAGE_MASK, - XFSIZE(i, off, len))) { + if (vm_page_is_valid(pa[i], vmoff(i, off) & PAGE_MASK, + xfsize(i, npages, off, len))) { vm_page_xunbusy(pa[i]); continue; } for (j = i + 1; j < npages; j++) - if (vm_page_is_valid(pa[j], OFFSET(j, off) & PAGE_MASK, - XFSIZE(j, off, len))) + if (vm_page_is_valid(pa[j], vmoff(j, off) & PAGE_MASK, + xfsize(j, npages, off, len))) break; - while (!vm_pager_has_page(obj, OFF_TO_IDX(OFFSET(i, off)), + while (!vm_pager_has_page(obj, OFF_TO_IDX(vmoff(i, off)), NULL, &a) && i < j) { pmap_zero_page(pa[i]); pa[i]->valid = VM_PAGE_BITS_ALL; @@ -2147,17 +2165,17 @@ sendfile_swapin(vm_object_t obj, vm_page i += a; for (j = i - a; a > 0 && j < npages; a--, j++) KASSERT(pa[j] == vm_page_lookup(obj, - OFF_TO_IDX(OFFSET(j, off))), + OFF_TO_IDX(vmoff(j, off))), ("pa[j] %p lookup %p\n", pa[j], - vm_page_lookup(obj, OFF_TO_IDX(OFFSET(j, off))))); + vm_page_lookup(obj, OFF_TO_IDX(vmoff(j, off))))); } for (int i = 0; i < npages; i++) KASSERT((pa[i]->wire_count > 0 && vm_page_is_valid(pa[i], - OFFSET(i, off) & PAGE_MASK, XFSIZE(i, off, len))), + vmoff(i, off) & PAGE_MASK, xfsize(i, npages, off, len))), ("wrong page %p state off 0x%jx len 0x%jx", - pa[i], (uintmax_t)OFFSET(i, off), - (uintmax_t)XFSIZE(i, off, len))); + pa[i], (uintmax_t)vmoff(i, off), + (uintmax_t)xfsize(i, npages, off, len))); VM_OBJECT_WUNLOCK(obj); } @@ -2513,8 +2531,8 @@ retry_space: break; } m0->m_data = (char *)sf_buf_kva(sf) + - (OFFSET(i, off) & PAGE_MASK); - m0->m_len = XFSIZE(i, off, space); + (vmoff(i, off) & PAGE_MASK); + m0->m_len = xfsize(i, npages, off, space); /* Append to mbuf chain. */ if (mtail != NULL)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201312240919.rBO9Jn9q008164>