From owner-freebsd-arch@FreeBSD.ORG Mon Feb 6 08:59:28 2012 Return-Path: Delivered-To: arch@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 46AE2106566C for ; Mon, 6 Feb 2012 08:59:28 +0000 (UTC) (envelope-from pawel@dawidek.net) Received: from mail.dawidek.net (60.wheelsystems.com [83.12.187.60]) by mx1.freebsd.org (Postfix) with ESMTP id E952A8FC16 for ; Mon, 6 Feb 2012 08:59:27 +0000 (UTC) Received: from localhost (58.wheelsystems.com [83.12.187.58]) by mail.dawidek.net (Postfix) with ESMTPSA id B9A03938; Mon, 6 Feb 2012 09:59:26 +0100 (CET) Date: Mon, 6 Feb 2012 09:58:14 +0100 From: Pawel Jakub Dawidek To: Konstantin Belousov Message-ID: <20120206085814.GB1324@garage.freebsd.pl> References: <20120203193719.GB3283@deviant.kiev.zoral.com.ua> <20120205114345.GE30033@garage.freebsd.pl> <20120205164729.GH3283@deviant.kiev.zoral.com.ua> <20120205192045.GH30033@garage.freebsd.pl> <20120205221259.GL3283@deviant.kiev.zoral.com.ua> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="qlTNgmc+xy1dBmNv" Content-Disposition: inline In-Reply-To: <20120205221259.GL3283@deviant.kiev.zoral.com.ua> X-OS: FreeBSD 10.0-CURRENT amd64 User-Agent: Mutt/1.5.21 (2010-09-15) Cc: arch@freebsd.org Subject: Re: Prefaulting for i/o buffers X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 06 Feb 2012 08:59:28 -0000 --qlTNgmc+xy1dBmNv Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mon, Feb 06, 2012 at 12:12:59AM +0200, Konstantin Belousov wrote: > http://people.freebsd.org/~kib/misc/vm1.9.patch --- a/sys/fs/nfsclient/nfs_clbio.c +++ b/sys/fs/nfsclient/nfs_clbio.c @@ -820,7 +820,10 @@ do_sync: t_uio->uio_segflg =3D UIO_SYSSPACE; t_uio->uio_rw =3D UIO_WRITE; t_uio->uio_td =3D td; - bcopy(uiop->uio_iov->iov_base, t_iov->iov_base, size); + error =3D copyin(uiop->uio_iov->iov_base, + t_iov->iov_base, size); + if (error !=3D 0) + goto err_free; Good catch. It makes me wonder if uiop will always point at userland buffer. What if we eg. AUDIT subsystem writing from within the kernel to a file stored on NFS file system? + if (lock->rl_currdep =3D=3D TAILQ_FIRST(&lock->rl_waiters) && + lock->rl_currdep !=3D NULL) + lock->rl_currdep =3D TAILQ_NEXT(lock->rl_currdep, rl_q_link); + for (entry =3D lock->rl_currdep; entry; Minor style inconsistency. Two lines earlier you compare pointer with NULL, which is nice, but here you treat pointer as boolean. +void +rangelock_unlock(struct rangelock *lock, void *cookie) +{ + struct rl_q_entry *entry; + + MPASS(lock !=3D NULL && cookie !=3D NULL); + + entry =3D cookie; + sleepq_lock(lock); + rangelock_unlock_locked(lock, entry); +} You could drop using addtional 'entry' variable and just pass 'cookie' directly. Although current code is self-explaining what 'cookie' actually is, so I kinda like it as-is. +/* + * Add the lock request to the queue of the pending requests for + * rangelock. Sleeps until the request can be granted. s/request/lock/ ? @@ -216,6 +218,7 @@ thread_fini(void *mem, int size) =20 td =3D (struct thread *)mem; EVENTHANDLER_INVOKE(thread_fini, td); + rlqentry_free(td->td_rlqe); Not sure if it was intended or not, but td_rlqe can be NULL now, so it might be worth checking that. It is not a big deal, as uma_zfree() can hand= le NULL pointers though. --=20 Pawel Jakub Dawidek http://www.wheelsystems.com FreeBSD committer http://www.FreeBSD.org Am I Evil? Yes, I Am! http://tupytaj.pl --qlTNgmc+xy1dBmNv Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.18 (FreeBSD) iEYEARECAAYFAk8vliYACgkQForvXbEpPzTNGgCggyZ6rgH24Bq8z9gzYFDpf+gO PR8An3JeYbNqfilOEamCbLxTRA/D/Z3n =YHIV -----END PGP SIGNATURE----- --qlTNgmc+xy1dBmNv--