Skip to content

Commit

Permalink
powerpc/numa: Online a node if PHB is attached.
Browse files Browse the repository at this point in the history
In the current design, a numa-node is made online only if that node is
attached to cpu/memory. With this design, if any PCI/IO device is found
to be attached to a numa-node which is not online then the numa-node
id of the corresponding PCI/IO device is set to NUMA_NO_NODE(-1). This
design may negatively impact the performance of PCIe device if the
numa-node assigned to PCIe device is -1 because in such case we may not
be able to accurately calculate the distance between two nodes.

The multi-controller NVMe PCIe disk has an issue with calculating the
node distance if the PCIe NVMe controller is attached to a PCI host
bridge which has numa-node id value set to NUMA_NO_NODE. This patch
helps fix this ensuring that a cpu/memory less numa node is made online
if it's attached to PCI host bridge.

Signed-off-by: Nilay Shroff <[email protected]>
Reviewed-by: Srikar Dronamraju <[email protected]>
Signed-off-by: Michael Ellerman <[email protected]>
Link: https://msgid.link/[email protected]
  • Loading branch information
shroffni authored and mpe committed May 24, 2024
1 parent 1accd4a commit 47df54d
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 1 deletion.
14 changes: 13 additions & 1 deletion arch/powerpc/mm/numa.c
Original file line number Diff line number Diff line change
Expand Up @@ -896,7 +896,7 @@ static int __init numa_setup_drmem_lmb(struct drmem_lmb *lmb,

static int __init parse_numa_properties(void)
{
struct device_node *memory;
struct device_node *memory, *pci;
int default_nid = 0;
unsigned long i;
const __be32 *associativity;
Expand Down Expand Up @@ -1010,6 +1010,18 @@ static int __init parse_numa_properties(void)
goto new_range;
}

for_each_node_by_name(pci, "pci") {
int nid = NUMA_NO_NODE;

associativity = of_get_associativity(pci);
if (associativity) {
nid = associativity_to_nid(associativity);
initialize_form1_numa_distance(associativity);
}
if (likely(nid >= 0) && !node_online(nid))
node_set_online(nid);
}

/*
* Now do the same thing for each MEMBLOCK listed in the
* ibm,dynamic-memory property in the
Expand Down
14 changes: 14 additions & 0 deletions arch/powerpc/platforms/pseries/pci_dlpar.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

#include <linux/pci.h>
#include <linux/export.h>
#include <linux/node.h>
#include <asm/pci-bridge.h>
#include <asm/ppc-pci.h>
#include <asm/firmware.h>
Expand All @@ -21,9 +22,22 @@
struct pci_controller *init_phb_dynamic(struct device_node *dn)
{
struct pci_controller *phb;
int nid;

pr_debug("PCI: Initializing new hotplug PHB %pOF\n", dn);

nid = of_node_to_nid(dn);
if (likely((nid) >= 0)) {
if (!node_online(nid)) {
if (__register_one_node(nid)) {
pr_err("PCI: Failed to register node %d\n", nid);
} else {
update_numa_distance(dn);
node_set_online(nid);
}
}
}

phb = pcibios_alloc_controller(dn);
if (!phb)
return NULL;
Expand Down

0 comments on commit 47df54d

Please sign in to comment.