@@ -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;
@@ -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);
@@ -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);
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@linux.ibm.com> --- drivers/base/node.c | 7 ++++++- include/linux/migrate.h | 1 + mm/migrate.c | 15 +++++++++++++-- 3 files changed, 20 insertions(+), 3 deletions(-)