diff options
Diffstat (limited to 'mm/memcontrol.c')
| -rw-r--r-- | mm/memcontrol.c | 12 | 
1 files changed, 11 insertions, 1 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 725f76723220..598fece89e2b 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -587,6 +587,9 @@ static DECLARE_DEFERRABLE_WORK(stats_flush_dwork, flush_memcg_stats_dwork);  static DEFINE_SPINLOCK(stats_flush_lock);  static DEFINE_PER_CPU(unsigned int, stats_updates);  static atomic_t stats_flush_threshold = ATOMIC_INIT(0); +static u64 flush_next_time; + +#define FLUSH_TIME (2UL*HZ)  /*   * Accessors to ensure that preemption is disabled on PREEMPT_RT because it can @@ -637,6 +640,7 @@ static void __mem_cgroup_flush_stats(void)  	if (!spin_trylock_irqsave(&stats_flush_lock, flag))  		return; +	flush_next_time = jiffies_64 + 2*FLUSH_TIME;  	cgroup_rstat_flush_irqsafe(root_mem_cgroup->css.cgroup);  	atomic_set(&stats_flush_threshold, 0);  	spin_unlock_irqrestore(&stats_flush_lock, flag); @@ -648,10 +652,16 @@ void mem_cgroup_flush_stats(void)  		__mem_cgroup_flush_stats();  } +void mem_cgroup_flush_stats_delayed(void) +{ +	if (time_after64(jiffies_64, flush_next_time)) +		mem_cgroup_flush_stats(); +} +  static void flush_memcg_stats_dwork(struct work_struct *w)  {  	__mem_cgroup_flush_stats(); -	queue_delayed_work(system_unbound_wq, &stats_flush_dwork, 2UL*HZ); +	queue_delayed_work(system_unbound_wq, &stats_flush_dwork, FLUSH_TIME);  }  /**  | 
