[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20220603134237.131362-7-aneesh.kumar@linux.ibm.com>
Date: Fri, 3 Jun 2022 19:12:34 +0530
From: "Aneesh Kumar K.V" <aneesh.kumar@...ux.ibm.com>
To: linux-mm@...ck.org, akpm@...ux-foundation.org
Cc: Wei Xu <weixugc@...gle.com>, Huang Ying <ying.huang@...el.com>,
Greg Thelen <gthelen@...gle.com>,
Yang Shi <shy828301@...il.com>,
Davidlohr Bueso <dave@...olabs.net>,
Tim C Chen <tim.c.chen@...el.com>,
Brice Goglin <brice.goglin@...il.com>,
Michal Hocko <mhocko@...nel.org>,
Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
Hesham Almatary <hesham.almatary@...wei.com>,
Dave Hansen <dave.hansen@...el.com>,
Jonathan Cameron <Jonathan.Cameron@...wei.com>,
Alistair Popple <apopple@...dia.com>,
Dan Williams <dan.j.williams@...el.com>,
Feng Tang <feng.tang@...el.com>,
Jagdish Gediya <jvgediya@...ux.ibm.com>,
Baolin Wang <baolin.wang@...ux.alibaba.com>,
David Rientjes <rientjes@...gle.com>,
"Aneesh Kumar K.V" <aneesh.kumar@...ux.ibm.com>
Subject: [PATCH v5 6/9] mm/demotion: Add support for removing node from demotion memory tiers
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@...ux.ibm.com>
---
drivers/base/node.c | 4 ++++
include/linux/memory-tiers.h | 1 +
mm/memory-tiers.c | 18 +++++++++++++++---
3 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/drivers/base/node.c b/drivers/base/node.c
index 599ed64d910f..344786290149 100644
--- a/drivers/base/node.c
+++ b/drivers/base/node.c
@@ -582,6 +582,10 @@ static ssize_t memtier_store(struct device *dev,
int node = dev->id;
int ret;
+ 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/memory-tiers.h b/include/linux/memory-tiers.h
index adc2cb3bf5f8..79bd8d26feb2 100644
--- a/include/linux/memory-tiers.h
+++ b/include/linux/memory-tiers.h
@@ -17,6 +17,7 @@
extern bool numa_demotion_enabled;
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(int node, int tier);
int node_reset_memory_tier(int node, int tier);
diff --git a/mm/memory-tiers.c b/mm/memory-tiers.c
index 9c82cf4c4bca..b4e72b672d4d 100644
--- a/mm/memory-tiers.c
+++ b/mm/memory-tiers.c
@@ -253,8 +253,7 @@ static struct memory_tier *__get_memory_tier_from_id(int id)
return NULL;
}
-__maybe_unused // temporay to prevent warnings during bisects
-static void node_remove_from_memory_tier(int node)
+void node_remove_from_memory_tier(int node)
{
struct memory_tier *memtier;
@@ -320,7 +319,20 @@ 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);
+ establish_migration_targets();
+ }
+ goto out;
+ }
+
+ if (current_tier->dev.id == tier)
goto out;
node_clear(node, current_tier->nodelist);
--
2.36.1
Powered by blists - more mailing lists