Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F160361325
D14884.id40874.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
D14884.id40874.diff
View Options
Index: head/sys/vm/vm_pageout.c
===================================================================
--- head/sys/vm/vm_pageout.c
+++ head/sys/vm/vm_pageout.c
@@ -943,8 +943,7 @@
{
struct vm_domain *vmd;
struct vm_pagequeue *pq;
- uint64_t nclean, ndirty;
- u_int inactq_scans, last_launder;
+ uint64_t nclean, ndirty, nfreed;
int domain, last_target, launder, shortfall, shortfall_cycle, target;
bool in_shortfall;
@@ -958,8 +957,7 @@
in_shortfall = false;
shortfall_cycle = 0;
target = 0;
- inactq_scans = 0;
- last_launder = 0;
+ nfreed = 0;
/*
* Calls to these handlers are serialized by the swap syscall lock.
@@ -1000,7 +998,6 @@
target = 0;
goto trybackground;
}
- last_launder = inactq_scans;
launder = target / shortfall_cycle--;
goto dolaundry;
@@ -1009,24 +1006,23 @@
* meet the conditions to perform background laundering:
*
* 1. The ratio of dirty to clean inactive pages exceeds the
- * background laundering threshold and the pagedaemon has
- * been woken up to reclaim pages since our last
- * laundering, or
+ * background laundering threshold, or
* 2. we haven't yet reached the target of the current
* background laundering run.
*
* The background laundering threshold is not a constant.
* Instead, it is a slowly growing function of the number of
- * page daemon scans since the last laundering. Thus, as the
- * ratio of dirty to clean inactive pages grows, the amount of
- * memory pressure required to trigger laundering decreases.
+ * clean pages freed by the page daemon since the last
+ * background laundering. Thus, as the ratio of dirty to
+ * clean inactive pages grows, the amount of memory pressure
+ * required to trigger laundering decreases.
*/
trybackground:
nclean = vmd->vmd_free_count +
vmd->vmd_pagequeues[PQ_INACTIVE].pq_cnt;
ndirty = vmd->vmd_pagequeues[PQ_LAUNDRY].pq_cnt;
- if (target == 0 && inactq_scans != last_launder &&
- ndirty * isqrt(inactq_scans - last_launder) >= nclean) {
+ if (target == 0 && ndirty * isqrt(nfreed /
+ (vmd->vmd_free_target - vmd->vmd_free_min)) >= nclean) {
target = vmd->vmd_background_launder_target;
}
@@ -1039,8 +1035,8 @@
* proceed at the background laundering rate.
*/
if (target > 0) {
- if (inactq_scans != last_launder) {
- last_launder = inactq_scans;
+ if (nfreed > 0) {
+ nfreed = 0;
last_target = target;
} else if (last_target - target >=
vm_background_launder_max * PAGE_SIZE / 1024) {
@@ -1089,7 +1085,8 @@
if (target == 0)
vmd->vmd_laundry_request = VM_LAUNDRY_IDLE;
- inactq_scans = vmd->vmd_inactq_scans;
+ nfreed += vmd->vmd_clean_pages_freed;
+ vmd->vmd_clean_pages_freed = 0;
vm_pagequeue_unlock(pq);
}
}
@@ -1367,7 +1364,8 @@
VM_LAUNDRY_BACKGROUND;
wakeup(&vmd->vmd_laundry_request);
}
- vmd->vmd_inactq_scans++;
+ vmd->vmd_clean_pages_freed +=
+ starting_page_shortage - page_shortage;
vm_pagequeue_unlock(pq);
}
Index: head/sys/vm/vm_pagequeue.h
===================================================================
--- head/sys/vm/vm_pagequeue.h
+++ head/sys/vm/vm_pagequeue.h
@@ -86,6 +86,7 @@
* d vm_domainset_lock
* a atomic
* c const after boot
+ * q page queue lock
*/
struct vm_domain {
struct vm_pagequeue vmd_pagequeues[PQ_COUNT];
@@ -112,15 +113,15 @@
int vmd_pageout_pages_needed; /* (d) page daemon waiting for pages? */
bool vmd_minset; /* (d) Are we in vm_min_domains? */
bool vmd_severeset; /* (d) Are we in vm_severe_domains? */
- int vmd_inactq_scans;
enum {
VM_LAUNDRY_IDLE = 0,
VM_LAUNDRY_BACKGROUND,
VM_LAUNDRY_SHORTFALL
} vmd_laundry_request;
- /* Paging thresholds. */
- u_int vmd_background_launder_target;
+ /* Paging thresholds and targets. */
+ u_int vmd_clean_pages_freed; /* (q) accumulator for laundry thread */
+ u_int vmd_background_launder_target; /* (c) */
u_int vmd_free_reserved; /* (c) pages reserved for deadlock */
u_int vmd_free_target; /* (c) pages desired free */
u_int vmd_free_min; /* (c) pages desired free */
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Jun 24, 4:59 PM (8 h, 57 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
34284753
Default Alt Text
D14884.id40874.diff (4 KB)
Attached To
Mode
D14884: Fix the background laundering mechanism.
Attached
Detach File
Event Timeline
Log In to Comment