Skip to content

Commit

Permalink
[PATCH] reorganize x86-64 NUMA and DISCONTIGMEM config options
Browse files Browse the repository at this point in the history
In order to use the alternative sparsemem implmentation for NUMA kernels,
we need to reorganize the config options.  This patch effectively abstracts
out the CONFIG_DISCONTIGMEM options to CONFIG_NUMA in most cases.  Thus,
the discontigmem implementation may be employed as always, but the
sparsemem implementation may be used alternatively.

Signed-off-by: Matt Tolentino <matthew.e.tolentino@intel.com>
Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Matt Tolentino authored and Linus Torvalds committed Jun 23, 2005
1 parent 1035faf commit 2b97690
Show file tree
Hide file tree
Showing 9 changed files with 25 additions and 24 deletions.
2 changes: 1 addition & 1 deletion arch/x86_64/kernel/head64.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ void __init x86_64_start_kernel(char * real_mode_data)
s = strstr(saved_command_line, "earlyprintk=");
if (s != NULL)
setup_early_printk(s);
#ifdef CONFIG_DISCONTIGMEM
#ifdef CONFIG_NUMA
s = strstr(saved_command_line, "numa=");
if (s != NULL)
numa_setup(s+5);
Expand Down
6 changes: 3 additions & 3 deletions arch/x86_64/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -348,7 +348,7 @@ static __init void parse_cmdline_early (char ** cmdline_p)
if (!memcmp(from, "mem=", 4))
parse_memopt(from+4, &from);

#ifdef CONFIG_DISCONTIGMEM
#ifdef CONFIG_NUMA
if (!memcmp(from, "numa=", 5))
numa_setup(from+5);
#endif
Expand Down Expand Up @@ -377,7 +377,7 @@ static __init void parse_cmdline_early (char ** cmdline_p)
*cmdline_p = command_line;
}

#ifndef CONFIG_DISCONTIGMEM
#ifndef CONFIG_NUMA
static void __init contig_initmem_init(void)
{
unsigned long bootmap_size, bootmap;
Expand Down Expand Up @@ -554,7 +554,7 @@ void __init setup_arch(char **cmdline_p)
acpi_numa_init();
#endif

#ifdef CONFIG_DISCONTIGMEM
#ifdef CONFIG_NUMA
numa_initmem_init(0, end_pfn);
#else
contig_initmem_init();
Expand Down
2 changes: 1 addition & 1 deletion arch/x86_64/mm/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

obj-y := init.o fault.o ioremap.o extable.o pageattr.o
obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o
obj-$(CONFIG_DISCONTIGMEM) += numa.o
obj-$(CONFIG_NUMA) += numa.o
obj-$(CONFIG_K8_NUMA) += k8topology.o
obj-$(CONFIG_ACPI_NUMA) += srat.o

Expand Down
9 changes: 6 additions & 3 deletions arch/x86_64/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ void zap_low_mappings(void)
flush_tlb_all();
}

#ifndef CONFIG_DISCONTIGMEM
#ifndef CONFIG_NUMA
void __init paging_init(void)
{
{
Expand Down Expand Up @@ -427,13 +427,16 @@ void __init mem_init(void)
reservedpages = 0;

/* this will put all low memory onto the freelists */
#ifdef CONFIG_DISCONTIGMEM
#ifdef CONFIG_NUMA
totalram_pages += numa_free_all_bootmem();
tmp = 0;
/* should count reserved pages here for all nodes */
#else

#ifdef CONFIG_FLATMEM
max_mapnr = end_pfn;
if (!mem_map) BUG();
#endif

totalram_pages += free_all_bootmem();

Expand Down Expand Up @@ -515,7 +518,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
void __init reserve_bootmem_generic(unsigned long phys, unsigned len)
{
/* Should check here against the e820 map to avoid double free */
#ifdef CONFIG_DISCONTIGMEM
#ifdef CONFIG_NUMA
int nid = phys_to_nid(phys);
reserve_bootmem_node(NODE_DATA(nid), phys, len);
#else
Expand Down
2 changes: 1 addition & 1 deletion arch/x86_64/mm/ioremap.c
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l
if (phys_addr >= ISA_START_ADDRESS && last_addr < ISA_END_ADDRESS)
return (__force void __iomem *)phys_to_virt(phys_addr);

#ifndef CONFIG_DISCONTIGMEM
#ifdef CONFIG_FLATMEM
/*
* Don't allow anybody to remap normal RAM that we're using..
*/
Expand Down
5 changes: 0 additions & 5 deletions include/asm-x86_64/io.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,12 +124,7 @@ extern inline void * phys_to_virt(unsigned long address)
/*
* Change "struct page" to physical address.
*/
#ifdef CONFIG_DISCONTIGMEM
#include <asm/mmzone.h>
#define page_to_phys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT)
#else
#define page_to_phys(page) ((page - mem_map) << PAGE_SHIFT)
#endif

#include <asm-generic/iomap.h>

Expand Down
15 changes: 9 additions & 6 deletions include/asm-x86_64/mmzone.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

#include <linux/config.h>

#ifdef CONFIG_DISCONTIGMEM
#ifdef CONFIG_NUMA

#define VIRTUAL_BUG_ON(x)

Expand All @@ -30,17 +30,16 @@ static inline __attribute__((pure)) int phys_to_nid(unsigned long addr)
return nid;
}

#define pfn_to_nid(pfn) phys_to_nid((unsigned long)(pfn) << PAGE_SHIFT)

#define kvaddr_to_nid(kaddr) phys_to_nid(__pa(kaddr))
#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)

#define local_mapnr(kvaddr) \
( (__pa(kvaddr) >> PAGE_SHIFT) - node_start_pfn(kvaddr_to_nid(kvaddr)) )
#ifdef CONFIG_DISCONTIGMEM

#define pfn_to_nid(pfn) phys_to_nid((unsigned long)(pfn) << PAGE_SHIFT)
#define kvaddr_to_nid(kaddr) phys_to_nid(__pa(kaddr))

/* AK: this currently doesn't deal with invalid addresses. We'll see
if the 2.5 kernel doesn't pass them
Expand All @@ -57,4 +56,8 @@ static inline __attribute__((pure)) int phys_to_nid(unsigned long addr)
({ u8 nid__ = pfn_to_nid(pfn); \
nid__ != 0xff && (pfn) >= node_start_pfn(nid__) && (pfn) <= node_end_pfn(nid__); }))
#endif

#define local_mapnr(kvaddr) \
( (__pa(kvaddr) >> PAGE_SHIFT) - node_start_pfn(kvaddr_to_nid(kvaddr)) )
#endif
#endif
4 changes: 3 additions & 1 deletion include/asm-x86_64/page.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,9 @@ extern __inline__ int get_order(unsigned long size)
__pa(v); })

#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))
#ifndef CONFIG_DISCONTIGMEM
#define __boot_va(x) __va(x)
#define __boot_pa(x) __pa(x)
#ifdef CONFIG_FLATMEM
#define pfn_to_page(pfn) (mem_map + (pfn))
#define page_to_pfn(page) ((unsigned long)((page) - mem_map))
#define pfn_valid(pfn) ((pfn) < max_mapnr)
Expand Down
4 changes: 1 addition & 3 deletions include/asm-x86_64/topology.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

#include <linux/config.h>

#ifdef CONFIG_DISCONTIGMEM
#ifdef CONFIG_NUMA

#include <asm/mpspec.h>
#include <asm/bitops.h>
Expand Down Expand Up @@ -37,7 +37,6 @@ static inline cpumask_t __pcibus_to_cpumask(int bus)
}
#define pcibus_to_cpumask(bus) __pcibus_to_cpumask(bus->number)

#ifdef CONFIG_NUMA
/* sched_domains SD_NODE_INIT for x86_64 machines */
#define SD_NODE_INIT (struct sched_domain) { \
.span = CPU_MASK_NONE, \
Expand All @@ -59,7 +58,6 @@ static inline cpumask_t __pcibus_to_cpumask(int bus)
.balance_interval = 1, \
.nr_balance_failed = 0, \
}
#endif

#endif

Expand Down

0 comments on commit 2b97690

Please sign in to comment.