diff options
Diffstat (limited to 'mm')
| -rw-r--r-- | mm/mempolicy.c | 61 | ||||
| -rw-r--r-- | mm/vmscan.c | 5 | 
2 files changed, 64 insertions, 2 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 939eabcaf488..e675bfb856da 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -3021,3 +3021,64 @@ void mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol)  		p += scnprintf(p, buffer + maxlen - p, ":%*pbl",  			       nodemask_pr_args(&nodes));  } + +bool numa_demotion_enabled = false; + +#ifdef CONFIG_SYSFS +static ssize_t numa_demotion_enabled_show(struct kobject *kobj, +					  struct kobj_attribute *attr, char *buf) +{ +	return sysfs_emit(buf, "%s\n", +			  numa_demotion_enabled? "true" : "false"); +} + +static ssize_t numa_demotion_enabled_store(struct kobject *kobj, +					   struct kobj_attribute *attr, +					   const char *buf, size_t count) +{ +	if (!strncmp(buf, "true", 4) || !strncmp(buf, "1", 1)) +		numa_demotion_enabled = true; +	else if (!strncmp(buf, "false", 5) || !strncmp(buf, "0", 1)) +		numa_demotion_enabled = false; +	else +		return -EINVAL; + +	return count; +} + +static struct kobj_attribute numa_demotion_enabled_attr = +	__ATTR(demotion_enabled, 0644, numa_demotion_enabled_show, +	       numa_demotion_enabled_store); + +static struct attribute *numa_attrs[] = { +	&numa_demotion_enabled_attr.attr, +	NULL, +}; + +static const struct attribute_group numa_attr_group = { +	.attrs = numa_attrs, +}; + +static int __init numa_init_sysfs(void) +{ +	int err; +	struct kobject *numa_kobj; + +	numa_kobj = kobject_create_and_add("numa", mm_kobj); +	if (!numa_kobj) { +		pr_err("failed to create numa kobject\n"); +		return -ENOMEM; +	} +	err = sysfs_create_group(numa_kobj, &numa_attr_group); +	if (err) { +		pr_err("failed to register numa group\n"); +		goto delete_obj; +	} +	return 0; + +delete_obj: +	kobject_put(numa_kobj); +	return err; +} +subsys_initcall(numa_init_sysfs); +#endif diff --git a/mm/vmscan.c b/mm/vmscan.c index 43289f5f8488..2255025f1891 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -524,6 +524,8 @@ static long add_nr_deferred(long nr, struct shrinker *shrinker,  static bool can_demote(int nid, struct scan_control *sc)  { +	if (!numa_demotion_enabled) +		return false;  	if (sc) {  		if (sc->no_demotion)  			return false; @@ -534,8 +536,7 @@ static bool can_demote(int nid, struct scan_control *sc)  	if (next_demotion_node(nid) == NUMA_NO_NODE)  		return false; -	// FIXME: actually enable this later in the series -	return false; +	return true;  }  static inline bool can_reclaim_anon_pages(struct mem_cgroup *memcg,  | 
