On Feb 2, 2010, at 4:13 PM, YAMAMOTO Takashi wrote:

>> On Feb 2, 2010, at 10:20 AM, Masao Uebayashi wrote:
>> 
>>> As I briefly mentioned before, I'll need device page to support XIP.  It's
>>> a struct vm_page *, which is actually a magic value which conveys data from
>>> pgo_get() to pmap_enter().
>>> 
>>> When a device page is pmap_enter()'ed, pmap checks if it's a device page or
>>> not, if so, stores a PV into a dedicated vm_physseg for devices.  When a
>>> device page is passed to pmap_page_*() (struct vm_page *-oriented 
>>> functions),
>>> they look for the device vm_physseg, look up a PV header, then look up a PV.
>>> 
>>> I also want to make these minimal PV handling moved to some MI place - 
>>> probably
>>> uvm_page.c.  Now we don't define MI PV header yet, I'll allocate struct
>>> vm_page_md *[] for each XIP-capable device.  This will be put in uvm_page.c
>>> too.
>> 
>> I'd rather change the arguments to pmap_{zero,copy}_page from paddr_t to 
>> struct vm_page * since it's easier to fetch the physical address from the 
>> page than getting the vm_page from the pa.
> 
> recording physical adderess in each vm_page wastes space given that vm_page
> is allocated as an array.
> ie. if we have a way to find the corresponding physseg from a vm_page,
> its corresponding physical address can be calculated.
> so i hesitate to propagate the assumption of fast VM_PAGE_TO_PHYS.

I'd also like to see UVM/pmap use a pfn_t (physical/page frame number) instead 
of paddr_t.  That would allow most ports to return to using 32bit for that 
type.  (for a 4K page, a 32 bit PFN would be usable for up to 16TB of physical 
address space - more than enough for now).


Reply via email to