Date: Fri, 4 Dec 1998 11:34:35 -0800 (PST) From: Matthew Dillon <dillon@apollo.backplane.com> To: Kevin Day <toasty@home.dragondata.com> Cc: hackers@FreeBSD.ORG Subject: Re: Nonblocking page fetching Message-ID: <199812041934.LAA16719@apollo.backplane.com> References: <199812041431.IAA27124@home.dragondata.com>
next in thread | previous in thread | raw e-mail | index | archive | help
:I have an application where I'm streaming large amounts of data from disk,
:and throwing it on the screen. (Playing a movie, essentially). I'm mmapping
:the region that i'm playing, and just start memcpy'ing each frame into the
:renderer's buffer. This is very time critical, so running out of buffered
:data isn't good.
:
:I needed a way to trick the kernel into bringing pages off of disk without
:making my process block waiting for them. Essentially, if I'm playing frame
:10, I'd better already have frames 10-15 in ram, and should start bringing
:frame 16 in, while 10 is playing. (I tried keeping a 4-6 frame buffer)
:...
:
:What would be very nice is a syscall that could tell the vm system that a
:page will be needed shortly, so bring it in as soon as possible. Sort of
:like madvising with WILL_NEED, but a much stronger hint.
The facility already exists in the system. In fact, it even exists in
-stable.
mmap() the region as per normal.
madvise() the region to be MADV_WILLNEED
madvise() the region to be MADV_SEQUENTIAL
The kernel will read-ahead. Now, it will not read-ahead quickly enough
to avoid blocking, but you may be able to tune the kernel specifically
to handle your situation. Take a look at the code in vm/vm_fault.c,
around line 351. Also look at the VM_FAULT_READ_AHEAD and
VM_FAULT_READ_BEHIND defines.
The key to making this work in a full-streaming application is to
issue I/O for N pages ahead but to not fault-in one page in the center
of that group. You then take a page fault when you hit that page, but
since it is in the buffer cache it doesn't block and the kernel takes
the opportunity to issue read-aheads for the next N pages (of which N/2
already probably in the buffer cache). If you make N big enough, you
are all set.
Note, however, that disk I/O bandwidth is much less then memory bandwidth
and probably much less then video-write bandwidth. If you have limited
memory to buffer the data, you *will* block at some point.
:One final note... Does anyone know what effect turning off the bzero on new
:pages would be? Security is not an issue in this system, as it's not
:connected to the net, and all software running on it I wrote. I go through a
:lot of ram, and if I could save some time by not zeroing things, it'd be
:great.
:
:Kevin
We'd have to be careful but I see no reason why pages allocated in order
for I/O to be issued need to be zerod. But I was under the impression
that it already happened this way (pages allocated for I/O sized at least
to a page aren't zereod). In fact, I'm sure of it.
-Matt
Matthew Dillon Engineering, HiWay Technologies, Inc. & BEST Internet
Communications & God knows what else.
<dillon@backplane.com> (Please include original email in any response)
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199812041934.LAA16719>
