Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 62388
b: refs/heads/master
c: 3484d79
h: refs/heads/master
v: v3
  • Loading branch information
David Rientjes authored and Linus Torvalds committed Jul 22, 2007
1 parent 55d5e50 commit aebebd7
Show file tree
Hide file tree
Showing 7 changed files with 97 additions and 8 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3af044e0f832cfa3fcdce14dc30678b79dd36995
refs/heads/master: 3484d79813707bb6045773953a809abba443dc20
1 change: 1 addition & 0 deletions trunk/arch/x86_64/mm/numa.c
Original file line number Diff line number Diff line change
Expand Up @@ -484,6 +484,7 @@ static int __init numa_emulation(unsigned long start_pfn, unsigned long end_pfn)
nodes[i].end >> PAGE_SHIFT);
setup_node_bootmem(i, nodes[i].start, nodes[i].end);
}
acpi_fake_nodes(nodes, num_nodes);
numa_init_array();
return 0;
}
Expand Down
76 changes: 73 additions & 3 deletions trunk/arch/x86_64/mm/srat.c
Original file line number Diff line number Diff line change
Expand Up @@ -350,7 +350,7 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)

/* Sanity check to catch more bad SRATs (they are amazingly common).
Make sure the PXMs cover all memory. */
static int nodes_cover_memory(void)
static int __init nodes_cover_memory(const struct bootnode *nodes)
{
int i;
unsigned long pxmram, e820ram;
Expand Down Expand Up @@ -406,7 +406,7 @@ int __init acpi_scan_nodes(unsigned long start, unsigned long end)
}
}

if (!nodes_cover_memory()) {
if (!nodes_cover_memory(nodes)) {
bad_srat();
return -1;
}
Expand Down Expand Up @@ -440,6 +440,75 @@ int __init acpi_scan_nodes(unsigned long start, unsigned long end)
return 0;
}

#ifdef CONFIG_NUMA_EMU
static int __init find_node_by_addr(unsigned long addr)
{
int ret = NUMA_NO_NODE;
int i;

for_each_node_mask(i, nodes_parsed) {
/*
* Find the real node that this emulated node appears on. For
* the sake of simplicity, we only use a real node's starting
* address to determine which emulated node it appears on.
*/
if (addr >= nodes[i].start && addr < nodes[i].end) {
ret = i;
break;
}
}
return i;
}

/*
* In NUMA emulation, we need to setup proximity domain (_PXM) to node ID
* mappings that respect the real ACPI topology but reflect our emulated
* environment. For each emulated node, we find which real node it appears on
* and create PXM to NID mappings for those fake nodes which mirror that
* locality. SLIT will now represent the correct distances between emulated
* nodes as a result of the real topology.
*/
void __init acpi_fake_nodes(const struct bootnode *fake_nodes, int num_nodes)
{
int i;
int fake_node_to_pxm_map[MAX_NUMNODES] = {
[0 ... MAX_NUMNODES-1] = PXM_INVAL
};

printk(KERN_INFO "Faking PXM affinity for fake nodes on real "
"topology.\n");
for (i = 0; i < num_nodes; i++) {
int nid, pxm;

nid = find_node_by_addr(fake_nodes[i].start);
if (nid == NUMA_NO_NODE)
continue;
pxm = node_to_pxm(nid);
if (pxm == PXM_INVAL)
continue;
fake_node_to_pxm_map[i] = pxm;
}
for (i = 0; i < num_nodes; i++)
__acpi_map_pxm_to_node(fake_node_to_pxm_map[i], i);

nodes_clear(nodes_parsed);
for (i = 0; i < num_nodes; i++)
if (fake_nodes[i].start != fake_nodes[i].end)
node_set(i, nodes_parsed);
WARN_ON(!nodes_cover_memory(fake_nodes));
}

static int null_slit_node_compare(int a, int b)
{
return node_to_pxm(a) == node_to_pxm(b);
}
#else
static int null_slit_node_compare(int a, int b)
{
return a == b;
}
#endif /* CONFIG_NUMA_EMU */

void __init srat_reserve_add_area(int nodeid)
{
if (found_add_area && nodes_add[nodeid].end) {
Expand All @@ -464,7 +533,8 @@ int __node_distance(int a, int b)
int index;

if (!acpi_slit)
return a == b ? LOCAL_DISTANCE : REMOTE_DISTANCE;
return null_slit_node_compare(a, b) ? LOCAL_DISTANCE :
REMOTE_DISTANCE;
index = acpi_slit->locality_count * node_to_pxm(a);
return acpi_slit->entry[index + node_to_pxm(b)];
}
Expand Down
11 changes: 7 additions & 4 deletions trunk/drivers/acpi/numa.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@
ACPI_MODULE_NAME("numa");

static nodemask_t nodes_found_map = NODE_MASK_NONE;
#define PXM_INVAL -1
#define NID_INVAL -1

/* maps to convert between proximity domain and logical node ID */
static int __cpuinitdata pxm_to_node_map[MAX_PXM_DOMAINS]
Expand All @@ -59,6 +57,12 @@ int node_to_pxm(int node)
return node_to_pxm_map[node];
}

void __acpi_map_pxm_to_node(int pxm, int node)
{
pxm_to_node_map[pxm] = node;
node_to_pxm_map[node] = pxm;
}

int acpi_map_pxm_to_node(int pxm)
{
int node = pxm_to_node_map[pxm];
Expand All @@ -67,8 +71,7 @@ int acpi_map_pxm_to_node(int pxm)
if (nodes_weight(nodes_found_map) >= MAX_NUMNODES)
return NID_INVAL;
node = first_unset_node(nodes_found_map);
pxm_to_node_map[pxm] = node;
node_to_pxm_map[node] = pxm;
__acpi_map_pxm_to_node(pxm, node);
node_set(node, nodes_found_map);
}

Expand Down
1 change: 1 addition & 0 deletions trunk/include/acpi/acpi_numa.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

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 void __cpuinit acpi_unmap_pxm_to_node(int);

Expand Down
11 changes: 11 additions & 0 deletions trunk/include/asm-x86_64/acpi.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#ifdef __KERNEL__

#include <acpi/pdc_intel.h>
#include <asm/numa.h>

#define COMPILER_DEPENDENT_INT64 long long
#define COMPILER_DEPENDENT_UINT64 unsigned long long
Expand Down Expand Up @@ -141,6 +142,16 @@ extern int acpi_pci_disabled;
extern int acpi_skip_timer_override;
extern int acpi_use_timer_override;

#ifdef CONFIG_ACPI_NUMA
extern void __init acpi_fake_nodes(const struct bootnode *fake_nodes,
int num_nodes);
#else
static inline void acpi_fake_nodes(const struct bootnode *fake_nodes,
int num_nodes)
{
}
#endif

#endif /*__KERNEL__*/

#endif /*_ASM_ACPI_H*/
3 changes: 3 additions & 0 deletions trunk/include/linux/acpi.h
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,9 @@ extern int acpi_paddr_to_node(u64 start_addr, u64 size);

extern int pnpacpi_disabled;

#define PXM_INVAL (-1)
#define NID_INVAL (-1)

#else /* CONFIG_ACPI */

static inline int acpi_boot_init(void)
Expand Down

0 comments on commit aebebd7

Please sign in to comment.