Author: kib
Date: Thu Apr 29 09:59:16 2010
New Revision: 207365
URL: http://svn.freebsd.org/changeset/base/207365

Log:
  When doing kstack swapin, read as much pages in one run as possible.
  
  Suggested and reviewed by:    alc (previous version)
  Tested by:    pho
  MFC after:    2 weeks

Modified:
  head/sys/vm/vm_glue.c

Modified: head/sys/vm/vm_glue.c
==============================================================================
--- head/sys/vm/vm_glue.c       Thu Apr 29 09:57:25 2010        (r207364)
+++ head/sys/vm/vm_glue.c       Thu Apr 29 09:59:16 2010        (r207365)
@@ -538,23 +538,37 @@ static void
 vm_thread_swapin(struct thread *td)
 {
        vm_object_t ksobj;
-       vm_page_t m, ma[KSTACK_MAX_PAGES];
-       int i, pages, rv;
+       vm_page_t ma[KSTACK_MAX_PAGES];
+       int i, j, k, pages, rv;
 
        pages = td->td_kstack_pages;
        ksobj = td->td_kstack_obj;
        VM_OBJECT_LOCK(ksobj);
-       for (i = 0; i < pages; i++) {
-               m = vm_page_grab(ksobj, i, VM_ALLOC_NORMAL | VM_ALLOC_RETRY |
+       for (i = 0; i < pages; i++)
+               ma[i] = vm_page_grab(ksobj, i, VM_ALLOC_NORMAL | VM_ALLOC_RETRY 
|
                    VM_ALLOC_WIRED);
-               if (m->valid != VM_PAGE_BITS_ALL) {
-                       rv = vm_pager_get_pages(ksobj, &m, 1, 0);
+       for (i = 0; i < pages; i++) {
+               if (ma[i]->valid != VM_PAGE_BITS_ALL) {
+                       KASSERT(ma[i]->oflags & VPO_BUSY,
+                           ("lost busy 1"));
+                       vm_object_pip_add(ksobj, 1);
+                       for (j = i + 1; j < pages; j++) {
+                               KASSERT(ma[j]->valid == VM_PAGE_BITS_ALL ||
+                                   (ma[j]->oflags & VPO_BUSY),
+                                   ("lost busy 2"));
+                               if (ma[j]->valid == VM_PAGE_BITS_ALL)
+                                       break;
+                       }
+                       rv = vm_pager_get_pages(ksobj, ma + i, j - i, 0);
                        if (rv != VM_PAGER_OK)
-                               panic("vm_thread_swapin: cannot get kstack for 
proc: %d", td->td_proc->p_pid);
-                       m = vm_page_lookup(ksobj, i);
-               }
-               ma[i] = m;
-               vm_page_wakeup(m);
+       panic("vm_thread_swapin: cannot get kstack for proc: %d",
+                                   td->td_proc->p_pid);
+                       vm_object_pip_wakeup(ksobj);
+                       for (k = i; k < j; k++)
+                               ma[k] = vm_page_lookup(ksobj, k);
+                       vm_page_wakeup(ma[i]);
+               } else if (ma[i]->oflags & VPO_BUSY)
+                       vm_page_wakeup(ma[i]);
        }
        VM_OBJECT_UNLOCK(ksobj);
        pmap_qenter(td->td_kstack, ma, pages);
_______________________________________________
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