diff options
Diffstat (limited to 'mm/migrate.c')
| -rw-r--r-- | mm/migrate.c | 62 | 
1 files changed, 37 insertions, 25 deletions
diff --git a/mm/migrate.c b/mm/migrate.c index a6a7743ee98f..1852d787e6ab 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -3066,7 +3066,7 @@ void migrate_vma_finalize(struct migrate_vma *migrate)  EXPORT_SYMBOL(migrate_vma_finalize);  #endif /* CONFIG_DEVICE_PRIVATE */ -#if defined(CONFIG_MEMORY_HOTPLUG) +#if defined(CONFIG_HOTPLUG_CPU)  /* Disable reclaim-based migration. */  static void __disable_all_migrate_targets(void)  { @@ -3209,25 +3209,6 @@ static void set_migration_target_nodes(void)  }  /* - * React to hotplug events that might affect the migration targets - * like events that online or offline NUMA nodes. - * - * The ordering is also currently dependent on which nodes have - * CPUs.  That means we need CPU on/offline notification too. - */ -static int migration_online_cpu(unsigned int cpu) -{ -	set_migration_target_nodes(); -	return 0; -} - -static int migration_offline_cpu(unsigned int cpu) -{ -	set_migration_target_nodes(); -	return 0; -} - -/*   * This leaves migrate-on-reclaim transiently disabled between   * the MEM_GOING_OFFLINE and MEM_OFFLINE events.  This runs   * whether reclaim-based migration is enabled or not, which @@ -3239,8 +3220,18 @@ static int migration_offline_cpu(unsigned int cpu)   * set_migration_target_nodes().   */  static int __meminit migrate_on_reclaim_callback(struct notifier_block *self, -						 unsigned long action, void *arg) +						 unsigned long action, void *_arg)  { +	struct memory_notify *arg = _arg; + +	/* +	 * Only update the node migration order when a node is +	 * changing status, like online->offline.  This avoids +	 * the overhead of synchronize_rcu() in most cases. +	 */ +	if (arg->status_change_nid < 0) +		return notifier_from_errno(0); +  	switch (action) {  	case MEM_GOING_OFFLINE:  		/* @@ -3274,13 +3265,31 @@ static int __meminit migrate_on_reclaim_callback(struct notifier_block *self,  	return notifier_from_errno(0);  } +/* + * React to hotplug events that might affect the migration targets + * like events that online or offline NUMA nodes. + * + * The ordering is also currently dependent on which nodes have + * CPUs.  That means we need CPU on/offline notification too. + */ +static int migration_online_cpu(unsigned int cpu) +{ +	set_migration_target_nodes(); +	return 0; +} + +static int migration_offline_cpu(unsigned int cpu) +{ +	set_migration_target_nodes(); +	return 0; +} +  static int __init migrate_on_reclaim_init(void)  {  	int ret; -	ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "migrate on reclaim", -				migration_online_cpu, -				migration_offline_cpu); +	ret = cpuhp_setup_state_nocalls(CPUHP_MM_DEMOTION_DEAD, "mm/demotion:offline", +					NULL, migration_offline_cpu);  	/*  	 * In the unlikely case that this fails, the automatic  	 * migration targets may become suboptimal for nodes @@ -3288,9 +3297,12 @@ static int __init migrate_on_reclaim_init(void)  	 * rare case, do not bother trying to do anything special.  	 */  	WARN_ON(ret < 0); +	ret = cpuhp_setup_state(CPUHP_AP_MM_DEMOTION_ONLINE, "mm/demotion:online", +				migration_online_cpu, NULL); +	WARN_ON(ret < 0);  	hotplug_memory_notifier(migrate_on_reclaim_callback, 100);  	return 0;  }  late_initcall(migrate_on_reclaim_init); -#endif /* CONFIG_MEMORY_HOTPLUG */ +#endif /* CONFIG_HOTPLUG_CPU */  | 
