Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F156729645
D15491.id43262.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D15491.id43262.diff
View Options
Index: head/sys/vm/vm_pageout.c
===================================================================
--- head/sys/vm/vm_pageout.c
+++ head/sys/vm/vm_pageout.c
@@ -1352,7 +1352,7 @@
* target.
*/
static int
-vm_pageout_scan_inactive(struct vm_domain *vmd, int pass, int shortage,
+vm_pageout_scan_inactive(struct vm_domain *vmd, int shortage,
int *addl_shortage)
{
struct scan_state ss;
@@ -1366,25 +1366,6 @@
bool obj_locked;
/*
- * If we need to reclaim memory ask kernel caches to return
- * some. We rate limit to avoid thrashing.
- */
- if (vmd == VM_DOMAIN(0) && pass > 0 &&
- (time_uptime - lowmem_uptime) >= lowmem_period) {
- /*
- * Decrease registered cache sizes.
- */
- SDT_PROBE0(vm, , , vm__lowmem_scan);
- EVENTHANDLER_INVOKE(vm_lowmem, VM_LOW_PAGES);
- /*
- * We do this explicitly after the caches have been
- * drained above.
- */
- uma_reclaim();
- lowmem_uptime = time_uptime;
- }
-
- /*
* The addl_page_shortage is an estimate of the number of temporarily
* stuck pages in the inactive queue. In other words, the
* number of pages from the inactive count that should be
@@ -1393,16 +1374,13 @@
addl_page_shortage = 0;
/*
- * Calculate the number of pages that we want to free. This number
- * can be negative if many pages are freed between the wakeup call to
- * the page daemon and this calculation.
+ * vmd_pageout_deficit counts the number of pages requested in
+ * allocations that failed because of a free page shortage. We assume
+ * that the allocations will be reattempted and thus include the deficit
+ * in our scan target.
*/
- if (pass > 0) {
- deficit = atomic_readandclear_int(&vmd->vmd_pageout_deficit);
- page_shortage = shortage + deficit;
- } else
- page_shortage = deficit = 0;
- starting_page_shortage = page_shortage;
+ deficit = atomic_readandclear_int(&vmd->vmd_pageout_deficit);
+ starting_page_shortage = page_shortage = shortage + deficit;
mtx = NULL;
obj_locked = false;
@@ -1638,8 +1616,7 @@
/*
* Reclaim pages by swapping out idle processes, if configured to do so.
*/
- if (pass > 0)
- vm_swapout_run_idle();
+ vm_swapout_run_idle();
/*
* See the description of addl_page_shortage above.
@@ -1870,15 +1847,35 @@
}
static void
+vm_pageout_lowmem(struct vm_domain *vmd)
+{
+
+ if (vmd == VM_DOMAIN(0) &&
+ time_uptime - lowmem_uptime >= lowmem_period) {
+ /*
+ * Decrease registered cache sizes.
+ */
+ SDT_PROBE0(vm, , , vm__lowmem_scan);
+ EVENTHANDLER_INVOKE(vm_lowmem, VM_LOW_PAGES);
+
+ /*
+ * We do this explicitly after the caches have been
+ * drained above.
+ */
+ uma_reclaim();
+ lowmem_uptime = time_uptime;
+ }
+}
+
+static void
vm_pageout_worker(void *arg)
{
struct vm_domain *vmd;
- int addl_shortage, domain, pass, shortage;
+ int addl_shortage, domain, shortage;
bool target_met;
domain = (uintptr_t)arg;
vmd = VM_DOMAIN(domain);
- pass = 0;
shortage = 0;
target_met = true;
@@ -1896,6 +1893,7 @@
*/
while (TRUE) {
vm_domain_pageout_lock(vmd);
+
/*
* We need to clear wanted before we check the limits. This
* prevents races with wakers who will check wanted after they
@@ -1908,12 +1906,12 @@
*/
if (vm_paging_needed(vmd, vmd->vmd_free_count)) {
/*
- * Yes, the scan failed to free enough pages. If
- * we have performed a level >= 1 (page reclamation)
- * scan, then sleep a bit and try again.
+ * Yes. If the scan failed to produce enough free
+ * pages, sleep uninterruptibly for some time in the
+ * hope that the laundry thread will clean some pages.
*/
vm_domain_pageout_unlock(vmd);
- if (pass > 1)
+ if (!target_met)
pause("pwait", hz / VM_INACT_SCAN_RATE);
} else {
/*
@@ -1934,10 +1932,12 @@
* this interval, and scan the inactive queue.
*/
shortage = pidctrl_daemon(&vmd->vmd_pid, vmd->vmd_free_count);
- if (shortage > 0 && pass == 0)
- pass = 1;
- target_met = vm_pageout_scan_inactive(vmd, pass, shortage,
- &addl_shortage);
+ if (shortage > 0) {
+ vm_pageout_lowmem(vmd);
+ target_met = vm_pageout_scan_inactive(vmd, shortage,
+ &addl_shortage);
+ } else
+ addl_shortage = 0;
/*
* Scan the active queue. A positive value for shortage
@@ -1946,13 +1946,6 @@
*/
shortage = vm_pageout_active_target(vmd) + addl_shortage;
vm_pageout_scan_active(vmd, shortage);
-
- /*
- * If the target was not met we must increase the pass to
- * more aggressively reclaim.
- */
- if (!target_met)
- pass++;
}
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, May 16, 11:24 PM (1 h, 3 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33158753
Default Alt Text
D15491.id43262.diff (4 KB)
Attached To
Mode
D15491: Eliminate the "pass" variable in the page daemon control loop.
Attached
Detach File
Event Timeline
Log In to Comment