2001-12-21 23:01:54

by Michael Marxmeier

[permalink] [raw]
Subject: Question on sys_readahead()

I have a question on sys_readahead and would appreciate
some hint or a pointer.

- When was this call added?

- As far as i understand the code it reads the data into
the page cache. The data is ready sync and there is no
way to do this async and have a notification unless using
a separate thread.

A typical use i could see is preloading some data in the
page cache from a separate thread (eg. for a media player).

BTW: AFAICS the code is off by one if offset/count is not in
PAGE_SIZE chunks?

unsigned long start = offset >> PAGE_CACHE_SHIFT;
unsigned long len = (count + ((long)offset & ~PAGE_CACHE_MASK)) >> PAGE_CACHE_SHIFT;


Thanks
Michael

--
Michael Marxmeier Marxmeier Software AG
E-Mail: [email protected] Besenbruchstrasse 9
Phone : +49 202 2431440 42285 Wuppertal, Germany
Fax : +49 202 2431420 http://www.marxmeier.com/


2001-12-21 23:26:55

by Andrew Morton

[permalink] [raw]
Subject: Re: Question on sys_readahead()

Michael Marxmeier wrote:
>
> I have a question on sys_readahead and would appreciate
> some hint or a pointer.
>
> - When was this call added?

Very late one night, we think :) It was added in linux-2.4.13-pre4.

> - As far as i understand the code it reads the data into
> the page cache. The data is ready sync and there is no
> way to do this async and have a notification unless using
> a separate thread.

It is async. The call will submit the IO and will return immediately.
It could block on things like memory shortage, request queue exhaustion,
but this is unlikely, and pretty much any syscall could block under these
conditions.

You should be able to poll the status of the readhead pages by mmapping
the relevant section of the file and then using mincore() to find out if
the IO has completed.

> A typical use i could see is preloading some data in the
> page cache from a separate thread (eg. for a media player).

Or from the same thread.

> BTW: AFAICS the code is off by one if offset/count is not in
> PAGE_SIZE chunks?
>
> unsigned long start = offset >> PAGE_CACHE_SHIFT;
> unsigned long len = (count + ((long)offset & ~PAGE_CACHE_MASK)) >> PAGE_CACHE_SHIFT;

Looks like it. If offset is zero and count is 4097, it will only read
one page.

-