Date: Sat, 17 Oct 2015 18:35:40 +0000 (UTC) From: Alan Cox <alc@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r289463 - user/alc/PQ_LAUNDRY/sys/vm Message-ID: <201510171835.t9HIZei2041800@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: alc Date: Sat Oct 17 18:35:40 2015 New Revision: 289463 URL: https://svnweb.freebsd.org/changeset/base/289463 Log: Create a permanent marker for the laundry queue. Rename maxlaunder; there is nothing "max" about it. Modified: user/alc/PQ_LAUNDRY/sys/vm/vm_page.h user/alc/PQ_LAUNDRY/sys/vm/vm_pageout.c Modified: user/alc/PQ_LAUNDRY/sys/vm/vm_page.h ============================================================================== --- user/alc/PQ_LAUNDRY/sys/vm/vm_page.h Sat Oct 17 18:22:18 2015 (r289462) +++ user/alc/PQ_LAUNDRY/sys/vm/vm_page.h Sat Oct 17 18:35:40 2015 (r289463) @@ -229,6 +229,7 @@ struct vm_domain { boolean_t vmd_oom; int vmd_pass; /* local pagedaemon pass */ int vmd_last_active_scan; + struct vm_page vmd_laundry_marker; struct vm_page vmd_marker; /* marker for pagedaemon private use */ }; Modified: user/alc/PQ_LAUNDRY/sys/vm/vm_pageout.c ============================================================================== --- user/alc/PQ_LAUNDRY/sys/vm/vm_pageout.c Sat Oct 17 18:22:18 2015 (r289462) +++ user/alc/PQ_LAUNDRY/sys/vm/vm_pageout.c Sat Oct 17 18:35:40 2015 (r289463) @@ -1017,22 +1017,19 @@ static void vm_pageout_launder1(struct vm_domain *vmd) { vm_page_t m, next; - struct vm_page laundry_marker; struct vm_pagequeue *pq; vm_object_t object; - int act_delta, error, maxlaunder, maxscan, numpagedout, vnodes_skipped; + int act_delta, error, launder, maxscan, numpagedout, vnodes_skipped; boolean_t pageout_ok, queues_locked; - vm_pageout_init_marker(&laundry_marker, PQ_LAUNDRY); - /* * XXX */ - maxlaunder = vm_cnt.v_inactive_target - vm_cnt.v_inactive_count + + launder = vm_cnt.v_inactive_target - vm_cnt.v_inactive_count + vm_paging_target() + vm_pageout_deficit; - if (maxlaunder < 0) + if (launder < 0) return; - maxlaunder /= 5; + launder /= 5; vnodes_skipped = 0; @@ -1044,7 +1041,7 @@ vm_pageout_launder1(struct vm_domain *vm vm_pagequeue_lock(pq); queues_locked = TRUE; for (m = TAILQ_FIRST(&pq->pq_pl); - m != NULL && maxscan-- > 0 && maxlaunder > 0; + m != NULL && maxscan-- > 0 && launder > 0; m = next) { vm_pagequeue_assert_locked(pq); KASSERT(queues_locked, ("unlocked laundry queue")); @@ -1075,7 +1072,8 @@ vm_pageout_launder1(struct vm_domain *vm * 'next' pointer. Use our marker to remember our * place. */ - TAILQ_INSERT_AFTER(&pq->pq_pl, m, &laundry_marker, plinks.q); + TAILQ_INSERT_AFTER(&pq->pq_pl, m, &vmd->vmd_laundry_marker, + plinks.q); vm_pagequeue_unlock(pq); queues_locked = FALSE; @@ -1162,7 +1160,7 @@ free_page: } error = vm_pageout_clean(m, &numpagedout); if (error == 0) - maxlaunder -= numpagedout; + launder -= numpagedout; else if (error == EDEADLK) { pageout_lock_miss++; vnodes_skipped++; @@ -1177,8 +1175,8 @@ relock_queues: vm_pagequeue_lock(pq); queues_locked = TRUE; } - next = TAILQ_NEXT(&laundry_marker, plinks.q); - TAILQ_REMOVE(&pq->pq_pl, &laundry_marker, plinks.q); + next = TAILQ_NEXT(&vmd->vmd_laundry_marker, plinks.q); + TAILQ_REMOVE(&pq->pq_pl, &vmd->vmd_laundry_marker, plinks.q); } vm_pagequeue_unlock(pq); @@ -1186,7 +1184,7 @@ relock_queues: * Wakeup the sync daemon if we skipped a vnode in a writeable object * and we didn't launder enough pages. */ - if (vnodes_skipped > 0 && maxlaunder > 0) + if (vnodes_skipped > 0 && launder > 0) (void)speedup_syncer(); } @@ -1202,6 +1200,7 @@ vm_pageout_laundry_worker(void *arg) domidx = (uintptr_t)arg; domain = &vm_dom[domidx]; KASSERT(domain->vmd_segs != 0, ("domain without segments")); + vm_pageout_init_marker(&domain->vmd_laundry_marker, PQ_LAUNDRY); /* * The pageout laundry worker is never done, so loop forever.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201510171835.t9HIZei2041800>