Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 19 Aug 2002 09:49:33 -0700 (PDT)
From:      Matthew Dillon <dillon@apollo.backplane.com>
To:        "Semen A. Ustimenko" <semenu@FreeBSD.ORG>
Cc:        Bruce Evans <bde@zeta.org.au>, freebsd-current@FreeBSD.ORG, Maxim Konovalov <maxim@FreeBSD.ORG>, Robert Watson <rwatson@FreeBSD.ORG>, <dg@FreeBSD.ORG>
Subject:   Re: sendfile() change (Was: Re: cvs commit: src/sys/kern uipc_syscalls.c)
Message-ID:  <200208191649.g7JGnXIR077528@apollo.backplane.com>
References:   <20020819231230.S678-100000@main.the.net>

next in thread | previous in thread | raw e-mail | index | archive | help

:Hi!
:
:Why can't we get rid of VOP_READ(.. UIO_NOCOPY...) call in sendfile()?
:Me, I can't quite understand what UIO_NOCOPY means... As long as
:sendfile() function already plays around pages, it can use VOP_GETPAGES().
:The following patch looks works for me. Could anybody said if it has any
:benefits or not?
:
:Index: uipc_syscalls.c
:===================================================================
:RCS file: /home/ncvs/src/sys/kern/uipc_syscalls.c,v
:retrieving revision 1.110
:diff -u -r1.110 uipc_syscalls.c
:--- uipc_syscalls.c	20 May 2002 05:41:03 -0000	1.110
:+++ uipc_syscalls.c	13 Aug 2002 17:54:33 -0000
:@@ -1820,10 +1820,7 @@
: 			 */
: 			bsize = vp->v_mount->mnt_stat.f_iosize;
: 			vn_lock(vp, LK_SHARED | LK_NOPAUSE | LK_RETRY, td);
:-			error = vn_rdwr(UIO_READ, vp, NULL, MAXBSIZE,
:-			    trunc_page(off), UIO_NOCOPY, IO_NODELOCKED |
:-			    IO_VMIO | ((MAXBSIZE / bsize) << 16),
:-			    td->td_ucred, NULL, td);
:+			error = VOP_GETPAGES(vp, &pg, PAGE_SIZE, 0, 0);
: 			VOP_UNLOCK(vp, 0, td);
: 			vm_page_flag_clear(pg, PG_ZERO);
: 			vm_page_io_finish(pg);
:
:Bye!

    UIO_NOCOPY tells the filesystem to not bother copying the data
    into the passed buffer but to instead simply load it into the buffer
    cache / VM backing store.

    While this adds buffer cache management overhead, it ought to yield
    far greater performance over doing a VOP_GETPAGES() at this point 
    because the filesystem will be able to do clustered reads and
    read-ahead (potentially a 64K I/O) instead of a 4K I/O.

    An alternative would be to cluster the VM pages in sendfile() and
    call VOP_GETPAGES() on a block of pages instead of just one.  I'm
    guessing that is not being done because it's about 100 lines of code
    to do it right.  It's easier just to call vn_rdwr() and let the
    system do the clustering. 

					-Matt
					Matthew Dillon 
					<dillon@backplane.com>

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200208191649.g7JGnXIR077528>