Page MenuHomeFreeBSD

D16606.id46341.diff
No OneTemporary

D16606.id46341.diff

Index: sys/kern/subr_pidctrl.c
===================================================================
--- sys/kern/subr_pidctrl.c
+++ sys/kern/subr_pidctrl.c
@@ -35,6 +35,13 @@
#include <sys/sysctl.h>
#include <sys/pidctrl.h>
+int
+pidctrl_error(struct pidctrl *pc, int input)
+{
+
+ return (pc->pc_setpoint - input);
+}
+
void
pidctrl_init(struct pidctrl *pc, int interval, int setpoint, int bound,
int Kpd, int Kid, int Kdd)
@@ -87,7 +94,7 @@
int output, error;
int Kpd, Kid, Kdd;
- error = pc->pc_setpoint - input;
+ error = pidctrl_error(pc, input);
pc->pc_ticks = ticks;
pc->pc_olderror = pc->pc_error;
@@ -118,7 +125,8 @@
int output, error;
int Kpd, Kid, Kdd;
- error = pc->pc_setpoint - input;
+ error = pidctrl_error(pc, input);
+
/*
* When ticks expires we reset our variables and start a new
* interval. If we're called multiple times during one interval
Index: sys/sys/pidctrl.h
===================================================================
--- sys/sys/pidctrl.h
+++ sys/sys/pidctrl.h
@@ -90,6 +90,7 @@
struct sysctl_oid_list;
+int pidctrl_error(struct pidctrl *pc, int input);
void pidctrl_init(struct pidctrl *pc, int interval, int setpoint,
int bound, int Kpd, int Kid, int Kdd);
void pidctrl_init_sysctl(struct pidctrl *pc, struct sysctl_oid_list *parent);
Index: sys/vm/vm_pageout.c
===================================================================
--- sys/vm/vm_pageout.c
+++ sys/vm/vm_pageout.c
@@ -152,7 +152,6 @@
static int vm_pageout_update_period;
static int disable_swap_pageouts;
static int lowmem_period = 10;
-static time_t lowmem_uptime;
static int swapdev_enabled;
static int vm_panic_on_oom = 0;
@@ -1857,11 +1856,16 @@
}
static void
-vm_pageout_lowmem(struct vm_domain *vmd)
+vm_pageout_lowmem(void)
{
+ static int lowmem_ticks = 0;
+ int last;
+
+ last = atomic_load_int(&lowmem_ticks);
+ while ((u_int)(ticks - last) / hz >= lowmem_period) {
+ if (atomic_fcmpset_int(&lowmem_ticks, &last, ticks) == 0)
+ continue;
- if (vmd == VM_DOMAIN(0) &&
- time_uptime - lowmem_uptime >= lowmem_period) {
/*
* Decrease registered cache sizes.
*/
@@ -1873,7 +1877,6 @@
* drained above.
*/
uma_reclaim();
- lowmem_uptime = time_uptime;
}
}
@@ -1937,16 +1940,22 @@
/* Prevent spurious wakeups by ensuring that wanted is set. */
atomic_store_int(&vmd->vmd_pageout_wanted, 1);
+ /*
+ * If the free page count is below its target, ask subsystems to
+ * release pages.
+ */
+ if (pidctrl_error(&vmd->vmd_pid, vmd->vmd_free_count) > 0)
+ vm_pageout_lowmem();
+
/*
* Use the controller to calculate how many pages to free in
* this interval, and scan the inactive queue.
*/
shortage = pidctrl_daemon(&vmd->vmd_pid, vmd->vmd_free_count);
- if (shortage > 0) {
- vm_pageout_lowmem(vmd);
+ if (shortage > 0)
target_met = vm_pageout_scan_inactive(vmd, shortage,
&addl_shortage);
- } else
+ else
addl_shortage = 0;
/*

File Metadata

Mime Type
text/plain
Expires
Thu, Aug 27, 1:26 PM (4 h, 20 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
37355799
Default Alt Text
D16606.id46341.diff (2 KB)

Event Timeline