Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
c87ff943
Commit
c87ff943
authored
Oct 28, 2005
by
Tony Luck
Browse files
Options
Browse Files
Download
Plain Diff
Pull sparsemem-v5 into release branch
parents
556902cd
1e5c936e
Changes
12
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
1478 additions
and
55 deletions
+1478
-55
arch/ia64/Kconfig
arch/ia64/Kconfig
+56
-38
arch/ia64/configs/gensparse_defconfig
arch/ia64/configs/gensparse_defconfig
+1319
-0
arch/ia64/mm/Makefile
arch/ia64/mm/Makefile
+2
-3
arch/ia64/mm/contig.c
arch/ia64/mm/contig.c
+2
-2
arch/ia64/mm/discontig.c
arch/ia64/mm/discontig.c
+41
-2
arch/ia64/mm/init.c
arch/ia64/mm/init.c
+1
-1
arch/ia64/mm/numa.c
arch/ia64/mm/numa.c
+24
-0
include/asm-ia64/meminit.h
include/asm-ia64/meminit.h
+1
-1
include/asm-ia64/mmzone.h
include/asm-ia64/mmzone.h
+7
-3
include/asm-ia64/nodedata.h
include/asm-ia64/nodedata.h
+2
-2
include/asm-ia64/page.h
include/asm-ia64/page.h
+3
-3
include/asm-ia64/sparsemem.h
include/asm-ia64/sparsemem.h
+20
-0
No files found.
arch/ia64/Kconfig
View file @
c87ff943
...
...
@@ -63,8 +63,6 @@ config IA64_GENERIC
select ACPI
select NUMA
select ACPI_NUMA
select VIRTUAL_MEM_MAP
select DISCONTIGMEM
help
This selects the system type of your hardware. A "generic" kernel
will run on any supported IA-64 system. However, if you configure
...
...
@@ -176,40 +174,6 @@ config IA64_L1_CACHE_SHIFT
default "6" if ITANIUM
# align cache-sensitive data to 64 bytes
config NUMA
bool "NUMA support"
depends on !IA64_HP_SIM
default y if IA64_SGI_SN2
select ACPI_NUMA
help
Say Y to compile the kernel to support NUMA (Non-Uniform Memory
Access). This option is for configuring high-end multiprocessor
server systems. If in doubt, say N.
config VIRTUAL_MEM_MAP
bool "Virtual mem map"
default y if !IA64_HP_SIM
help
Say Y to compile the kernel with support for a virtual mem map.
This code also only takes effect if a memory hole of greater than
1 Gb is found during boot. You must turn this option on if you
require the DISCONTIGMEM option for your machine. If you are
unsure, say Y.
config HOLES_IN_ZONE
bool
default y if VIRTUAL_MEM_MAP
config ARCH_DISCONTIGMEM_ENABLE
bool "Discontiguous memory support"
depends on (IA64_DIG || IA64_SGI_SN2 || IA64_GENERIC || IA64_HP_ZX1 || IA64_HP_ZX1_SWIOTLB) && NUMA && VIRTUAL_MEM_MAP
default y if (IA64_SGI_SN2 || IA64_GENERIC) && NUMA
help
Say Y to support efficient handling of discontiguous physical memory,
for architectures which are either NUMA (Non-Uniform Memory Access)
or have huge holes in the physical address space for other reasons.
See <file:Documentation/vm/numa> for more.
config IA64_CYCLONE
bool "Cyclone (EXA) Time Source support"
help
...
...
@@ -232,8 +196,10 @@ config IA64_SGI_SN_XP
based on a network adapter and DMA messaging.
config FORCE_MAX_ZONEORDER
int
default "18"
int "MAX_ORDER (11 - 17)" if !HUGETLB_PAGE
range 11 17 if !HUGETLB_PAGE
default "17" if HUGETLB_PAGE
default "11"
config SMP
bool "Symmetric multi-processing support"
...
...
@@ -298,6 +264,58 @@ config PREEMPT
source "mm/Kconfig"
config ARCH_SELECT_MEMORY_MODEL
def_bool y
config ARCH_DISCONTIGMEM_ENABLE
def_bool y
help
Say Y to support efficient handling of discontiguous physical memory,
for architectures which are either NUMA (Non-Uniform Memory Access)
or have huge holes in the physical address space for other reasons.
See <file:Documentation/vm/numa> for more.
config ARCH_FLATMEM_ENABLE
def_bool y
config ARCH_SPARSEMEM_ENABLE
def_bool y
depends on ARCH_DISCONTIGMEM_ENABLE
config ARCH_DISCONTIGMEM_DEFAULT
def_bool y if (IA64_SGI_SN2 || IA64_GENERIC || IA64_HP_ZX1 || IA64_HP_ZX1_SWIOTLB)
depends on ARCH_DISCONTIGMEM_ENABLE
config NUMA
bool "NUMA support"
depends on !IA64_HP_SIM && !FLATMEM
default y if IA64_SGI_SN2
help
Say Y to compile the kernel to support NUMA (Non-Uniform Memory
Access). This option is for configuring high-end multiprocessor
server systems. If in doubt, say N.
# VIRTUAL_MEM_MAP and FLAT_NODE_MEM_MAP are functionally equivalent.
# VIRTUAL_MEM_MAP has been retained for historical reasons.
config VIRTUAL_MEM_MAP
bool "Virtual mem map"
depends on !SPARSEMEM
default y if !IA64_HP_SIM
help
Say Y to compile the kernel with support for a virtual mem map.
This code also only takes effect if a memory hole of greater than
1 Gb is found during boot. You must turn this option on if you
require the DISCONTIGMEM option for your machine. If you are
unsure, say Y.
config HOLES_IN_ZONE
bool
default y if VIRTUAL_MEM_MAP
config HAVE_ARCH_EARLY_PFN_TO_NID
def_bool y
depends on NEED_MULTIPLE_NODES
config IA32_SUPPORT
bool "Support for Linux/x86 binaries"
help
...
...
arch/ia64/configs/gensparse_defconfig
0 → 100644
View file @
c87ff943
This diff is collapsed.
Click to expand it.
arch/ia64/mm/Makefile
View file @
c87ff943
...
...
@@ -7,6 +7,5 @@ obj-y := init.o fault.o tlb.o extable.o
obj-$(CONFIG_HUGETLB_PAGE)
+=
hugetlbpage.o
obj-$(CONFIG_NUMA)
+=
numa.o
obj-$(CONFIG_DISCONTIGMEM)
+=
discontig.o
ifndef
CONFIG_DISCONTIGMEM
obj-y
+=
contig.o
endif
obj-$(CONFIG_SPARSEMEM)
+=
discontig.o
obj-$(CONFIG_FLATMEM)
+=
contig.o
arch/ia64/mm/contig.c
View file @
c87ff943
...
...
@@ -269,7 +269,7 @@ paging_init (void)
efi_memmap_walk
(
find_largest_hole
,
(
u64
*
)
&
max_gap
);
if
(
max_gap
<
LARGE_GAP
)
{
vmem_map
=
(
struct
page
*
)
0
;
free_area_init_node
(
0
,
&
contig_page_data
,
zones_size
,
0
,
free_area_init_node
(
0
,
NODE_DATA
(
0
)
,
zones_size
,
0
,
zholes_size
);
}
else
{
unsigned
long
map_size
;
...
...
@@ -282,7 +282,7 @@ paging_init (void)
efi_memmap_walk
(
create_mem_map_page_table
,
NULL
);
NODE_DATA
(
0
)
->
node_mem_map
=
vmem_map
;
free_area_init_node
(
0
,
&
contig_page_data
,
zones_size
,
free_area_init_node
(
0
,
NODE_DATA
(
0
)
,
zones_size
,
0
,
zholes_size
);
printk
(
"Virtual mem_map starts at 0x%p
\n
"
,
mem_map
);
...
...
arch/ia64/mm/discontig.c
View file @
c87ff943
...
...
@@ -421,6 +421,37 @@ static void __init memory_less_nodes(void)
return
;
}
#ifdef CONFIG_SPARSEMEM
/**
* register_sparse_mem - notify SPARSEMEM that this memory range exists.
* @start: physical start of range
* @end: physical end of range
* @arg: unused
*
* Simply calls SPARSEMEM to register memory section(s).
*/
static
int
__init
register_sparse_mem
(
unsigned
long
start
,
unsigned
long
end
,
void
*
arg
)
{
int
nid
;
start
=
__pa
(
start
)
>>
PAGE_SHIFT
;
end
=
__pa
(
end
)
>>
PAGE_SHIFT
;
nid
=
early_pfn_to_nid
(
start
);
memory_present
(
nid
,
start
,
end
);
return
0
;
}
static
void
__init
arch_sparse_init
(
void
)
{
efi_memmap_walk
(
register_sparse_mem
,
NULL
);
sparse_init
();
}
#else
#define arch_sparse_init() do {} while (0)
#endif
/**
* find_memory - walk the EFI memory map and setup the bootmem allocator
*
...
...
@@ -528,8 +559,10 @@ void show_mem(void)
int
shared
=
0
,
cached
=
0
,
reserved
=
0
;
printk
(
"Node ID: %d
\n
"
,
pgdat
->
node_id
);
for
(
i
=
0
;
i
<
pgdat
->
node_spanned_pages
;
i
++
)
{
struct
page
*
page
=
pgdat_page_nr
(
pgdat
,
i
);
if
(
!
ia64_pfn_valid
(
pgdat
->
node_start_pfn
+
i
))
struct
page
*
page
;
if
(
pfn_valid
(
pgdat
->
node_start_pfn
+
i
))
page
=
pfn_to_page
(
pgdat
->
node_start_pfn
+
i
);
else
continue
;
if
(
PageReserved
(
page
))
reserved
++
;
...
...
@@ -648,12 +681,16 @@ void __init paging_init(void)
max_dma
=
virt_to_phys
((
void
*
)
MAX_DMA_ADDRESS
)
>>
PAGE_SHIFT
;
arch_sparse_init
();
efi_memmap_walk
(
filter_rsvd_memory
,
count_node_pages
);
#ifdef CONFIG_VIRTUAL_MEM_MAP
vmalloc_end
-=
PAGE_ALIGN
(
max_low_pfn
*
sizeof
(
struct
page
));
vmem_map
=
(
struct
page
*
)
vmalloc_end
;
efi_memmap_walk
(
create_mem_map_page_table
,
NULL
);
printk
(
"Virtual mem_map starts at 0x%p
\n
"
,
vmem_map
);
#endif
for_each_online_node
(
node
)
{
memset
(
zones_size
,
0
,
sizeof
(
zones_size
));
...
...
@@ -690,7 +727,9 @@ void __init paging_init(void)
pfn_offset
=
mem_data
[
node
].
min_pfn
;
#ifdef CONFIG_VIRTUAL_MEM_MAP
NODE_DATA
(
node
)
->
node_mem_map
=
vmem_map
+
pfn_offset
;
#endif
free_area_init_node
(
node
,
NODE_DATA
(
node
),
zones_size
,
pfn_offset
,
zholes_size
);
}
...
...
arch/ia64/mm/init.c
View file @
c87ff943
...
...
@@ -593,7 +593,7 @@ mem_init (void)
platform_dma_init
();
#endif
#if
ndef CONFIG_DISCONTIG
MEM
#if
def CONFIG_FLAT
MEM
if
(
!
mem_map
)
BUG
();
max_mapnr
=
max_low_pfn
;
...
...
arch/ia64/mm/numa.c
View file @
c87ff943
...
...
@@ -47,3 +47,27 @@ paddr_to_nid(unsigned long paddr)
return
(
i
<
num_node_memblks
)
?
node_memblk
[
i
].
nid
:
(
num_node_memblks
?
-
1
:
0
);
}
#if defined(CONFIG_SPARSEMEM) && defined(CONFIG_NUMA)
/*
* Because of holes evaluate on section limits.
* If the section of memory exists, then return the node where the section
* resides. Otherwise return node 0 as the default. This is used by
* SPARSEMEM to allocate the SPARSEMEM sectionmap on the NUMA node where
* the section resides.
*/
int
early_pfn_to_nid
(
unsigned
long
pfn
)
{
int
i
,
section
=
pfn
>>
PFN_SECTION_SHIFT
,
ssec
,
esec
;
for
(
i
=
0
;
i
<
num_node_memblks
;
i
++
)
{
ssec
=
node_memblk
[
i
].
start_paddr
>>
PA_SECTION_SHIFT
;
esec
=
(
node_memblk
[
i
].
start_paddr
+
node_memblk
[
i
].
size
+
((
1L
<<
PA_SECTION_SHIFT
)
-
1
))
>>
PA_SECTION_SHIFT
;
if
(
section
>=
ssec
&&
section
<
esec
)
return
node_memblk
[
i
].
nid
;
}
return
0
;
}
#endif
include/asm-ia64/meminit.h
View file @
c87ff943
...
...
@@ -43,7 +43,7 @@ extern void efi_memmap_init(unsigned long *, unsigned long *);
#define GRANULEROUNDUP(n) (((n)+IA64_GRANULE_SIZE-1) & ~(IA64_GRANULE_SIZE-1))
#define ORDERROUNDDOWN(n) ((n) & ~((PAGE_SIZE<<MAX_ORDER)-1))
#ifdef CONFIG_
DISCONTIGMEM
#ifdef CONFIG_
NUMA
extern
void
call_pernode_memory
(
unsigned
long
start
,
unsigned
long
len
,
void
*
func
);
#else
# define call_pernode_memory(start, len, func) (*func)(start, len, 0)
...
...
include/asm-ia64/mmzone.h
View file @
c87ff943
...
...
@@ -15,7 +15,7 @@
#include <asm/page.h>
#include <asm/meminit.h>
#ifdef CONFIG_
DISCONTIGMEM
#ifdef CONFIG_
NUMA
static
inline
int
pfn_to_nid
(
unsigned
long
pfn
)
{
...
...
@@ -31,6 +31,10 @@ static inline int pfn_to_nid(unsigned long pfn)
#endif
}
#ifdef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID
extern
int
early_pfn_to_nid
(
unsigned
long
pfn
);
#endif
#ifdef CONFIG_IA64_DIG
/* DIG systems are small */
# define MAX_PHYSNODE_ID 8
# define NR_NODE_MEMBLKS (MAX_NUMNODES * 8)
...
...
@@ -39,8 +43,8 @@ static inline int pfn_to_nid(unsigned long pfn)
# define NR_NODE_MEMBLKS (MAX_NUMNODES * 4)
#endif
#else
/* CONFIG_
DISCONTIGMEM
*/
#else
/* CONFIG_
NUMA
*/
# define NR_NODE_MEMBLKS (MAX_NUMNODES * 4)
#endif
/* CONFIG_
DISCONTIGMEM
*/
#endif
/* CONFIG_
NUMA
*/
#endif
/* _ASM_IA64_MMZONE_H */
include/asm-ia64/nodedata.h
View file @
c87ff943
...
...
@@ -17,7 +17,7 @@
#include <asm/percpu.h>
#include <asm/mmzone.h>
#ifdef CONFIG_
DISCONTIGMEM
#ifdef CONFIG_
NUMA
/*
* Node Data. One of these structures is located on each node of a NUMA system.
...
...
@@ -47,6 +47,6 @@ struct ia64_node_data {
*/
#define NODE_DATA(nid) (local_node_data->pg_data_ptrs[nid])
#endif
/* CONFIG_
DISCONTIGMEM
*/
#endif
/* CONFIG_
NUMA
*/
#endif
/* _ASM_IA64_NODEDATA_H */
include/asm-ia64/page.h
View file @
c87ff943
...
...
@@ -102,15 +102,15 @@ do { \
#ifdef CONFIG_VIRTUAL_MEM_MAP
extern
int
ia64_pfn_valid
(
unsigned
long
pfn
);
#el
se
#el
if defined(CONFIG_FLATMEM)
# define ia64_pfn_valid(pfn) 1
#endif
#if
ndef CONFIG_DISCONTIG
MEM
#if
def CONFIG_FLAT
MEM
# define pfn_valid(pfn) (((pfn) < max_mapnr) && ia64_pfn_valid(pfn))
# define page_to_pfn(page) ((unsigned long) (page - mem_map))
# define pfn_to_page(pfn) (mem_map + (pfn))
#el
se
#el
if defined(CONFIG_DISCONTIGMEM)
extern
struct
page
*
vmem_map
;
extern
unsigned
long
max_low_pfn
;
# define pfn_valid(pfn) (((pfn) < max_low_pfn) && ia64_pfn_valid(pfn))
...
...
include/asm-ia64/sparsemem.h
0 → 100644
View file @
c87ff943
#ifndef _ASM_IA64_SPARSEMEM_H
#define _ASM_IA64_SPARSEMEM_H
#ifdef CONFIG_SPARSEMEM
/*
* SECTION_SIZE_BITS 2^N: how big each section will be
* MAX_PHYSMEM_BITS 2^N: how much memory we can have in that space
*/
#define SECTION_SIZE_BITS (30)
#define MAX_PHYSMEM_BITS (50)
#ifdef CONFIG_FORCE_MAX_ZONEORDER
#if ((CONFIG_FORCE_MAX_ZONEORDER - 1 + PAGE_SHIFT) > SECTION_SIZE_BITS)
#undef SECTION_SIZE_BITS
#define SECTION_SIZE_BITS (CONFIG_FORCE_MAX_ZONEORDER - 1 + PAGE_SHIFT)
#endif
#endif
#endif
/* CONFIG_SPARSEMEM */
#endif
/* _ASM_IA64_SPARSEMEM_H */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment