hi, > I take silence as "no objection".
the silence in this case means was-busy-for-other-things-and-forgot. sorry. >> I have no real code for this big picture at this moment. Making >> vm_physseg available as reference is the first step. This only >> changes uvm_page_physload() to return a pointer: >> >> -void uvm_page_physload(); >> +void *uvm_page_physload(); >> >> But this makes XIP pager MUCH cleaner. The reason has been explained >> many times. because the separate uvm_page_physload_device is no longer necessary, you mean? i have no problem with the step. >> Making fault handlers and pagers to use vm_physseg * + off_t is >> the next step, and I don't intend to work on it now. I just want >> to explain the big picture. >> >> > >> > >> >> > >> Keep vm_physseg * + off_t array on stack. If UVM objects uses >> > >> vm_page (e.g. vnode), its pager looks up vm_page -> vm_physseg * >> > >> + off_t *once* and cache it on stack. >> > >> > do you mean something like this? >> > struct { >> > vm_physseg *hoge; >> > off_t fuga; >> > } foo [16]; >> >> Yes. >> >> Or cache vm_page * with it, like: >> >> struct vm_id { >> vm_physseg *seg; >> off_t off; >> vm_page *pg; >> }; >> >> uvm_fault() >> { >> vm_id pgs[]; >> : >> } >> >> Vnode pager (genfs_getpages) takes vm_page's by looking up >> vnode::v_uobj's list, or uvn_findpages(). >> >> When it returns back to fault handler, we have to lookup vm_physseg >> for each page. Then fill the "seg" slot above (assuming we'll >> remove vm_page::phys_addr soon). >> >> Fault handler calls per-vm_page operations iff vm_page slot is filled. >> XIP pages are not pageq'ed. pgo_get returns either seg+off or pg for each vm_id slots? >> XIP pages don't need vm_page, but >> cached because it's vnode. can you explain this sentence? >> (Just in case, have you read my paper?) which paper? i guess no. YAMAMOTO Takashi