From 1e9cb4cb4dde11bfc114987938b979a90a80bacb Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Tue, 8 Mar 2016 20:40:34 -0800 Subject: [PATCH 4/5] Fix laundry queue handling with multiple domains. Currently, the laundry thread operates only on the laundry queues in domain 0. Therefore we should always queue dirty pages there. --- sys/vm/vm_page.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index aaffee5..bb77f0f 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -2743,7 +2743,10 @@ struct vm_pagequeue * vm_page_pagequeue(vm_page_t m) { - return (&vm_phys_domain(m)->vmd_pagequeues[m->queue]); + if (vm_page_in_laundry(m)) + return (&vm_dom[0].vmd_pagequeues[m->queue]); + else + return (&vm_phys_domain(m)->vmd_pagequeues[m->queue]); } /* @@ -2805,7 +2808,10 @@ vm_page_enqueue(uint8_t queue, vm_page_t m) KASSERT(queue < PQ_COUNT, ("vm_page_enqueue: invalid queue %u request for page %p", queue, m)); - pq = &vm_phys_domain(m)->vmd_pagequeues[queue]; + if (queue == PQ_LAUNDRY || queue == PQ_STASIS) + pq = &vm_dom[0].vmd_pagequeues[queue]; + else + pq = &vm_phys_domain(m)->vmd_pagequeues[queue]; vm_pagequeue_lock(pq); m->queue = queue; TAILQ_INSERT_TAIL(&pq->pq_pl, m, plinks.q); @@ -3187,7 +3193,9 @@ vm_page_deactivate_noreuse(vm_page_t m) } /* - * XXX + * vm_page_launder + * + * Put a page in the laundry. */ void vm_page_launder(vm_page_t m) -- 2.8.1