Merge "mm: vmpressure: scale pressure based on reclaim context"

This commit is contained in:
Linux Build Service Account 2015-04-09 12:58:58 -07:00 committed by Gerrit - the friendly Code Review server
commit 11d48d8672
2 changed files with 23 additions and 0 deletions

View file

@ -11,6 +11,7 @@
struct vmpressure { struct vmpressure {
unsigned long scanned; unsigned long scanned;
unsigned long reclaimed; unsigned long reclaimed;
unsigned long stall;
/* The lock is used to keep the scanned/reclaimed above in sync. */ /* The lock is used to keep the scanned/reclaimed above in sync. */
struct mutex sr_lock; struct mutex sr_lock;

View file

@ -23,6 +23,7 @@
#include <linux/printk.h> #include <linux/printk.h>
#include <linux/notifier.h> #include <linux/notifier.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/module.h>
#include <linux/vmpressure.h> #include <linux/vmpressure.h>
/* /*
@ -50,6 +51,10 @@ static const unsigned long vmpressure_win = SWAP_CLUSTER_MAX * 16;
static const unsigned int vmpressure_level_med = 60; static const unsigned int vmpressure_level_med = 60;
static const unsigned int vmpressure_level_critical = 95; static const unsigned int vmpressure_level_critical = 95;
static unsigned long vmpressure_scale_max = 100;
module_param_named(vmpressure_scale_max, vmpressure_scale_max,
ulong, S_IRUGO | S_IWUSR);
static struct vmpressure global_vmpressure; static struct vmpressure global_vmpressure;
BLOCKING_NOTIFIER_HEAD(vmpressure_notifier); BLOCKING_NOTIFIER_HEAD(vmpressure_notifier);
@ -166,6 +171,15 @@ static unsigned long vmpressure_calc_pressure(unsigned long scanned,
return pressure; return pressure;
} }
static unsigned long vmpressure_account_stall(unsigned long pressure,
unsigned long stall, unsigned long scanned)
{
unsigned long scale =
((vmpressure_scale_max - pressure) * stall) / scanned;
return pressure + scale;
}
struct vmpressure_event { struct vmpressure_event {
struct eventfd_ctx *efd; struct eventfd_ctx *efd;
enum vmpressure_levels level; enum vmpressure_levels level;
@ -279,6 +293,7 @@ void vmpressure_global(gfp_t gfp, unsigned long scanned,
{ {
struct vmpressure *vmpr = &global_vmpressure; struct vmpressure *vmpr = &global_vmpressure;
unsigned long pressure; unsigned long pressure;
unsigned long stall;
if (!(gfp & (__GFP_HIGHMEM | __GFP_MOVABLE | __GFP_IO | __GFP_FS))) if (!(gfp & (__GFP_HIGHMEM | __GFP_MOVABLE | __GFP_IO | __GFP_FS)))
return; return;
@ -289,6 +304,11 @@ void vmpressure_global(gfp_t gfp, unsigned long scanned,
mutex_lock(&vmpr->sr_lock); mutex_lock(&vmpr->sr_lock);
vmpr->scanned += scanned; vmpr->scanned += scanned;
vmpr->reclaimed += reclaimed; vmpr->reclaimed += reclaimed;
if (!current_is_kswapd())
vmpr->stall += scanned;
stall = vmpr->stall;
scanned = vmpr->scanned; scanned = vmpr->scanned;
reclaimed = vmpr->reclaimed; reclaimed = vmpr->reclaimed;
mutex_unlock(&vmpr->sr_lock); mutex_unlock(&vmpr->sr_lock);
@ -299,9 +319,11 @@ void vmpressure_global(gfp_t gfp, unsigned long scanned,
mutex_lock(&vmpr->sr_lock); mutex_lock(&vmpr->sr_lock);
vmpr->scanned = 0; vmpr->scanned = 0;
vmpr->reclaimed = 0; vmpr->reclaimed = 0;
vmpr->stall = 0;
mutex_unlock(&vmpr->sr_lock); mutex_unlock(&vmpr->sr_lock);
pressure = vmpressure_calc_pressure(scanned, reclaimed); pressure = vmpressure_calc_pressure(scanned, reclaimed);
pressure = vmpressure_account_stall(pressure, stall, scanned);
vmpressure_notify(pressure); vmpressure_notify(pressure);
} }