Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 30 May 2010 04:44:32 +0000 (UTC)
From:      Alan Cox <alc@FreeBSD.org>
To:        cvs-src-old@freebsd.org
Subject:   cvs commit: src/sys/i386/xen pmap.c
Message-ID:  <201005300444.o4U4iqb4067411@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
alc         2010-05-30 04:44:32 UTC

  FreeBSD src repository

  Modified files:
    sys/i386/xen         pmap.c 
  Log:
  SVN rev 208651 on 2010-05-30 04:44:32Z by alc
  
  Merge various changes from i386/i386/pmap.c:
  
  The remaining, unmerged portions of r175404
    Retire PMAP_DIAGNOSTIC.  Any useful diagnostics that were conditionally
    compiled under PMAP_DIAGNOSTIC are now KASSERT()s.  (Note: The kernel
    option DIAGNOSTIC still disables inlining of certain pmap functions.)
  
    Eliminate dead code from pmap_enter().  This code implemented an assertion.
    On i386, an equivalent check is already implemented.  However, on amd64,
    a small change is required to implement an equivalent check.
  
    Eliminate \n from a nearby panic string.
  
    Use KASSERT() to reimplement pmap_copy()'s two assertions.
  
  Merge portions of r177659
    To date, we have assumed that the TLB will only set the PG_M bit in a
    PTE if that PTE has the PG_RW bit set.  However, this assumption does
    not hold on recent processors from Intel.  For example, consider a PTE
    that has the PG_RW bit set but the PG_M bit clear.  Suppose this PTE
    is cached in the TLB and later the PG_RW bit is cleared in the PTE,
    but the corresponding TLB entry is not (yet) invalidated.
    Historically, upon a write access using this (stale) TLB entry, the
    TLB would observe that the PG_RW bit had been cleared and initiate a
    page fault, aborting the setting of the PG_M bit in the PTE.  Now,
    however, P4- and Core2-family processors will set the PG_M bit before
    observing that the PG_RW bit is clear and initiating a page fault.  In
    other words, the write does not occur but the PG_M bit is still set.
  
    The real impact of this difference is not that great.  Specifically,
    we should no longer assert that any PTE with the PG_M bit set must
    also have the PG_RW bit set, and we should ignore the state of the
    PG_M bit unless the PG_RW bit is set.
  
  r208609
    Defer freeing any page table pages in pmap_remove_all() until after the
    page queues lock is released.  This may reduce the amount of time that the
    page queues lock is held by pmap_remove_all().
  
  r208645
    When I pushed down the page queues lock into pmap_is_modified(), I created
    an ordering dependence: A pmap operation that clears PG_WRITEABLE and calls
    vm_page_dirty() must perform the call first.  Otherwise, pmap_is_modified()
    could return FALSE without acquiring the page queues lock because the page
    is not (currently) writeable, and the caller to pmap_is_modified() might
    believe that the page's dirty field is clear because it has not seen the
    effect of the vm_page_dirty() call.
  
    When I pushed down the page queues lock into pmap_is_modified(), I
    overlooked one place where this ordering dependence is violated:
    pmap_enter().  In a rare situation pmap_enter() can be called to replace a
    dirty mapping to one page with a mapping to another page.  (I say rare
    because replacements generally occur as a result of a copy-on-write fault,
    and so the old page is not dirty.)  This change delays clearing PG_WRITEABLE
    until after vm_page_dirty() has been called.
  
    Fixing the ordering dependency also makes it easy to introduce a small
    optimization: When pmap_enter() used to replace a mapping to one page with a
    mapping to another page, it freed the pv entry for the first mapping and
    later called the pv entry allocator for the new mapping.  Now, pmap_enter()
    attempts to recycle the old pv entry, saving two calls to the pv entry
    allocator.
  
    There is no point in setting PG_WRITEABLE on unmanaged pages, so don't.
    Update a comment to reflect this.
  
    Tidy up the variable declarations at the start of pmap_enter().
  
  Revision  Changes    Path
  1.42      +57 -72    src/sys/i386/xen/pmap.c



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201005300444.o4U4iqb4067411>