Subject: Re: mmap() of device
To: Stefan Grefen <grefen@hprc.tandem.com>
From: Jonathan Stone <jonathan@DSG.Stanford.EDU>
List: tech-kern
Date: 08/07/1997 03:57:04
On: Thu, 07 Aug 1997 10:20:17 +0200,
Stefan Grefen <grefen@hprc.tandem.com> writes:
>In message <9708061302.ZM13207@picasso.me.ic.ac.uk> "Robert Black" wrote:
>[..]
>> If you know of any problems I am likely to run into doing this I'd be glad to
>> hear them. The other way of doing it that I can think of is to write a new MI
>> pager to handle this sort of thing in a generalised way (it might be possible
>> to just extend the device pager to add a few extra control hooks).
>
>Why?
>Just invalidate the page(s) and the next page-fault will call mmap again and you
>can supply a different page. I just haven't checked how well the mmap interface
>would handle a invalid page here ....
>There maybe some gotchas there, but i think this will be the most stable and por
>table
>approach. (over revisions and architectures)
no, no, no.
If one takes the approach of writing a d_mmap() entrypoint maps
``normall'' (non-bus) pages into memory, one really only has the
choice of writing a ``pager'' to handle, and refcount, such requests;
or of mapping the pages and never ever ever unmapping them.
The latter works well for non-shared devices like framebuffers,
and fails abysmally for shared devices like network interfaces.
The right answer really is to write a pager that can revoke the mmap()
bindings created by user processes, and re-create them on demand as
the user processes (or a network peer) faults on the pages.
One simply doesn't get enuf info (cgd's reply aside) to do this with a
d_mmap() entrypoint. The basic gotcha is that the VM system calls the
d_mmap() entrypoint once to ensure the page exists and then once more
to actually map it. That guarantees that you cannot do refcounting in
a d_mmap() entrypoint.
Like, ``D'oh''.