Author: alc
Date: Mon Jun 11 21:41:16 2012
New Revision: 236930
URL: http://svn.freebsd.org/changeset/base/236930

Log:
  Avoid unnecessary atomic operations for clearing PGA_WRITEABLE in
  pmap_remove_pages().  This reduces pmap_remove_pages()'s running time by
  4 to 11% in my tests.
  
  MFC after:    1 week

Modified:
  head/sys/amd64/amd64/pmap.c

Modified: head/sys/amd64/amd64/pmap.c
==============================================================================
--- head/sys/amd64/amd64/pmap.c Mon Jun 11 21:40:02 2012        (r236929)
+++ head/sys/amd64/amd64/pmap.c Mon Jun 11 21:41:16 2012        (r236930)
@@ -4197,7 +4197,8 @@ pmap_remove_pages(pmap_t pmap)
                                        TAILQ_REMOVE(&pvh->pv_list, pv, 
pv_list);
                                        if (TAILQ_EMPTY(&pvh->pv_list)) {
                                                for (mt = m; mt < &m[NBPDR / 
PAGE_SIZE]; mt++)
-                                                       if 
(TAILQ_EMPTY(&mt->md.pv_list))
+                                                       if ((mt->aflags & 
PGA_WRITEABLE) != 0 &&
+                                                           
TAILQ_EMPTY(&mt->md.pv_list))
                                                                
vm_page_aflag_clear(mt, PGA_WRITEABLE);
                                        }
                                        mpte = pmap_lookup_pt_page(pmap, 
pv->pv_va);
@@ -4213,7 +4214,8 @@ pmap_remove_pages(pmap_t pmap)
                                } else {
                                        pmap_resident_count_dec(pmap, 1);
                                        TAILQ_REMOVE(&m->md.pv_list, pv, 
pv_list);
-                                       if (TAILQ_EMPTY(&m->md.pv_list) &&
+                                       if ((m->aflags & PGA_WRITEABLE) != 0 &&
+                                           TAILQ_EMPTY(&m->md.pv_list) &&
                                            (m->flags & PG_FICTITIOUS) == 0) {
                                                pvh = 
pa_to_pvh(VM_PAGE_TO_PHYS(m));
                                                if (TAILQ_EMPTY(&pvh->pv_list))
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to