aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base
diff options
context:
space:
mode:
authorGregory Price <gourry.memverge@gmail.com>2023-10-30 00:42:39 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2023-12-07 11:35:23 +0900
commit48b5928e18dc27e05cab3dc4c78cd8a15baaf1e5 (patch)
treeebbe607758b8c89e04cf84cecf28e5b3f1d846aa /drivers/base
parent5bb03d0dd76700a830243776a99275575cbb2ee1 (diff)
downloadlinux-48b5928e18dc27e05cab3dc4c78cd8a15baaf1e5.tar.gz
base/node.c: initialize the accessor list before registering
The current code registers the node as available in the node array before initializing the accessor list. This makes it so that anything which might access the accessor list as a result of allocations will cause an undefined memory access. In one example, an extension to access hmat data during interleave caused this undefined access as a result of a bulk allocation that occurs during node initialization but before the accessor list is initialized. Initialize the accessor list before making the node generally available to the global system. Fixes: 08d9dbe72b1f ("node: Link memory nodes to their compute nodes") Signed-off-by: Gregory Price <gregory.price@memverge.com> Link: https://lore.kernel.org/r/20231030044239.971756-1-gregory.price@memverge.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/node.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/base/node.c b/drivers/base/node.c
index 493d533f837556..4d588f4658c85c 100644
--- a/drivers/base/node.c
+++ b/drivers/base/node.c
@@ -868,11 +868,15 @@ int __register_one_node(int nid)
{
int error;
int cpu;
+ struct node *node;
- node_devices[nid] = kzalloc(sizeof(struct node), GFP_KERNEL);
- if (!node_devices[nid])
+ node = kzalloc(sizeof(struct node), GFP_KERNEL);
+ if (!node)
return -ENOMEM;
+ INIT_LIST_HEAD(&node->access_list);
+ node_devices[nid] = node;
+
error = register_node(node_devices[nid], nid);
/* link cpu under this node */
@@ -881,7 +885,6 @@ int __register_one_node(int nid)
register_cpu_under_node(cpu, nid);
}
- INIT_LIST_HEAD(&node_devices[nid]->access_list);
node_init_caches(nid);
return error;