diff options
Diffstat (limited to 'mm/vmscan.c')
| -rw-r--r-- | mm/vmscan.c | 12 | 
1 files changed, 9 insertions, 3 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index eeb3bc9d1d3..66e431060c0 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -2688,7 +2688,10 @@ static void kswapd_try_to_sleep(pg_data_t *pgdat, int order, int classzone_idx)  		 * them before going back to sleep.  		 */  		set_pgdat_percpu_threshold(pgdat, calculate_normal_threshold); -		schedule(); + +		if (!kthread_should_stop()) +			schedule(); +  		set_pgdat_percpu_threshold(pgdat, calculate_pressure_threshold);  	} else {  		if (remaining) @@ -2955,14 +2958,17 @@ int kswapd_run(int nid)  }  /* - * Called by memory hotplug when all memory in a node is offlined. + * Called by memory hotplug when all memory in a node is offlined.  Caller must + * hold lock_memory_hotplug().   */  void kswapd_stop(int nid)  {  	struct task_struct *kswapd = NODE_DATA(nid)->kswapd; -	if (kswapd) +	if (kswapd) {  		kthread_stop(kswapd); +		NODE_DATA(nid)->kswapd = NULL; +	}  }  static int __init kswapd_init(void)  |