Author: alc
Date: Sun May  2 20:46:17 2010
New Revision: 207540
URL: http://svn.freebsd.org/changeset/base/207540

Log:
  Defer the acquisition of the page and page queues locks in
  vm_pageout_object_deactivate_pages().

Modified:
  head/sys/vm/vm_pageout.c

Modified: head/sys/vm/vm_pageout.c
==============================================================================
--- head/sys/vm/vm_pageout.c    Sun May  2 20:24:25 2010        (r207539)
+++ head/sys/vm/vm_pageout.c    Sun May  2 20:46:17 2010        (r207540)
@@ -540,6 +540,7 @@ vm_pageout_object_deactivate_pages(pmap,
        for (object = first_object;; object = backing_object) {
                if (pmap_resident_count(pmap) <= desired)
                        goto unlock_return;
+               VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
                if (object->type == OBJT_PHYS || object->paging_in_progress)
                        goto unlock_return;
 
@@ -551,19 +552,18 @@ vm_pageout_object_deactivate_pages(pmap,
                 */
                p = TAILQ_FIRST(&object->memq);
                while (p != NULL) {
-                       vm_page_lock(p);
-                       vm_page_lock_queues();
-                       if (pmap_resident_count(pmap) <= desired) {
-                               vm_page_unlock_queues();
-                               vm_page_unlock(p);
+                       if (pmap_resident_count(pmap) <= desired)
                                goto unlock_return;
-                       }
                        next = TAILQ_NEXT(p, listq);
+                       if ((p->oflags & VPO_BUSY) != 0 || p->busy != 0) {
+                               p = next;
+                               continue;
+                       }
+                       vm_page_lock(p);
+                       vm_page_lock_queues();
                        cnt.v_pdpages++;
                        if (p->wire_count != 0 ||
                            p->hold_count != 0 ||
-                           p->busy != 0 ||
-                           (p->oflags & VPO_BUSY) ||
                            !pmap_page_exists_quick(pmap, p)) {
                                vm_page_unlock_queues();
                                vm_page_unlock(p);
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to