On Thu, 2009-04-30 at 17:36 -0400, John Baldwin wrote:
> On Tuesday 28 April 2009 7:58:57 pm Julian Elischer wrote:
> > Robert Noland wrote:
> > > On Tue, 2009-04-28 at 16:48 -0500, Kevin Day wrote:
> > >> On Apr 28, 2009, at 3:19 PM, Julian Bangert wrote:
> > >>
> > >>> Hello,
> > >>>
> > >>> I am currently trying to work a bit on the remaining "missing  
> > >>> feature" that NVIDIA requires ( 
> http://wiki.freebsd.org/NvidiaFeatureRequests 
> > >>>   or a back post in this ML) -  the improved mmap system call.
> > 
> > 
> > you might check with jhb (john Baldwin) as I think (from his
> > p4 work) that he may be doing something in this area in p4.
> 
> After some promptings from Robert and his needs for Xorg recently I did start 
> hacking on this again.  However, I haven't tested it yet.  What I have done 
> so far is in //depot/user/jhb/pat/... and it does the following:
> 
> 1) Adds a vm_cache_mode_t.  Each arch defines the valid values for this (I've 
> only done the MD portions of this work for amd64 so far).  Every arch must at 
> least define a value for VM_CACHE_DEFAULT.
> 
> 2) Stores a cache mode in each vm_map_entry struct.  This cache mode is then 
> passed down to a few pmap functions: pmap_object_init_pt(), 
> pmap_enter_object(), and pmap_enter_quick().  Several vm_map routines such as 
> vm_map_insert() and vm_map_find() now take a cache mode to use when adding a 
> new mapping.
> 
> 3) Each VM object stores a cache mode as well (defaults to VM_CACHE_DEFAULT). 
>  
> When a VM_CACHE_DEFAULT mapping is made of an object, the cache mode of the 
> object is used.
> 
> 4) A new VM object type: OBJT_SG.  This object type has its own pager that is 
> sort of like the device pager.  However, instead of invoking d_mmap() to 
> determine the physaddr for a given page, it consults a pre-created 
> scatter/gather list (an ADT from my branch for working on unmapped buffer 
> I/O) to determine the backing physical address for a given virtual address.
> 
> 5) A new callback for device mmap: d_mmap_single().  One of the features of 
> this is that it can return a vm_object_t to be used to satisfy the mmap() 
> request instead of using the device's device pager VM object.
> 
> 6) A new mcache() system call similar to mprotect(), except that it changes 
> the cache mode of an address range rather than the protection.  This may not 
> be all that useful really.
> 
> Given all this, a driver could do the following to map a "thing" as WC in 
> both 
> userland and the kernel:
> 
> 1) When it learns about a "thing" it creates a SG list to describe it.  If 
> the "thing" consists of userland pages, it has to wire the pages first.  The 
> driver can use vm_allocate_pager() to create a OBJT_SG VM object.  It sets 
> the object's cache mode to VM_CACHE_WC (if the arch supports that).
> 
> 2) When userland wants to map the "thing" it does a device mmap() with a 
> proper length and a file offset that is a cookie for the "thing".  The device 
> driver's d_mmap_single() recognizes the magic file offset and returns 
> the "thing"'s VM object.  Since the mapping info is now part of a normal 
> object mapping, it will go away via munmap(), etc.  The driver no longer has 
> to do weird gymnastics to invalidate mappings from its device pager 
> as "transient" mappings are no longer stored in the device pager.
> 
> 3) When the driver wants to map the "thing" into the kernel, it can use 
> vm_map_find() to insert the "thing"'s VM object into kernel map.
> 
> And I think that is all there is to it.  I need to test this somehow to make 
> sure though, and make sure this meets the needs of Robert and Nvidia.

I think this sounds pretty good...  I need to get my perforce foo up to
speed so I can try it out...

robert.

-- 
Robert Noland <rnol...@freebsd.org>
FreeBSD

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to