This patch adds the special string "none" as a supported memtier value that we can use to remove a specific node from being using as demotion target. For ex: :/sys/devices/system/node/node1# cat memtier 1 :/sys/devices/system/node/node1# cat ../../memtier/memtier1/nodelist 1-3 :/sys/devices/system/node/node1# echo none > memtier :/sys/devices/system/node/node1# :/sys/devices/system/node/node1# cat memtier :/sys/devices/system/node/node1# cat ../../memtier/memtier1/nodelist 2-3 :/sys/devices/system/node/node1# Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@xxxxxxxxxxxxx> --- drivers/base/node.c | 7 ++++++- include/linux/migrate.h | 1 + mm/migrate.c | 15 +++++++++++++-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/drivers/base/node.c b/drivers/base/node.c index 892f7c23c94e..5311cf1db500 100644 --- a/drivers/base/node.c +++ b/drivers/base/node.c @@ -578,10 +578,15 @@ static ssize_t memtier_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { + int ret; unsigned long tier; int node = dev->id; - int ret = kstrtoul(buf, 10, &tier); + if (!strncmp(buf, "none", strlen("none"))) { + node_remove_from_memory_tier(node); + return count; + } + ret = kstrtoul(buf, 10, &tier); if (ret) return ret; diff --git a/include/linux/migrate.h b/include/linux/migrate.h index fd09fd009a69..77c581f47953 100644 --- a/include/linux/migrate.h +++ b/include/linux/migrate.h @@ -178,6 +178,7 @@ enum memory_tier_type { #define MAX_MEMORY_TIERS 3 int next_demotion_node(int node); +void node_remove_from_memory_tier(int node); int node_get_memory_tier_id(int node); int node_set_memory_tier_rank(int node, int tier); int node_reset_memory_tier(int node, int tier); diff --git a/mm/migrate.c b/mm/migrate.c index f013d14f77ed..114c7428b9f3 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -2354,7 +2354,7 @@ static struct memory_tier *__get_memory_tier_from_id(int id) } -static void node_remove_from_memory_tier(int node) +void node_remove_from_memory_tier(int node) { struct memory_tier *memtier; @@ -2418,7 +2418,18 @@ int node_reset_memory_tier(int node, int tier) mutex_lock(&memory_tier_lock); current_tier = __node_get_memory_tier(node); - if (!current_tier || current_tier->dev.id == tier) + if (!current_tier) { + /* + * If a N_MEMORY node doesn't have a tier index, then + * we removed it from demotion earlier and we are trying + * add it back. Just add the node to requested tier. + */ + if (node_state(node, N_MEMORY)) + ret = __node_set_memory_tier(node, tier); + goto out; + } + + if (current_tier->dev.id == tier) goto out; node_clear(node, current_tier->nodelist); -- 2.36.1