Index: i386/i386/pmap.c =================================================================== RCS file: /home/ncvs/src/sys/i386/i386/pmap.c,v retrieving revision 1.322 diff -u -r1.322 pmap.c --- i386/i386/pmap.c 29 Apr 2002 07:43:11 -0000 1.322 +++ i386/i386/pmap.c 10 May 2002 18:45:05 -0000 @@ -181,6 +181,8 @@ static pt_entry_t *msgbufmap; struct msgbuf *msgbufp = 0; +static struct mtx cmap_lock; + /* * Crashdump maps. */ @@ -460,6 +462,8 @@ int i; int initial_pvs; + mtx_init(&cmap_lock, "cmap lock", NULL, MTX_DEF); + /* * object for kernel page table pages */ @@ -600,10 +604,13 @@ get_ptbase(pmap) pmap_t pmap; { - pd_entry_t frame = pmap->pm_pdir[PTDPTDI] & PG_FRAME; + pd_entry_t frame; /* are we current address space or kernel? */ - if (pmap == kernel_pmap || frame == (PTDpde & PG_FRAME)) + if (pmap == kernel_pmap) + return PTmap; + frame = pmap->pm_pdir[PTDPTDI] & PG_FRAME; + if (frame == (PTDpde & PG_FRAME)) return PTmap; /* otherwise, we are alternate address space */ if (frame != (APTDpde & PG_FRAME)) { @@ -2816,6 +2823,7 @@ { vm_offset_t phys = VM_PAGE_TO_PHYS(m); + mtx_lock(&cmap_lock); if (*CMAP2) panic("pmap_zero_page: CMAP2 busy"); @@ -2829,6 +2837,7 @@ #endif bzero(CADDR2, PAGE_SIZE); *CMAP2 = 0; + mtx_unlock(&cmap_lock); } /* @@ -2842,6 +2851,7 @@ { vm_offset_t phys = VM_PAGE_TO_PHYS(m); + mtx_lock(&cmap_lock); if (*CMAP2) panic("pmap_zero_page: CMAP2 busy"); @@ -2855,6 +2865,7 @@ #endif bzero((char *)CADDR2 + off, size); *CMAP2 = 0; + mtx_unlock(&cmap_lock); } /* @@ -2867,6 +2878,7 @@ pmap_copy_page(vm_page_t src, vm_page_t dst) { + mtx_lock(&cmap_lock); if (*CMAP1) panic("pmap_copy_page: CMAP1 busy"); if (*CMAP2) @@ -2885,6 +2897,7 @@ *CMAP1 = 0; *CMAP2 = 0; + mtx_unlock(&cmap_lock); } Index: vm/vm_zeroidle.c =================================================================== RCS file: /home/ncvs/src/sys/vm/vm_zeroidle.c,v retrieving revision 1.8 diff -u -r1.8 vm_zeroidle.c --- vm/vm_zeroidle.c 15 Apr 2002 16:00:03 -0000 1.8 +++ vm/vm_zeroidle.c 10 May 2002 18:45:05 -0000 @@ -30,7 +30,7 @@ SYSCTL_INT(_vm_stats_misc, OID_AUTO, cnt_prezero, CTLFLAG_RD, &cnt_prezero, 0, ""); -static int idlezero_enable = 0; +static int idlezero_enable = 1; SYSCTL_INT(_vm, OID_AUTO, idlezero_enable, CTLFLAG_RW, &idlezero_enable, 0, ""); TUNABLE_INT("vm.idlezero_enable", &idlezero_enable); @@ -81,14 +81,13 @@ vm_page_queues[m->queue].lcnt--; TAILQ_REMOVE(&vm_page_queues[m->queue].pl, m, pageq); m->queue = PQ_NONE; - /* maybe drop out of Giant here */ + mtx_unlock(&Giant); pmap_zero_page(m); - /* and return here */ + mtx_lock(&Giant); vm_page_flag_set(m, PG_ZERO); m->queue = PQ_FREE + m->pc; vm_page_queues[m->queue].lcnt++; - TAILQ_INSERT_TAIL(&vm_page_queues[m->queue].pl, m, - pageq); + TAILQ_INSERT_TAIL(&vm_page_queues[m->queue].pl, m, pageq); ++vm_page_zero_count; ++cnt_prezero; if (vm_page_zero_count >= ZIDLE_HI(cnt.v_free_count)) @@ -105,7 +104,7 @@ vm_page_zero_idle_wakeup(void) { - if (vm_page_zero_check()) + if (idlezero_enable && vm_page_zero_check()) wakeup(&zero_state); } @@ -125,7 +124,7 @@ for (;;) { if (vm_page_zero_check()) { pages += vm_page_zero_idle(); - if (pages > idlezero_maxrun) { + if (pages > idlezero_maxrun || procrunnable()) { mtx_lock_spin(&sched_lock); setrunqueue(td); td->td_proc->p_stats->p_ru.ru_nvcsw++;