2014-01-29 18:17:32

by Bjorn Helgaas

[permalink] [raw]
Subject: [PATCH 00/17] x86, ia64 NUMA cleanup

This is all cleanup: it adds no new functionality and should make no
functional difference at all except a printk change or two.

The main ideas are:

- Clean up the x86 PCI bus scanning interfaces. We had:
struct pci_bus *pci_scan_bus_on_node(int bus, struct pci_ops *, int node)
struct pci_bus *pcibios_scan_root(int bus)
struct pci_bus *pci_scan_bus_with_sysdata(int bus)
void pcibios_scan_specific_bus(int bus)
These were all basically the same, so I kept only pcibios_scan_root().

- Get rid of mp_bus_to_node[]. This was basically a way of passing node
info from the AMD "native host bridg driver" (amd_bus.c) into the PCI
core. It was clunky and inconsistent between x86-64 and i386. I
replaced it with x86_pci_root_bus_node(), analogous to the existing
x86_pci_root_bus_resources().

- Remove _PXM knowledge from the PCI host bridge, IOMMU, and APIC code.
They really only care about the NUMA node number, not the raw _PXM
value.

---

Bjorn Helgaas (17):
x86/PCI: Drop pcibios_scan_root() check for bus already scanned
x86/PCI: Use pcibios_scan_root() instead of pci_scan_bus_with_sysdata()
x86/PCI: Use pcibios_scan_root() instead of pci_scan_bus_on_node()
x86/PCI: Merge pci_scan_bus_on_node() into pcibios_scan_root()
x86/PCI: Drop return value of pcibios_scan_root()
x86/PCI: Add x86_pci_root_bus_node() to look up NUMA node from PCI bus
x86/PCI: Use x86_pci_root_bus_node() instead of get_mp_bus_to_node()
x86/PCI: Remove mp_bus_to_node[], set_mp_bus_to_node(), get_mp_bus_to_node()
x86/PCI: Remove unnecessary list_empty(&pci_root_infos) check
x86/PCI: Use NUMA_NO_NODE, not -1, for unknown node
x86/PCI: Remove acpi_get_pxm() usage
ia64 / sba_iommu: Use NUMA_NO_NODE, not MAX_NUMNODES, for unknown node
ia64: Remove acpi_get_pxm() usage
ACPI / numa: Fix acpi_get_node() prototype
ACPI / numa: Simplify acpi_get_node() style
ACPI / numa: Make __acpi_map_pxm_to_node(), acpi_get_pxm() static
ACPI / numa: Use __weak, not the gcc-specific version


arch/ia64/hp/common/sba_iommu.c | 32 +++-------
arch/ia64/include/asm/pci.h | 2 -
arch/ia64/kernel/acpi.c | 28 ++-------
arch/ia64/pci/pci.c | 10 +--
arch/x86/include/asm/pci.h | 7 --
arch/x86/include/asm/topology.h | 14 ----
arch/x86/pci/acpi.c | 29 ++-------
arch/x86/pci/amd_bus.c | 10 ---
arch/x86/pci/bus_numa.c | 13 +++-
arch/x86/pci/common.c | 128 +++++----------------------------------
arch/x86/pci/fixup.c | 6 +-
arch/x86/pci/irq.c | 6 --
arch/x86/pci/legacy.c | 4 -
arch/x86/pci/numaq_32.c | 6 +-
arch/x86/pci/visws.c | 4 +
drivers/acpi/numa.c | 16 ++---
include/acpi/acpi_numa.h | 1
include/linux/acpi.h | 9 +--
18 files changed, 75 insertions(+), 250 deletions(-)


2014-01-29 18:17:42

by Bjorn Helgaas

[permalink] [raw]
Subject: [PATCH 01/17] x86/PCI: Drop pcibios_scan_root() check for bus already scanned

The PCI core checks to see whether we've already scanned a bus, so we don't
need to do it in pcibios_scan_root(). Here's where it happens in the core:

pcibios_scan_root
pci_scan_bus_on_node
pci_scan_root_bus
pci_create_root_bus
b2 = pci_find_bus(pci_domain_nr(b), bus)
if (b2)
goto err_out; # already scanned this bus

This removes the check from pcibios_scan_root().

Signed-off-by: Bjorn Helgaas <[email protected]>
---
arch/x86/pci/common.c | 9 ---------
1 file changed, 9 deletions(-)

diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c
index 981c2dbd72cc..c47bb2288bb9 100644
--- a/arch/x86/pci/common.c
+++ b/arch/x86/pci/common.c
@@ -458,15 +458,6 @@ void __init dmi_check_pciprobe(void)

struct pci_bus *pcibios_scan_root(int busnum)
{
- struct pci_bus *bus = NULL;
-
- while ((bus = pci_find_next_bus(bus)) != NULL) {
- if (bus->number == busnum) {
- /* Already scanned */
- return bus;
- }
- }
-
return pci_scan_bus_on_node(busnum, &pci_root_ops,
get_mp_bus_to_node(busnum));
}

2014-01-29 18:17:48

by Bjorn Helgaas

[permalink] [raw]
Subject: [PATCH 02/17] x86/PCI: Use pcibios_scan_root() instead of pci_scan_bus_with_sysdata()

pci_scan_bus_with_sysdata() and pcibios_scan_root() are quite similar:

pci_scan_bus_with_sysdata
pci_scan_bus_on_node(..., &pci_root_ops, -1)

pcibios_scan_root
pci_scan_bus_on_node(..., &pci_root_ops, get_mp_bus_to_node(busnum))

get_mp_bus_to_node() returns -1 if it couldn't find the node number, so
this removes pci_scan_bus_with_sysdata() and uses pcibios_scan_root()
instead.

Signed-off-by: Bjorn Helgaas <[email protected]>
---
arch/x86/include/asm/pci.h | 1 -
arch/x86/pci/common.c | 5 -----
arch/x86/pci/fixup.c | 6 +++---
arch/x86/pci/numaq_32.c | 6 +++---
arch/x86/pci/visws.c | 4 ++--
5 files changed, 8 insertions(+), 14 deletions(-)

diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h
index 1ac6114c9ea5..4e891abf8b48 100644
--- a/arch/x86/include/asm/pci.h
+++ b/arch/x86/include/asm/pci.h
@@ -29,7 +29,6 @@ extern int noioapicreroute;
/* scan a bus after allocating a pci_sysdata for it */
extern struct pci_bus *pci_scan_bus_on_node(int busno, struct pci_ops *ops,
int node);
-extern struct pci_bus *pci_scan_bus_with_sysdata(int busno);

#ifdef CONFIG_PCI

diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c
index c47bb2288bb9..f530c7e93250 100644
--- a/arch/x86/pci/common.c
+++ b/arch/x86/pci/common.c
@@ -697,11 +697,6 @@ struct pci_bus *pci_scan_bus_on_node(int busno, struct pci_ops *ops, int node)
return bus;
}

-struct pci_bus *pci_scan_bus_with_sysdata(int busno)
-{
- return pci_scan_bus_on_node(busno, &pci_root_ops, -1);
-}
-
/*
* NUMA info for PCI busses
*
diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c
index bca9e85daaa5..201833f5f1bc 100644
--- a/arch/x86/pci/fixup.c
+++ b/arch/x86/pci/fixup.c
@@ -25,9 +25,9 @@ static void pci_fixup_i450nx(struct pci_dev *d)
dev_dbg(&d->dev, "i450NX PXB %d: %02x/%02x/%02x\n", pxb, busno,
suba, subb);
if (busno)
- pci_scan_bus_with_sysdata(busno); /* Bus A */
+ pcibios_scan_root(busno); /* Bus A */
if (suba < subb)
- pci_scan_bus_with_sysdata(suba+1); /* Bus B */
+ pcibios_scan_root(suba+1); /* Bus B */
}
pcibios_last_bus = -1;
}
@@ -42,7 +42,7 @@ static void pci_fixup_i450gx(struct pci_dev *d)
u8 busno;
pci_read_config_byte(d, 0x4a, &busno);
dev_info(&d->dev, "i440KX/GX host bridge; secondary bus %02x\n", busno);
- pci_scan_bus_with_sysdata(busno);
+ pcibios_scan_root(busno);
pcibios_last_bus = -1;
}
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454GX, pci_fixup_i450gx);
diff --git a/arch/x86/pci/numaq_32.c b/arch/x86/pci/numaq_32.c
index 72c229f9ebcf..080eb0374fff 100644
--- a/arch/x86/pci/numaq_32.c
+++ b/arch/x86/pci/numaq_32.c
@@ -135,11 +135,11 @@ static void pci_fixup_i450nx(struct pci_dev *d)
pxb, busno, suba, subb);
if (busno) {
/* Bus A */
- pci_scan_bus_with_sysdata(QUADLOCAL2BUS(quad, busno));
+ pcibios_scan_root(QUADLOCAL2BUS(quad, busno));
}
if (suba < subb) {
/* Bus B */
- pci_scan_bus_with_sysdata(QUADLOCAL2BUS(quad, suba+1));
+ pcibios_scan_root(QUADLOCAL2BUS(quad, suba+1));
}
}
pcibios_last_bus = -1;
@@ -159,7 +159,7 @@ int __init pci_numaq_init(void)
continue;
printk("Scanning PCI bus %d for quad %d\n",
QUADLOCAL2BUS(quad,0), quad);
- pci_scan_bus_with_sysdata(QUADLOCAL2BUS(quad, 0));
+ pcibios_scan_root(QUADLOCAL2BUS(quad, 0));
}
return 0;
}
diff --git a/arch/x86/pci/visws.c b/arch/x86/pci/visws.c
index 3e6d2a6db866..cd9d4d1681d2 100644
--- a/arch/x86/pci/visws.c
+++ b/arch/x86/pci/visws.c
@@ -78,8 +78,8 @@ int __init pci_visws_init(void)
"bridge B (PIIX4) bus: %u\n", pci_bus1, pci_bus0);

raw_pci_ops = &pci_direct_conf1;
- pci_scan_bus_with_sysdata(pci_bus0);
- pci_scan_bus_with_sysdata(pci_bus1);
+ pcibios_scan_root(pci_bus0);
+ pcibios_scan_root(pci_bus1);
pci_fixup_irqs(pci_common_swizzle, visws_map_irq);
pcibios_resource_survey();
/* Request bus scan */

2014-01-29 18:17:59

by Bjorn Helgaas

[permalink] [raw]
Subject: [PATCH 03/17] x86/PCI: Use pcibios_scan_root() instead of pci_scan_bus_on_node()

pcibios_scan_root() looks up the bus's NUMA node, then calls
pci_scan_bus_on_node(). This uses pcibios_scan_root() directly and drops
the node lookup in the callers.

Signed-off-by: Bjorn Helgaas <[email protected]>
---
arch/x86/pci/irq.c | 4 +---
arch/x86/pci/legacy.c | 4 +---
2 files changed, 2 insertions(+), 6 deletions(-)

diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c
index 372e9b8989b3..8658874165c2 100644
--- a/arch/x86/pci/irq.c
+++ b/arch/x86/pci/irq.c
@@ -136,11 +136,9 @@ static void __init pirq_peer_trick(void)
busmap[e->bus] = 1;
}
for (i = 1; i < 256; i++) {
- int node;
if (!busmap[i] || pci_find_bus(0, i))
continue;
- node = get_mp_bus_to_node(i);
- if (pci_scan_bus_on_node(i, &pci_root_ops, node))
+ if (pcibios_scan_root(i))
printk(KERN_INFO "PCI: Discovered primary peer "
"bus %02x [IRQ]\n", i);
}
diff --git a/arch/x86/pci/legacy.c b/arch/x86/pci/legacy.c
index 4db96fb1c232..5b662c0faf8c 100644
--- a/arch/x86/pci/legacy.c
+++ b/arch/x86/pci/legacy.c
@@ -37,19 +37,17 @@ int __init pci_legacy_init(void)
void pcibios_scan_specific_bus(int busn)
{
int devfn;
- long node;
u32 l;

if (pci_find_bus(0, busn))
return;

- node = get_mp_bus_to_node(busn);
for (devfn = 0; devfn < 256; devfn += 8) {
if (!raw_pci_read(0, busn, devfn, PCI_VENDOR_ID, 2, &l) &&
l != 0x0000 && l != 0xffff) {
DBG("Found device at %02x:%02x [%04x]\n", busn, devfn, l);
printk(KERN_INFO "PCI: Discovered peer bus %02x\n", busn);
- pci_scan_bus_on_node(busn, &pci_root_ops, node);
+ pcibios_scan_root(busn);
return;
}
}

2014-01-29 18:18:12

by Bjorn Helgaas

[permalink] [raw]
Subject: [PATCH 05/17] x86/PCI: Drop return value of pcibios_scan_root()

Nobody really uses the return value of pcibios_scan_root() (one place uses
it to control a printk, but the printk is not very useful). This converts
pcibios_scan_root() to a void function.

Signed-off-by: Bjorn Helgaas <[email protected]>
---
arch/x86/include/asm/pci.h | 2 +-
arch/x86/pci/common.c | 6 ++----
arch/x86/pci/irq.c | 4 +---
3 files changed, 4 insertions(+), 8 deletions(-)

diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h
index b52f9c0ec5fb..96ae4f4040bb 100644
--- a/arch/x86/include/asm/pci.h
+++ b/arch/x86/include/asm/pci.h
@@ -65,7 +65,7 @@ extern unsigned long pci_mem_start;

extern int pcibios_enabled;
void pcibios_config_init(void);
-struct pci_bus *pcibios_scan_root(int bus);
+void pcibios_scan_root(int bus);

void pcibios_set_master(struct pci_dev *dev);
void pcibios_penalize_isa_irq(int irq, int active);
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c
index 52ad00c2e198..600e5925f1a4 100644
--- a/arch/x86/pci/common.c
+++ b/arch/x86/pci/common.c
@@ -456,7 +456,7 @@ void __init dmi_check_pciprobe(void)
dmi_check_system(pciprobe_dmi_table);
}

-struct pci_bus *pcibios_scan_root(int busnum)
+void pcibios_scan_root(int busnum)
{
struct pci_bus *bus;
struct pci_sysdata *sd;
@@ -465,7 +465,7 @@ struct pci_bus *pcibios_scan_root(int busnum)
sd = kzalloc(sizeof(*sd), GFP_KERNEL);
if (!sd) {
printk(KERN_ERR "PCI: OOM, skipping PCI bus %02x\n", busnum);
- return NULL;
+ return;
}
sd->node = get_mp_bus_to_node(busnum);
x86_pci_root_bus_resources(busnum, &resources);
@@ -475,8 +475,6 @@ struct pci_bus *pcibios_scan_root(int busnum)
pci_free_resource_list(&resources);
kfree(sd);
}
-
- return bus;
}

void __init pcibios_set_cache_line_size(void)
diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c
index 8658874165c2..84112f55dd7a 100644
--- a/arch/x86/pci/irq.c
+++ b/arch/x86/pci/irq.c
@@ -138,9 +138,7 @@ static void __init pirq_peer_trick(void)
for (i = 1; i < 256; i++) {
if (!busmap[i] || pci_find_bus(0, i))
continue;
- if (pcibios_scan_root(i))
- printk(KERN_INFO "PCI: Discovered primary peer "
- "bus %02x [IRQ]\n", i);
+ pcibios_scan_root(i);
}
pcibios_last_bus = -1;
}

2014-01-29 18:18:19

by Bjorn Helgaas

[permalink] [raw]
Subject: [PATCH 06/17] x86/PCI: Add x86_pci_root_bus_node() to look up NUMA node from PCI bus

The AMD early_fill_mp_bus_info() already allocates a struct pci_root_info
for each PCI host bridge it finds, and that structure contains the NUMA
node number. We don't need to keep the same information in the
mp_bus_to_node[] table.

This adds x86_pci_root_bus_node(), which returns the NUMA node number, or
NUMA_NO_NODE if the node is unknown.

Note that unlike get_mp_bus_to_node(), x86_pci_root_bus_node() only works
for root buses. For example, if amd_bus.c finds a host bridge on node 1 to
[bus 00-0f], get_mp_bus_to_node() returns 1 for any bus between 00 and 0f,
but x86_pci_root_bus_node() returns 1 for bus 00 and NUMA_NO_NODE for buses
01-0f.

Signed-off-by: Bjorn Helgaas <[email protected]>
---
arch/x86/include/asm/topology.h | 1 +
arch/x86/pci/bus_numa.c | 10 ++++++++++
2 files changed, 11 insertions(+)

diff --git a/arch/x86/include/asm/topology.h b/arch/x86/include/asm/topology.h
index d35f24e231cd..09046a1a6c35 100644
--- a/arch/x86/include/asm/topology.h
+++ b/arch/x86/include/asm/topology.h
@@ -131,6 +131,7 @@ static inline void arch_fix_phys_package_id(int num, u32 slot)
}

struct pci_bus;
+int x86_pci_root_bus_node(int bus);
void x86_pci_root_bus_resources(int bus, struct list_head *resources);

#ifdef CONFIG_SMP
diff --git a/arch/x86/pci/bus_numa.c b/arch/x86/pci/bus_numa.c
index c2735feb2508..2e36a4469549 100644
--- a/arch/x86/pci/bus_numa.c
+++ b/arch/x86/pci/bus_numa.c
@@ -20,6 +20,16 @@ static struct pci_root_info *x86_find_pci_root_info(int bus)
return NULL;
}

+int x86_pci_root_bus_node(int bus)
+{
+ struct pci_root_info *info = x86_find_pci_root_info(bus);
+
+ if (!info)
+ return NUMA_NO_NODE;
+
+ return info->node;
+}
+
void x86_pci_root_bus_resources(int bus, struct list_head *resources)
{
struct pci_root_info *info = x86_find_pci_root_info(bus);

2014-01-29 18:18:26

by Bjorn Helgaas

[permalink] [raw]
Subject: [PATCH 07/17] x86/PCI: Use x86_pci_root_bus_node() instead of get_mp_bus_to_node()

This replaces all uses of get_mp_bus_to_node() with x86_pci_root_bus_node().

I think these uses are all on root buses, except possibly for blind
probing, where NUMA node information is unimportant.

Signed-off-by: Bjorn Helgaas <[email protected]>
---
arch/x86/pci/acpi.c | 2 +-
arch/x86/pci/common.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
index 4f25ec077552..3f42c5c05bf6 100644
--- a/arch/x86/pci/acpi.c
+++ b/arch/x86/pci/acpi.c
@@ -503,7 +503,7 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
set_mp_bus_to_node(busnum, node);
else
#endif
- node = get_mp_bus_to_node(busnum);
+ node = x86_pci_root_bus_node(busnum);

if (node != -1 && !node_online(node))
node = -1;
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c
index 600e5925f1a4..f7d6800f10d1 100644
--- a/arch/x86/pci/common.c
+++ b/arch/x86/pci/common.c
@@ -467,7 +467,7 @@ void pcibios_scan_root(int busnum)
printk(KERN_ERR "PCI: OOM, skipping PCI bus %02x\n", busnum);
return;
}
- sd->node = get_mp_bus_to_node(busnum);
+ sd->node = x86_pci_root_bus_node(busnum);
x86_pci_root_bus_resources(busnum, &resources);
printk(KERN_DEBUG "PCI: Probing PCI hardware (bus %02x)\n", busnum);
bus = pci_scan_root_bus(NULL, busnum, &pci_root_ops, sd, &resources);

2014-01-29 18:18:33

by Bjorn Helgaas

[permalink] [raw]
Subject: [PATCH 08/17] x86/PCI: Remove mp_bus_to_node[], set_mp_bus_to_node(), get_mp_bus_to_node()

There are no callers of get_mp_bus_to_node(), so we no longer need
mp_bus_to_node[], get_mp_bus_to_node(), or set_mp_bus_to_node().
This removes them.

Signed-off-by: Bjorn Helgaas <[email protected]>
---
arch/x86/include/asm/topology.h | 13 -------
arch/x86/pci/acpi.c | 4 +-
arch/x86/pci/amd_bus.c | 10 ------
arch/x86/pci/common.c | 69 ---------------------------------------
4 files changed, 1 insertion(+), 95 deletions(-)

diff --git a/arch/x86/include/asm/topology.h b/arch/x86/include/asm/topology.h
index 09046a1a6c35..c840571afa4e 100644
--- a/arch/x86/include/asm/topology.h
+++ b/arch/x86/include/asm/topology.h
@@ -140,17 +140,4 @@ void x86_pci_root_bus_resources(int bus, struct list_head *resources);
#define smt_capable() (smp_num_siblings > 1)
#endif

-#ifdef CONFIG_NUMA
-extern int get_mp_bus_to_node(int busnum);
-extern void set_mp_bus_to_node(int busnum, int node);
-#else
-static inline int get_mp_bus_to_node(int busnum)
-{
- return 0;
-}
-static inline void set_mp_bus_to_node(int busnum, int node)
-{
-}
-#endif
-
#endif /* _ASM_X86_TOPOLOGY_H */
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
index 3f42c5c05bf6..78f27efa11e1 100644
--- a/arch/x86/pci/acpi.c
+++ b/arch/x86/pci/acpi.c
@@ -499,10 +499,8 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
pxm = acpi_get_pxm(device->handle);
if (pxm >= 0)
node = pxm_to_node(pxm);
- if (node != -1)
- set_mp_bus_to_node(busnum, node);
- else
#endif
+ if (node == -1)
node = x86_pci_root_bus_node(busnum);

if (node != -1 && !node_online(node))
diff --git a/arch/x86/pci/amd_bus.c b/arch/x86/pci/amd_bus.c
index a48be98e9ded..a313a7fb6b86 100644
--- a/arch/x86/pci/amd_bus.c
+++ b/arch/x86/pci/amd_bus.c
@@ -44,15 +44,6 @@ static struct pci_root_info __init *find_pci_root_info(int node, int link)
return NULL;
}

-static void __init set_mp_bus_range_to_node(int min_bus, int max_bus, int node)
-{
-#ifdef CONFIG_NUMA
- int j;
-
- for (j = min_bus; j <= max_bus; j++)
- set_mp_bus_to_node(j, node);
-#endif
-}
/**
* early_fill_mp_bus_to_node()
* called before pcibios_scan_root and pci_scan_bus
@@ -117,7 +108,6 @@ static int __init early_fill_mp_bus_info(void)
min_bus = (reg >> 16) & 0xff;
max_bus = (reg >> 24) & 0xff;
node = (reg >> 4) & 0x07;
- set_mp_bus_range_to_node(min_bus, max_bus, node);
link = (reg >> 8) & 0x03;

info = alloc_pci_root_info(min_bus, max_bus, node, link);
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c
index f7d6800f10d1..d491deddebae 100644
--- a/arch/x86/pci/common.c
+++ b/arch/x86/pci/common.c
@@ -683,72 +683,3 @@ int pci_ext_cfg_avail(void)
else
return 0;
}
-
-/*
- * NUMA info for PCI busses
- *
- * Early arch code is responsible for filling in reasonable values here.
- * A node id of "-1" means "use current node". In other words, if a bus
- * has a -1 node id, it's not tightly coupled to any particular chunk
- * of memory (as is the case on some Nehalem systems).
- */
-#ifdef CONFIG_NUMA
-
-#define BUS_NR 256
-
-#ifdef CONFIG_X86_64
-
-static int mp_bus_to_node[BUS_NR] = {
- [0 ... BUS_NR - 1] = -1
-};
-
-void set_mp_bus_to_node(int busnum, int node)
-{
- if (busnum >= 0 && busnum < BUS_NR)
- mp_bus_to_node[busnum] = node;
-}
-
-int get_mp_bus_to_node(int busnum)
-{
- int node = -1;
-
- if (busnum < 0 || busnum > (BUS_NR - 1))
- return node;
-
- node = mp_bus_to_node[busnum];
-
- /*
- * let numa_node_id to decide it later in dma_alloc_pages
- * if there is no ram on that node
- */
- if (node != -1 && !node_online(node))
- node = -1;
-
- return node;
-}
-
-#else /* CONFIG_X86_32 */
-
-static int mp_bus_to_node[BUS_NR] = {
- [0 ... BUS_NR - 1] = -1
-};
-
-void set_mp_bus_to_node(int busnum, int node)
-{
- if (busnum >= 0 && busnum < BUS_NR)
- mp_bus_to_node[busnum] = (unsigned char) node;
-}
-
-int get_mp_bus_to_node(int busnum)
-{
- int node;
-
- if (busnum < 0 || busnum > (BUS_NR - 1))
- return 0;
- node = mp_bus_to_node[busnum];
- return node;
-}
-
-#endif /* CONFIG_X86_32 */
-
-#endif /* CONFIG_NUMA */

2014-01-29 18:18:41

by Bjorn Helgaas

[permalink] [raw]
Subject: [PATCH 09/17] x86/PCI: Remove unnecessary list_empty(&pci_root_infos) check

list_for_each_entry() handles empty lists, so there's no need to check
whether the list is empty first.

Signed-off-by: Bjorn Helgaas <[email protected]>
---
arch/x86/pci/bus_numa.c | 3 ---
1 file changed, 3 deletions(-)

diff --git a/arch/x86/pci/bus_numa.c b/arch/x86/pci/bus_numa.c
index 2e36a4469549..f3a2cfc14125 100644
--- a/arch/x86/pci/bus_numa.c
+++ b/arch/x86/pci/bus_numa.c
@@ -10,9 +10,6 @@ static struct pci_root_info *x86_find_pci_root_info(int bus)
{
struct pci_root_info *info;

- if (list_empty(&pci_root_infos))
- return NULL;
-
list_for_each_entry(info, &pci_root_infos, list)
if (info->busn.start == bus)
return info;

2014-01-29 18:18:51

by Bjorn Helgaas

[permalink] [raw]
Subject: [PATCH 10/17] x86/PCI: Use NUMA_NO_NODE, not -1, for unknown node

NUMA_NO_NODE is the usual value for "we don't know what node this is on,"
e.g., it is the error return from acpi_get_node(). This changes uses of -1
to NUMA_NO_NODE. NUMA_NO_NODE is #defined to be -1 already, so this is not
a functional change.

Signed-off-by: Bjorn Helgaas <[email protected]>
---
arch/x86/pci/acpi.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
index 78f27efa11e1..6304ea0f426d 100644
--- a/arch/x86/pci/acpi.c
+++ b/arch/x86/pci/acpi.c
@@ -494,17 +494,17 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
return NULL;
}

- node = -1;
+ node = NUMA_NO_NODE;
#ifdef CONFIG_ACPI_NUMA
pxm = acpi_get_pxm(device->handle);
if (pxm >= 0)
node = pxm_to_node(pxm);
#endif
- if (node == -1)
+ if (node == NUMA_NO_NODE)
node = x86_pci_root_bus_node(busnum);

- if (node != -1 && !node_online(node))
- node = -1;
+ if (node != NUMA_NO_NODE && !node_online(node))
+ node = NUMA_NO_NODE;

info = kzalloc(sizeof(*info), GFP_KERNEL);
if (!info) {
@@ -570,7 +570,7 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
pcie_bus_configure_settings(child);
}

- if (bus && node != -1) {
+ if (bus && node != NUMA_NO_NODE) {
#ifdef CONFIG_ACPI_NUMA
if (pxm >= 0)
dev_printk(KERN_DEBUG, &bus->dev,

2014-01-29 18:18:57

by Bjorn Helgaas

[permalink] [raw]
Subject: [PATCH 11/17] x86/PCI: Remove acpi_get_pxm() usage

The PCI host bridge code doesn't care about _PXM values directly; it only
needs to know what NUMA node the hardware is on.

This uses acpi_get_node() directly and removes the _PXM stuff.

Signed-off-by: Bjorn Helgaas <[email protected]>
---
arch/x86/pci/acpi.c | 19 ++-----------------
1 file changed, 2 insertions(+), 17 deletions(-)

diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
index 6304ea0f426d..f44a64c74e37 100644
--- a/arch/x86/pci/acpi.c
+++ b/arch/x86/pci/acpi.c
@@ -480,9 +480,6 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
struct pci_bus *bus = NULL;
struct pci_sysdata *sd;
int node;
-#ifdef CONFIG_ACPI_NUMA
- int pxm;
-#endif

if (pci_ignore_seg)
domain = 0;
@@ -494,12 +491,7 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
return NULL;
}

- node = NUMA_NO_NODE;
-#ifdef CONFIG_ACPI_NUMA
- pxm = acpi_get_pxm(device->handle);
- if (pxm >= 0)
- node = pxm_to_node(pxm);
-#endif
+ node = acpi_get_node(device->handle);
if (node == NUMA_NO_NODE)
node = x86_pci_root_bus_node(busnum);

@@ -570,15 +562,8 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
pcie_bus_configure_settings(child);
}

- if (bus && node != NUMA_NO_NODE) {
-#ifdef CONFIG_ACPI_NUMA
- if (pxm >= 0)
- dev_printk(KERN_DEBUG, &bus->dev,
- "on NUMA node %d (pxm %d)\n", node, pxm);
-#else
+ if (bus && node != NUMA_NO_NODE)
dev_printk(KERN_DEBUG, &bus->dev, "on NUMA node %d\n", node);
-#endif
- }

return bus;
}

2014-01-29 18:19:01

by Bjorn Helgaas

[permalink] [raw]
Subject: [PATCH 12/17] ia64 / sba_iommu: Use NUMA_NO_NODE, not MAX_NUMNODES, for unknown node

MAX_NUMNODES is typically used for sizing arrays. NUMA_NO_NODE is the
usual value for "we don't know what node this is on," e.g., it is the
error return from acpi_get_node().

This changes the ioc->node value for unknown nodes from MAX_NUMNODES to
NUMA_NO_NODE.

Signed-off-by: Bjorn Helgaas <[email protected]>
---
arch/ia64/hp/common/sba_iommu.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c
index 8e858b593e4f..a52d6b49b7ce 100644
--- a/arch/ia64/hp/common/sba_iommu.c
+++ b/arch/ia64/hp/common/sba_iommu.c
@@ -1140,11 +1140,13 @@ sba_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle,

#ifdef CONFIG_NUMA
{
+ int node = ioc->node;
struct page *page;
- page = alloc_pages_exact_node(ioc->node == MAX_NUMNODES ?
- numa_node_id() : ioc->node, flags,
- get_order(size));

+ if (node == NUMA_NO_NODE)
+ node = numa_node_id();
+
+ page = alloc_pages_exact_node(node, flags, get_order(size));
if (unlikely(!page))
return NULL;

@@ -1914,7 +1916,7 @@ ioc_show(struct seq_file *s, void *v)
seq_printf(s, "Hewlett Packard %s IOC rev %d.%d\n",
ioc->name, ((ioc->rev >> 4) & 0xF), (ioc->rev & 0xF));
#ifdef CONFIG_NUMA
- if (ioc->node != MAX_NUMNODES)
+ if (ioc->node != NUMA_NO_NODE)
seq_printf(s, "NUMA node : %d\n", ioc->node);
#endif
seq_printf(s, "IOVA size : %ld MB\n", ((ioc->pdir_size >> 3) * iovp_size)/(1024*1024));
@@ -2022,7 +2024,7 @@ sba_map_ioc_to_node(struct ioc *ioc, acpi_handle handle)
unsigned int node;
int pxm;

- ioc->node = MAX_NUMNODES;
+ ioc->node = NUMA_NO_NODE;

pxm = acpi_get_pxm(handle);

@@ -2031,7 +2033,7 @@ sba_map_ioc_to_node(struct ioc *ioc, acpi_handle handle)

node = pxm_to_node(pxm);

- if (node >= MAX_NUMNODES || !node_online(node))
+ if (node == NUMA_NO_NODE || !node_online(node))
return;

ioc->node = node;

2014-01-29 18:19:09

by Bjorn Helgaas

[permalink] [raw]
Subject: [PATCH 13/17] ia64: Remove acpi_get_pxm() usage

The IOMMU, LSAPIC, IOSAPIC, and PCI host bridge code doesn't care about
_PXM values directly; it only needs to know what NUMA node the hardware is
on.

This uses acpi_get_node() directly and removes the _PXM stuff.

Signed-off-by: Bjorn Helgaas <[email protected]>
---
arch/ia64/hp/common/sba_iommu.c | 22 +++++-----------------
arch/ia64/include/asm/pci.h | 2 +-
arch/ia64/kernel/acpi.c | 28 +++++++---------------------
arch/ia64/pci/pci.c | 10 ++--------
4 files changed, 15 insertions(+), 47 deletions(-)

diff --git a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c
index a52d6b49b7ce..007361d59aa6 100644
--- a/arch/ia64/hp/common/sba_iommu.c
+++ b/arch/ia64/hp/common/sba_iommu.c
@@ -2017,31 +2017,19 @@ sba_connect_bus(struct pci_bus *bus)
printk(KERN_WARNING "No IOC for PCI Bus %04x:%02x in ACPI\n", pci_domain_nr(bus), bus->number);
}

-#ifdef CONFIG_NUMA
static void __init
sba_map_ioc_to_node(struct ioc *ioc, acpi_handle handle)
{
+#ifdef CONFIG_NUMA
unsigned int node;
- int pxm;
-
- ioc->node = NUMA_NO_NODE;
-
- pxm = acpi_get_pxm(handle);
-
- if (pxm < 0)
- return;

- node = pxm_to_node(pxm);
-
- if (node == NUMA_NO_NODE || !node_online(node))
- return;
+ node = acpi_get_node(handle);
+ if (node != NUMA_NO_NODE && !node_online(node))
+ node = NUMA_NO_NODE;

ioc->node = node;
- return;
-}
-#else
-#define sba_map_ioc_to_node(ioc, handle)
#endif
+}

static int __init
acpi_sba_ioc_add(struct acpi_device *device,
diff --git a/arch/ia64/include/asm/pci.h b/arch/ia64/include/asm/pci.h
index 71fbaaa495cc..7d41cc089822 100644
--- a/arch/ia64/include/asm/pci.h
+++ b/arch/ia64/include/asm/pci.h
@@ -98,7 +98,7 @@ struct pci_controller {
struct acpi_device *companion;
void *iommu;
int segment;
- int node; /* nearest node with memory or -1 for global allocation */
+ int node; /* nearest node with memory or NUMA_NO_NODE for global allocation */

void *platform_data;
};
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c
index 07d209c9507f..5a585ebe9df3 100644
--- a/arch/ia64/kernel/acpi.c
+++ b/arch/ia64/kernel/acpi.c
@@ -803,14 +803,9 @@ int acpi_isa_irq_to_gsi(unsigned isa_irq, u32 *gsi)
* ACPI based hotplug CPU support
*/
#ifdef CONFIG_ACPI_HOTPLUG_CPU
-static
-int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
+static int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
{
#ifdef CONFIG_ACPI_NUMA
- int pxm_id;
- int nid;
-
- pxm_id = acpi_get_pxm(handle);
/*
* We don't have cpu-only-node hotadd. But if the system equips
* SRAT table, pxm is already found and node is ready.
@@ -818,11 +813,10 @@ int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
* This code here is for the system which doesn't have full SRAT
* table for possible cpus.
*/
- nid = acpi_map_pxm_to_node(pxm_id);
node_cpuid[cpu].phys_id = physid;
- node_cpuid[cpu].nid = nid;
+ node_cpuid[cpu].nid = acpi_get_node(handle);
#endif
- return (0);
+ return 0;
}

int additional_cpus __initdata = -1;
@@ -929,7 +923,7 @@ static acpi_status acpi_map_iosapic(acpi_handle handle, u32 depth,
union acpi_object *obj;
struct acpi_madt_io_sapic *iosapic;
unsigned int gsi_base;
- int pxm, node;
+ int node;

/* Only care about objects w/ a method that returns the MADT */
if (ACPI_FAILURE(acpi_evaluate_object(handle, "_MAT", NULL, &buffer)))
@@ -956,17 +950,9 @@ static acpi_status acpi_map_iosapic(acpi_handle handle, u32 depth,

kfree(buffer.pointer);

- /*
- * OK, it's an IOSAPIC MADT entry, look for a _PXM value to tell
- * us which node to associate this with.
- */
- pxm = acpi_get_pxm(handle);
- if (pxm < 0)
- return AE_OK;
-
- node = pxm_to_node(pxm);
-
- if (node >= MAX_NUMNODES || !node_online(node) ||
+ /* OK, it's an IOSAPIC MADT entry; associate it with a node */
+ node = acpi_get_node(handle);
+ if (node == NUMA_NO_NODE || !node_online(node) ||
cpumask_empty(cpumask_of_node(node)))
return AE_OK;

diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c
index 9e4938d8ca4d..291a582777cf 100644
--- a/arch/ia64/pci/pci.c
+++ b/arch/ia64/pci/pci.c
@@ -126,7 +126,6 @@ static struct pci_controller *alloc_pci_controller(int seg)
return NULL;

controller->segment = seg;
- controller->node = -1;
return controller;
}

@@ -430,19 +429,14 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
struct pci_root_info *info = NULL;
int busnum = root->secondary.start;
struct pci_bus *pbus;
- int pxm, ret;
+ int ret;

controller = alloc_pci_controller(domain);
if (!controller)
return NULL;

controller->companion = device;
-
- pxm = acpi_get_pxm(device->handle);
-#ifdef CONFIG_NUMA
- if (pxm >= 0)
- controller->node = pxm_to_node(pxm);
-#endif
+ controller->node = acpi_get_node(device->handle);

info = kzalloc(sizeof(*info), GFP_KERNEL);
if (!info) {

2014-01-29 18:19:21

by Bjorn Helgaas

[permalink] [raw]
Subject: [PATCH 14/17] ACPI / numa: Fix acpi_get_node() prototype

acpi_get_node() takes an acpi_handle, not an "acpi_handle *". This
fixes the prototype and the definitions.

Signed-off-by: Bjorn Helgaas <[email protected]>
---
drivers/acpi/numa.c | 2 +-
include/linux/acpi.h | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c
index 9e6816ef280a..dab7dac6b1a8 100644
--- a/drivers/acpi/numa.c
+++ b/drivers/acpi/numa.c
@@ -331,7 +331,7 @@ int acpi_get_pxm(acpi_handle h)
return -1;
}

-int acpi_get_node(acpi_handle *handle)
+int acpi_get_node(acpi_handle handle)
{
int pxm, node = NUMA_NO_NODE;

diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index 1151a1dcfe41..17bee650a0cb 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -260,13 +260,13 @@ extern void acpi_osi_setup(char *str);

#ifdef CONFIG_ACPI_NUMA
int acpi_get_pxm(acpi_handle handle);
-int acpi_get_node(acpi_handle *handle);
+int acpi_get_node(acpi_handle handle);
#else
static inline int acpi_get_pxm(acpi_handle handle)
{
return 0;
}
-static inline int acpi_get_node(acpi_handle *handle)
+static inline int acpi_get_node(acpi_handle handle)
{
return 0;
}

2014-01-29 18:19:25

by Bjorn Helgaas

[permalink] [raw]
Subject: [PATCH 15/17] ACPI / numa: Simplify acpi_get_node() style

Simplify control flow by removing local variable initialization and
returning a constant as soon as possible. No functional change.

Signed-off-by: Bjorn Helgaas <[email protected]>
---
drivers/acpi/numa.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c
index dab7dac6b1a8..a7e779bfa2f6 100644
--- a/drivers/acpi/numa.c
+++ b/drivers/acpi/numa.c
@@ -333,12 +333,12 @@ int acpi_get_pxm(acpi_handle h)

int acpi_get_node(acpi_handle handle)
{
- int pxm, node = NUMA_NO_NODE;
+ int pxm;

pxm = acpi_get_pxm(handle);
- if (pxm >= 0 && pxm < MAX_PXM_DOMAINS)
- node = acpi_map_pxm_to_node(pxm);
+ if (pxm < 0 || pxm >= MAX_PXM_DOMAINS)
+ return NUMA_NO_NODE;

- return node;
+ return acpi_map_pxm_to_node(pxm);
}
EXPORT_SYMBOL(acpi_get_node);

2014-01-29 18:19:32

by Bjorn Helgaas

[permalink] [raw]
Subject: [PATCH 16/17] ACPI / numa: Make __acpi_map_pxm_to_node(), acpi_get_pxm() static

__acpi_map_pxm_to_node() and acpi_get_pxm() are only used within
drivers/acpi/numa.c. This makes them static and removes their
declarations.

Signed-off-by: Bjorn Helgaas <[email protected]>
---
drivers/acpi/numa.c | 4 ++--
include/acpi/acpi_numa.h | 1 -
include/linux/acpi.h | 5 -----
3 files changed, 2 insertions(+), 8 deletions(-)

diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c
index a7e779bfa2f6..359a43bdd948 100644
--- a/drivers/acpi/numa.c
+++ b/drivers/acpi/numa.c
@@ -60,7 +60,7 @@ int node_to_pxm(int node)
return node_to_pxm_map[node];
}

-void __acpi_map_pxm_to_node(int pxm, int node)
+static void __acpi_map_pxm_to_node(int pxm, int node)
{
if (pxm_to_node_map[pxm] == NUMA_NO_NODE || node < pxm_to_node_map[pxm])
pxm_to_node_map[pxm] = node;
@@ -314,7 +314,7 @@ int __init acpi_numa_init(void)
return 0;
}

-int acpi_get_pxm(acpi_handle h)
+static int acpi_get_pxm(acpi_handle h)
{
unsigned long long pxm;
acpi_status status;
diff --git a/include/acpi/acpi_numa.h b/include/acpi/acpi_numa.h
index 451823cb8837..94a37cd7fbda 100644
--- a/include/acpi/acpi_numa.h
+++ b/include/acpi/acpi_numa.h
@@ -13,7 +13,6 @@

extern int pxm_to_node(int);
extern int node_to_pxm(int);
-extern void __acpi_map_pxm_to_node(int, int);
extern int acpi_map_pxm_to_node(int);
extern unsigned char acpi_srat_revision;

diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index 17bee650a0cb..6c29abbefd41 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -259,13 +259,8 @@ extern void acpi_dmi_osi_linux(int enable, const struct dmi_system_id *d);
extern void acpi_osi_setup(char *str);

#ifdef CONFIG_ACPI_NUMA
-int acpi_get_pxm(acpi_handle handle);
int acpi_get_node(acpi_handle handle);
#else
-static inline int acpi_get_pxm(acpi_handle handle)
-{
- return 0;
-}
static inline int acpi_get_node(acpi_handle handle)
{
return 0;

2014-01-29 18:19:39

by Bjorn Helgaas

[permalink] [raw]
Subject: [PATCH 17/17] ACPI / numa: Use __weak, not the gcc-specific version

Use "__weak" instead of the gcc-specific "__attribute__ ((weak))".

Signed-off-by: Bjorn Helgaas <[email protected]>
---
drivers/acpi/numa.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c
index 359a43bdd948..24b5476449a1 100644
--- a/drivers/acpi/numa.c
+++ b/drivers/acpi/numa.c
@@ -193,7 +193,7 @@ static int __init acpi_parse_slit(struct acpi_table_header *table)
return 0;
}

-void __init __attribute__ ((weak))
+void __init __weak
acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)
{
printk(KERN_WARNING PREFIX

2014-01-29 18:24:11

by Bjorn Helgaas

[permalink] [raw]
Subject: [PATCH 04/17] x86/PCI: Merge pci_scan_bus_on_node() into pcibios_scan_root()

pci_scan_bus_on_node() is only called by pcibios_scan_root().
This merges pci_scan_bus_on_node() into pcibios_scan_root() and removes
pci_scan_bus_on_node().

Signed-off-by: Bjorn Helgaas <[email protected]>
---
arch/x86/include/asm/pci.h | 4 ----
arch/x86/pci/common.c | 49 +++++++++++++++++---------------------------
2 files changed, 19 insertions(+), 34 deletions(-)

diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h
index 4e891abf8b48..b52f9c0ec5fb 100644
--- a/arch/x86/include/asm/pci.h
+++ b/arch/x86/include/asm/pci.h
@@ -26,10 +26,6 @@ extern int pci_routeirq;
extern int noioapicquirk;
extern int noioapicreroute;

-/* scan a bus after allocating a pci_sysdata for it */
-extern struct pci_bus *pci_scan_bus_on_node(int busno, struct pci_ops *ops,
- int node);
-
#ifdef CONFIG_PCI

#ifdef CONFIG_PCI_DOMAINS
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c
index f530c7e93250..52ad00c2e198 100644
--- a/arch/x86/pci/common.c
+++ b/arch/x86/pci/common.c
@@ -458,8 +458,25 @@ void __init dmi_check_pciprobe(void)

struct pci_bus *pcibios_scan_root(int busnum)
{
- return pci_scan_bus_on_node(busnum, &pci_root_ops,
- get_mp_bus_to_node(busnum));
+ struct pci_bus *bus;
+ struct pci_sysdata *sd;
+ LIST_HEAD(resources);
+
+ sd = kzalloc(sizeof(*sd), GFP_KERNEL);
+ if (!sd) {
+ printk(KERN_ERR "PCI: OOM, skipping PCI bus %02x\n", busnum);
+ return NULL;
+ }
+ sd->node = get_mp_bus_to_node(busnum);
+ x86_pci_root_bus_resources(busnum, &resources);
+ printk(KERN_DEBUG "PCI: Probing PCI hardware (bus %02x)\n", busnum);
+ bus = pci_scan_root_bus(NULL, busnum, &pci_root_ops, sd, &resources);
+ if (!bus) {
+ pci_free_resource_list(&resources);
+ kfree(sd);
+ }
+
+ return bus;
}

void __init pcibios_set_cache_line_size(void)
@@ -669,34 +686,6 @@ int pci_ext_cfg_avail(void)
return 0;
}

-struct pci_bus *pci_scan_bus_on_node(int busno, struct pci_ops *ops, int node)
-{
- LIST_HEAD(resources);
- struct pci_bus *bus = NULL;
- struct pci_sysdata *sd;
-
- /*
- * Allocate per-root-bus (not per bus) arch-specific data.
- * TODO: leak; this memory is never freed.
- * It's arguable whether it's worth the trouble to care.
- */
- sd = kzalloc(sizeof(*sd), GFP_KERNEL);
- if (!sd) {
- printk(KERN_ERR "PCI: OOM, skipping PCI bus %02x\n", busno);
- return NULL;
- }
- sd->node = node;
- x86_pci_root_bus_resources(busno, &resources);
- printk(KERN_DEBUG "PCI: Probing PCI hardware (bus %02x)\n", busno);
- bus = pci_scan_root_bus(NULL, busno, ops, sd, &resources);
- if (!bus) {
- pci_free_resource_list(&resources);
- kfree(sd);
- }
-
- return bus;
-}
-
/*
* NUMA info for PCI busses
*

2014-01-29 21:09:25

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [PATCH 00/17] x86, ia64 NUMA cleanup

On Wednesday, January 29, 2014 11:17:25 AM Bjorn Helgaas wrote:
> This is all cleanup: it adds no new functionality and should make no
> functional difference at all except a printk change or two.
>
> The main ideas are:
>
> - Clean up the x86 PCI bus scanning interfaces. We had:
> struct pci_bus *pci_scan_bus_on_node(int bus, struct pci_ops *, int node)
> struct pci_bus *pcibios_scan_root(int bus)
> struct pci_bus *pci_scan_bus_with_sysdata(int bus)
> void pcibios_scan_specific_bus(int bus)
> These were all basically the same, so I kept only pcibios_scan_root().
>
> - Get rid of mp_bus_to_node[]. This was basically a way of passing node
> info from the AMD "native host bridg driver" (amd_bus.c) into the PCI
> core. It was clunky and inconsistent between x86-64 and i386. I
> replaced it with x86_pci_root_bus_node(), analogous to the existing
> x86_pci_root_bus_resources().
>
> - Remove _PXM knowledge from the PCI host bridge, IOMMU, and APIC code.
> They really only care about the NUMA node number, not the raw _PXM
> value.
>
> ---
>
> Bjorn Helgaas (17):
> x86/PCI: Drop pcibios_scan_root() check for bus already scanned
> x86/PCI: Use pcibios_scan_root() instead of pci_scan_bus_with_sysdata()
> x86/PCI: Use pcibios_scan_root() instead of pci_scan_bus_on_node()
> x86/PCI: Merge pci_scan_bus_on_node() into pcibios_scan_root()
> x86/PCI: Drop return value of pcibios_scan_root()
> x86/PCI: Add x86_pci_root_bus_node() to look up NUMA node from PCI bus
> x86/PCI: Use x86_pci_root_bus_node() instead of get_mp_bus_to_node()
> x86/PCI: Remove mp_bus_to_node[], set_mp_bus_to_node(), get_mp_bus_to_node()
> x86/PCI: Remove unnecessary list_empty(&pci_root_infos) check
> x86/PCI: Use NUMA_NO_NODE, not -1, for unknown node
> x86/PCI: Remove acpi_get_pxm() usage
> ia64 / sba_iommu: Use NUMA_NO_NODE, not MAX_NUMNODES, for unknown node
> ia64: Remove acpi_get_pxm() usage
> ACPI / numa: Fix acpi_get_node() prototype
> ACPI / numa: Simplify acpi_get_node() style
> ACPI / numa: Make __acpi_map_pxm_to_node(), acpi_get_pxm() static
> ACPI / numa: Use __weak, not the gcc-specific version
>
>
> arch/ia64/hp/common/sba_iommu.c | 32 +++-------
> arch/ia64/include/asm/pci.h | 2 -
> arch/ia64/kernel/acpi.c | 28 ++-------
> arch/ia64/pci/pci.c | 10 +--
> arch/x86/include/asm/pci.h | 7 --
> arch/x86/include/asm/topology.h | 14 ----
> arch/x86/pci/acpi.c | 29 ++-------
> arch/x86/pci/amd_bus.c | 10 ---
> arch/x86/pci/bus_numa.c | 13 +++-
> arch/x86/pci/common.c | 128 +++++----------------------------------
> arch/x86/pci/fixup.c | 6 +-
> arch/x86/pci/irq.c | 6 --
> arch/x86/pci/legacy.c | 4 -
> arch/x86/pci/numaq_32.c | 6 +-
> arch/x86/pci/visws.c | 4 +
> drivers/acpi/numa.c | 16 ++---
> include/acpi/acpi_numa.h | 1
> include/linux/acpi.h | 9 +--
> 18 files changed, 75 insertions(+), 250 deletions(-)

Acked-by: Rafael J. Wysocki <[email protected]>

for the whole series.

Thanks!

--
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.

2014-02-03 19:23:51

by Bjorn Helgaas

[permalink] [raw]
Subject: Re: [PATCH 00/17] x86, ia64 NUMA cleanup

[+cc Tony]

On Wed, Jan 29, 2014 at 11:17 AM, Bjorn Helgaas <[email protected]> wrote:
> This is all cleanup: it adds no new functionality and should make no
> functional difference at all except a printk change or two.
>
> The main ideas are:
>
> - Clean up the x86 PCI bus scanning interfaces. We had:
> struct pci_bus *pci_scan_bus_on_node(int bus, struct pci_ops *, int node)
> struct pci_bus *pcibios_scan_root(int bus)
> struct pci_bus *pci_scan_bus_with_sysdata(int bus)
> void pcibios_scan_specific_bus(int bus)
> These were all basically the same, so I kept only pcibios_scan_root().
>
> - Get rid of mp_bus_to_node[]. This was basically a way of passing node
> info from the AMD "native host bridg driver" (amd_bus.c) into the PCI
> core. It was clunky and inconsistent between x86-64 and i386. I
> replaced it with x86_pci_root_bus_node(), analogous to the existing
> x86_pci_root_bus_resources().
>
> - Remove _PXM knowledge from the PCI host bridge, IOMMU, and APIC code.
> They really only care about the NUMA node number, not the raw _PXM
> value.
>
> ---
>
> Bjorn Helgaas (17):
> x86/PCI: Drop pcibios_scan_root() check for bus already scanned
> x86/PCI: Use pcibios_scan_root() instead of pci_scan_bus_with_sysdata()
> x86/PCI: Use pcibios_scan_root() instead of pci_scan_bus_on_node()
> x86/PCI: Merge pci_scan_bus_on_node() into pcibios_scan_root()
> x86/PCI: Drop return value of pcibios_scan_root()
> x86/PCI: Add x86_pci_root_bus_node() to look up NUMA node from PCI bus
> x86/PCI: Use x86_pci_root_bus_node() instead of get_mp_bus_to_node()
> x86/PCI: Remove mp_bus_to_node[], set_mp_bus_to_node(), get_mp_bus_to_node()
> x86/PCI: Remove unnecessary list_empty(&pci_root_infos) check
> x86/PCI: Use NUMA_NO_NODE, not -1, for unknown node
> x86/PCI: Remove acpi_get_pxm() usage
> ia64 / sba_iommu: Use NUMA_NO_NODE, not MAX_NUMNODES, for unknown node
> ia64: Remove acpi_get_pxm() usage
> ACPI / numa: Fix acpi_get_node() prototype
> ACPI / numa: Simplify acpi_get_node() style
> ACPI / numa: Make __acpi_map_pxm_to_node(), acpi_get_pxm() static
> ACPI / numa: Use __weak, not the gcc-specific version
>
>
> arch/ia64/hp/common/sba_iommu.c | 32 +++-------
> arch/ia64/include/asm/pci.h | 2 -
> arch/ia64/kernel/acpi.c | 28 ++-------
> arch/ia64/pci/pci.c | 10 +--
> arch/x86/include/asm/pci.h | 7 --
> arch/x86/include/asm/topology.h | 14 ----
> arch/x86/pci/acpi.c | 29 ++-------
> arch/x86/pci/amd_bus.c | 10 ---
> arch/x86/pci/bus_numa.c | 13 +++-
> arch/x86/pci/common.c | 128 +++++----------------------------------
> arch/x86/pci/fixup.c | 6 +-
> arch/x86/pci/irq.c | 6 --
> arch/x86/pci/legacy.c | 4 -
> arch/x86/pci/numaq_32.c | 6 +-
> arch/x86/pci/visws.c | 4 +
> drivers/acpi/numa.c | 16 ++---
> include/acpi/acpi_numa.h | 1
> include/linux/acpi.h | 9 +--
> 18 files changed, 75 insertions(+), 250 deletions(-)

I added this series to my "next" branch for v3.14. Tony, let me know
if you see any ia64 issues.

Bjorn

2014-02-04 18:33:09

by Luck, Tony

[permalink] [raw]
Subject: RE: [PATCH 00/17] x86, ia64 NUMA cleanup

> I added this series to my "next" branch for v3.14. Tony, let me know
> if you see any ia64 issues.

It showed up in next-20140204 - and doesn't seem to have caused any build or boot
problems on my test machines.

-Tony
????{.n?+???????+%?????ݶ??w??{.n?+????{??G?????{ay?ʇڙ?,j??f???h?????????z_??(?階?ݢj"???m??????G????????????&???~???iO???z??v?^?m???? ????????I?