Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 6 Feb 2012 00:12:59 +0200
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Pawel Jakub Dawidek <pjd@freebsd.org>
Cc:        arch@freebsd.org
Subject:   Re: Prefaulting for i/o buffers
Message-ID:  <20120205221259.GL3283@deviant.kiev.zoral.com.ua>
In-Reply-To: <20120205192045.GH30033@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>

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

--rYkcoROieYsUh8uu
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Sun, Feb 05, 2012 at 08:20:45PM +0100, Pawel Jakub Dawidek wrote:
> On Sun, Feb 05, 2012 at 06:47:29PM +0200, Konstantin Belousov wrote:
> > On Sun, Feb 05, 2012 at 12:43:46PM +0100, Pawel Jakub Dawidek wrote:
> > > @@ -199,6 +200,7 @@ thread_init(void *mem, int size, int flags)
> > > =20
> > >  	td->td_sleepqueue =3D sleepq_alloc();
> > >  	td->td_turnstile =3D turnstile_alloc();
> > > +	td->td_rlqe =3D rlqentry_alloc();
> > >=20
> > > What is the purpose of td_rlqe field? From what I see thread can lock
> > > more than one range. Could you elaborate on that as well?
> > td_rlqe is a cached rangelock entry used for the typical case of the
> > thread not doing recursive i/o. In this case, it is possible to avoid
> > memory allocation on the i/o hot path by using entry allocated during
> > thread creation. Since thread creation already allocates many chunks
> > of memory, and typical thread performs much more i/o then it suffers
> > creation, this shorten the i/o calculation path.
>=20
> I see. I'd be in favour of dropping entry allocation on thread creation.
> This would make the allocation lazy and it will be done on the first I/O
> only. What do you think? Thread creation should be fast, so if we can
> avoid adding up, I would go that route.
I think this is negligible change in the speed of much rare operation
(thread creation) comparing with a hit on the first time i/o, but I just
did it in a way you suggested.

>=20
> > > This is a bit hard to understand immediately. Maybe something like the
> > > following is a bit more readable (I assume this goto could happen only
> > > once):
> > >=20
> > > 		len =3D MIN(uio->uio_iov->iov_len, io_hold_cnt * PAGE_SIZE);
> > > 		addr =3D (vm_offset_t)uio->uio_iov->iov_base;
> > > 		end =3D round_page(addr + len);
> > > 		if (howmany(end - trunc_page(addr), PAGE_SIZE) > io_hold_cnt) {
> > > 			len -=3D PAGE_SIZE;
> > > 			end =3D round_page(addr + len);
> > > 		}
> > I think it can happen twice, if both start and len are perfectly mis-al=
igned.
>=20
> I see. That make sense. It would be nice to add comment there, as it
> wasn't immediately obvious (at least for me) what's going on.
>=20
> Another way to simplify this piece of code would be to either make ma[]
> array of 'io_hold_cnt + 2' elements or set 'len' to '(io_hold_cnt - 2) *
> PAGE_SIZE'.  Short comment describing why we add or subtract 2 would be
> of course welcome.
I am not sure that +2 would be improvement in readability, but indeed it
removes some code. I implemented this and added a comment.

>=20
> Just curious, why io_hold_cnt is 'static const int' instead of define?
I want to change it into a sysctl or tunable one day.

http://people.freebsd.org/~kib/misc/vm1.9.patch

--rYkcoROieYsUh8uu
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (FreeBSD)

iEYEARECAAYFAk8u/usACgkQC3+MBN1Mb4ghkwCgiGZND59lcqCwmTNWk2ztHADq
w1wAnjUFE/i1HhxtS2Z7DxSQJOhec4hN
=FtVf
-----END PGP SIGNATURE-----

--rYkcoROieYsUh8uu--



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