mirror of
https://github.com/torvalds/linux.git
synced 2026-09-15 15:01:08 -04:00
Remove the statically allocated memory to NUMA node hash map in favor of a dynamically allocated memory to node hash map (it is cache aligned). This patch has the nice side effect in that it allows the hash map to grow for systems with large amounts of memory (256GB - 1TB), but suffer from having small PCI space tacked onto the boot node (which is somewhere between 192MB to 512MB on the ES7000). Signed-off-by: Amul Shah <amul.shah@unisys.com> Signed-off-by: Andi Kleen <ak@suse.de> Cc: Andi Kleen <ak@suse.de> Cc: Rohit Seth <rohitseth@google.com> Signed-off-by: Andrew Morton <akpm@osdl.org>
52 lines
1.3 KiB
C
52 lines
1.3 KiB
C
/* K8 NUMA support */
|
|
/* Copyright 2002,2003 by Andi Kleen, SuSE Labs */
|
|
/* 2.5 Version loosely based on the NUMAQ Code by Pat Gaughen. */
|
|
#ifndef _ASM_X86_64_MMZONE_H
|
|
#define _ASM_X86_64_MMZONE_H 1
|
|
|
|
|
|
#ifdef CONFIG_NUMA
|
|
|
|
#define VIRTUAL_BUG_ON(x)
|
|
|
|
#include <asm/smp.h>
|
|
|
|
/* Simple perfect hash to map physical addresses to node numbers */
|
|
struct memnode {
|
|
int shift;
|
|
unsigned int mapsize;
|
|
u8 *map;
|
|
u8 embedded_map[64-16];
|
|
} ____cacheline_aligned; /* total size = 64 bytes */
|
|
extern struct memnode memnode;
|
|
#define memnode_shift memnode.shift
|
|
#define memnodemap memnode.map
|
|
#define memnodemapsize memnode.mapsize
|
|
|
|
extern struct pglist_data *node_data[];
|
|
|
|
static inline __attribute__((pure)) int phys_to_nid(unsigned long addr)
|
|
{
|
|
unsigned nid;
|
|
VIRTUAL_BUG_ON(!memnodemap);
|
|
VIRTUAL_BUG_ON((addr >> memnode_shift) >= memnodemapsize);
|
|
nid = memnodemap[addr >> memnode_shift];
|
|
VIRTUAL_BUG_ON(nid >= MAX_NUMNODES || !node_data[nid]);
|
|
return nid;
|
|
}
|
|
|
|
#define NODE_DATA(nid) (node_data[nid])
|
|
|
|
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
|
|
#define node_end_pfn(nid) (NODE_DATA(nid)->node_start_pfn + \
|
|
NODE_DATA(nid)->node_spanned_pages)
|
|
|
|
#ifdef CONFIG_DISCONTIGMEM
|
|
#define pfn_to_nid(pfn) phys_to_nid((unsigned long)(pfn) << PAGE_SHIFT)
|
|
|
|
extern int pfn_valid(unsigned long pfn);
|
|
#endif
|
|
|
|
#endif
|
|
#endif
|