- Resolves: RHEL-184808, Dynamically removing cores from an LPAR is not taking care of NUMA topology - Resolves: RHEL-185098, DLPAR Memory remove/add operations fail
88 lines
2.3 KiB
Diff
88 lines
2.3 KiB
Diff
commit 7926241f576de24df8b342858f5278911e035658
|
|
Author: Haren Myneni <haren@linux.ibm.com>
|
|
Date: Mon May 18 22:37:54 2026 -0700
|
|
|
|
drmgr: Do not remove LMBs when the timer expires
|
|
|
|
The current code selects LMBs from all NUMA node based on node
|
|
ratio and removes them until reaches the the requested limit. This
|
|
patch stops removing LMBs when receives SIGALRM signal based on
|
|
the user defined timeout.
|
|
|
|
Also reports total numaber of LMBs removed with DR_TOTAL_RESOURCES
|
|
to RMC even for partial memory removal or with an error.
|
|
|
|
Signed-off-by: Haren Myneni <haren@linux.ibm.com>
|
|
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
|
|
|
|
diff --git a/src/drmgr/drslot_chrp_mem.c b/src/drmgr/drslot_chrp_mem.c
|
|
index 5a08839..4a3fe3a 100644
|
|
--- a/src/drmgr/drslot_chrp_mem.c
|
|
+++ b/src/drmgr/drslot_chrp_mem.c
|
|
@@ -1478,6 +1478,9 @@ static int remove_lmb_from_node(struct ppcnuma_node *node, uint32_t count)
|
|
count, node->n_lmbs, node->node_id);
|
|
|
|
for (lmb = node->lmbs; lmb && done < count; lmb = lmb->lmb_numa_next) {
|
|
+ if (numa_mem_timeout)
|
|
+ break;
|
|
+
|
|
unlinked++;
|
|
err = remove_lmb_by_index(lmb->drc_index);
|
|
if (err)
|
|
@@ -1563,6 +1566,9 @@ static int remove_cpuless_lmbs(uint32_t count)
|
|
|
|
this_loop = 0;
|
|
ppcnuma_foreach_node(&numa, nid, node) {
|
|
+ if (numa_mem_timeout)
|
|
+ break;
|
|
+
|
|
if (!node->n_lmbs || node->n_cpus)
|
|
continue;
|
|
|
|
@@ -1656,6 +1662,9 @@ static int remove_cpu_lmbs(uint32_t count)
|
|
|
|
this_loop = 0;
|
|
ppcnuma_foreach_node_by_ratio(&numa, node) {
|
|
+ if (numa_mem_timeout)
|
|
+ break;
|
|
+
|
|
if (!node->n_lmbs || !node->n_cpus)
|
|
continue;
|
|
|
|
@@ -1739,14 +1748,13 @@ static int numa_based_remove(uint32_t count)
|
|
*/
|
|
lmb_list = get_lmbs(LMB_NORMAL_SORT);
|
|
if (lmb_list == NULL) {
|
|
- clear_numa_lmb_links();
|
|
- return -1;
|
|
+ rc = -1;
|
|
+ goto out_clear;
|
|
}
|
|
|
|
if (!numa.node_count) {
|
|
- clear_numa_lmb_links();
|
|
- free_lmbs(lmb_list);
|
|
- return -EINVAL;
|
|
+ rc = -EINVAL;
|
|
+ goto out_free;
|
|
}
|
|
|
|
ppcnuma_foreach_node(&numa, nid, node) {
|
|
@@ -1759,11 +1767,12 @@ static int numa_based_remove(uint32_t count)
|
|
|
|
done += remove_cpu_lmbs(count);
|
|
|
|
- report_resource_count(done);
|
|
-
|
|
- clear_numa_lmb_links();
|
|
+out_free:
|
|
free_lmbs(lmb_list);
|
|
- return 0;
|
|
+out_clear:
|
|
+ clear_numa_lmb_links();
|
|
+ report_resource_count(done);
|
|
+ return rc;
|
|
}
|
|
|
|
int do_mem_kernel_dlpar(void)
|