Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 Dec 1998 02:11:18 -0800 (PST)
From:      Matthew Dillon <dillon@apollo.backplane.com>
To:        Julian Elischer <julian@whistle.com>
Cc:        zhihuizhang <bf20761@binghamton.edu>, hackers <freebsd-hackers@FreeBSD.ORG>
Subject:   Re: questions/problems with vm_fault() in Stable
Message-ID:  <199812211011.CAA42292@apollo.backplane.com>
References:   <Pine.BSF.3.95.981220152125.8357N-100000@current1.whistle.com>

next in thread | previous in thread | raw e-mail | index | archive | help
:very interesting..
:there is a lack of people who understand the VM system very well at this
:time so it may take a while for people to get back to you.. but.. I'm sure
:I'm not the only person lokking at your suggestions...
: (you are talking about -current, right?)
:
:julian
:
:On Sat, 19 Dec 1998, zhihuizhang wrote:
:
:> 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.

    What line and RCS rev are you looking at here?  I don't see this
    anywhere in either -stable or -current in vm_fault.c
 
:> (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.

    This was fixed in -current.  It does NOT appear to be fixed in -stable.
    Hmm.  The entire read-ahead codeblock is disabled due to this error,
    but since I am not running a -stable system any more I can't just commit
    the change because it will bring in a whole block of code that's never
    been run before.  Maybe one of the other guys can.  It isn't in a critical
    code section for -stable.. that is, the bug only makes the code a little
    less efficient so I'm loath to actually make the change in -stable myself.
    Maybe if DG or Luoqi or someone similar reviews it for -stable.
 
:> (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.

    What line?  Line 483 of vm_fault.c (from -current) ?:

     /*
      * XXX - we cannot just fall out at this
      * point, m has been freed and is invalid!
      */

    This ?   Could you be a bit more specific about the problem, like give
    line numbers and such?  The code does look somewhat odd but I don't 
    see where m is reused.
 
:> (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?

    Line?   and file version too... I don't think you are looking at a recent
    version of vm_fault.c 
 
:> (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?
 
    I think this pertains to the fact that a COW page is made read+write, and
    trying to do it and then leave a page read+only confuses other parts of
    the code.  This isn't a bug or anything.

:> (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.

    Most of the pmap system operates with throw-away pages and page table
    directories.  If a piece of code sleeps anywhere, the pagemap may not
    still exist after it wakes up again.  I think that is what this comment
    is refering to.
 
:> (7) The comment in the source code says pmap_enter() may cause other faults.
:> I can not see any reason for this to happen.

    pmap_enter() may have to allocate a page table page (see i386/i386/pmap.c).
    If the allocation fails, the process will block there until memory is 
    available.

						-Matt
 
:> 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
:> 
:
:
:To Unsubscribe: send mail to majordomo@FreeBSD.org
:with "unsubscribe freebsd-hackers" in the body of the message
:

    Matthew Dillon  Engineering, HiWay Technologies, Inc. & BEST Internet 
                    Communications & God knows what else.
    <dillon@backplane.com> (Please include original email in any response)    

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?199812211011.CAA42292>