svn commit: r207365 - head/sys/vm
Konstantin Belousov
kib at FreeBSD.org
Thu Apr 29 09:59:17 UTC 2010
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);
More information about the svn-src-all
mailing list