Date: Sat, 19 Dec 1998 15:26:53 -0500 (EST) From: zhihuizhang <bf20761@binghamton.edu> To: hackers <freebsd-hackers@FreeBSD.ORG> Subject: questions/problems with vm_fault() in Stable Message-ID: <Pine.SOL.L3.93.981219152554.6869B-100000@bingsun2>
next in thread | raw e-mail | index | archive | help
Hi, I have some questions about the routine vm_fault() in the file vm_fault.c: (1) The condition (!change_wiring || wired) is always TRUE! Three possible values of change_wiring are FALSE (0), VM_FAULT_CHANGE_WIRING (1), and VM_FAULT_USER_WIRE (2). When its value is VM_FAULT_CHANGE_WIRING or VM_FAULT_USER_WIRE, the wired count of the map entry has already been incremented (see vm_map_user_pageable() and vm_map_pageable()), so vm_map_lookup() will set wired as non-zero. If the argment's value is FALSE, the condition is trivially true. (2) Following the label readrest: in the source code, there are some codes trying to handle read ahead for sequential objects. However, the following statement is wrong: for (tmppindex = first_index - 1; tmppindex >=first_pindex; -- tmppindex) We should probably use firstpindex instead of first_pindex in the comparison (pay attention to the underscore here). However, the for loop will not loop forever, because vm_page_lookup() called within the loop will return NULL anyway. (3) If the pager fails to bring in a page for the very first object in the shadow chain, the page will contain invalid content. If the pager fails to bring in a page for other objects in the shadow chain, the page is freed and invalid. Yet, we still reference to that page (m) later. This means that after the page fault, we could get a page with invalid contents. There is a XXX near the related comment in the source code. (4) The comment in the source code says that the pager can move a page, so we must relookup the page by calling vm_page_lookup(). How could this be the case? Why move the page? (5) The comment in the source code says that we do not COW read-only region on a user wire. "If we do not make this restriction, the bookkeeping would be nearly impossible." Can anyone explain this for me? (6) The comment in the source code says map entries may be pageable. I really doubt this because vm_map_entry_create() always allocates wired down memory for new map entries and enter them into pmap immediately. (7) The comment in the source code says pmap_enter() may cause other faults. I can not see any reason for this to happen. I am just wondering how this important routine in VM system can have these imperfect things (except (4) through (7)). I hope I am wrong. Please help me out with understanding of these points. Any help is appreciated. -------------------------------------------------- | Zhihui Zhang, http://cs.binghamton.edu/~zzhang | | Dept. of Computer Science, SUNY at Binghamton | -------------------------------------------------- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.SOL.L3.93.981219152554.6869B-100000>