diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-03 11:15:05 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-03 11:15:05 -0500 |
commit | a626b46e17d0762d664ce471d40bc506b6e721ab (patch) | |
tree | 445f6ac655ea9247d2e27529f23ba02d0991fec0 /include/linux | |
parent | c1dcb4bb1e3e16e9baee578d9bb040e5fba1063e (diff) | |
parent | dce46a04d55d6358d2d4ab44a4946a19f9425fe2 (diff) |
Merge branch 'x86-bootmem-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-bootmem-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (30 commits)
early_res: Need to save the allocation name in drop_range_partial()
sparsemem: Fix compilation on PowerPC
early_res: Add free_early_partial()
x86: Fix non-bootmem compilation on PowerPC
core: Move early_res from arch/x86 to kernel/
x86: Add find_fw_memmap_area
Move round_up/down to kernel.h
x86: Make 32bit support NO_BOOTMEM
early_res: Enhance check_and_double_early_res
x86: Move back find_e820_area to e820.c
x86: Add find_early_area_size
x86: Separate early_res related code from e820.c
x86: Move bios page reserve early to head32/64.c
sparsemem: Put mem map for one node together.
sparsemem: Put usemap for one node together
x86: Make 64 bit use early_res instead of bootmem before slab
x86: Only call dma32_reserve_bootmem 64bit !CONFIG_NUMA
x86: Make early_node_mem get mem > 4 GB if possible
x86: Dynamically increase early_res array size
x86: Introduce max_early_res and early_res_count
...
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/bootmem.h | 7 | ||||
-rw-r--r-- | include/linux/early_res.h | 23 | ||||
-rw-r--r-- | include/linux/kernel.h | 10 | ||||
-rw-r--r-- | include/linux/mm.h | 12 | ||||
-rw-r--r-- | include/linux/mmzone.h | 2 | ||||
-rw-r--r-- | include/linux/range.h | 30 |
6 files changed, 84 insertions, 0 deletions
diff --git a/include/linux/bootmem.h b/include/linux/bootmem.h index b10ec49ee2dd..266ab9291232 100644 --- a/include/linux/bootmem.h +++ b/include/linux/bootmem.h | |||
@@ -23,6 +23,7 @@ extern unsigned long max_pfn; | |||
23 | extern unsigned long saved_max_pfn; | 23 | extern unsigned long saved_max_pfn; |
24 | #endif | 24 | #endif |
25 | 25 | ||
26 | #ifndef CONFIG_NO_BOOTMEM | ||
26 | /* | 27 | /* |
27 | * node_bootmem_map is a map pointer - the bits represent all physical | 28 | * node_bootmem_map is a map pointer - the bits represent all physical |
28 | * memory pages (including holes) on the node. | 29 | * memory pages (including holes) on the node. |
@@ -37,6 +38,7 @@ typedef struct bootmem_data { | |||
37 | } bootmem_data_t; | 38 | } bootmem_data_t; |
38 | 39 | ||
39 | extern bootmem_data_t bootmem_node_data[]; | 40 | extern bootmem_data_t bootmem_node_data[]; |
41 | #endif | ||
40 | 42 | ||
41 | extern unsigned long bootmem_bootmap_pages(unsigned long); | 43 | extern unsigned long bootmem_bootmap_pages(unsigned long); |
42 | 44 | ||
@@ -46,6 +48,7 @@ extern unsigned long init_bootmem_node(pg_data_t *pgdat, | |||
46 | unsigned long endpfn); | 48 | unsigned long endpfn); |
47 | extern unsigned long init_bootmem(unsigned long addr, unsigned long memend); | 49 | extern unsigned long init_bootmem(unsigned long addr, unsigned long memend); |
48 | 50 | ||
51 | unsigned long free_all_memory_core_early(int nodeid); | ||
49 | extern unsigned long free_all_bootmem_node(pg_data_t *pgdat); | 52 | extern unsigned long free_all_bootmem_node(pg_data_t *pgdat); |
50 | extern unsigned long free_all_bootmem(void); | 53 | extern unsigned long free_all_bootmem(void); |
51 | 54 | ||
@@ -84,6 +87,10 @@ extern void *__alloc_bootmem_node(pg_data_t *pgdat, | |||
84 | unsigned long size, | 87 | unsigned long size, |
85 | unsigned long align, | 88 | unsigned long align, |
86 | unsigned long goal); | 89 | unsigned long goal); |
90 | void *__alloc_bootmem_node_high(pg_data_t *pgdat, | ||
91 | unsigned long size, | ||
92 | unsigned long align, | ||
93 | unsigned long goal); | ||
87 | extern void *__alloc_bootmem_node_nopanic(pg_data_t *pgdat, | 94 | extern void *__alloc_bootmem_node_nopanic(pg_data_t *pgdat, |
88 | unsigned long size, | 95 | unsigned long size, |
89 | unsigned long align, | 96 | unsigned long align, |
diff --git a/include/linux/early_res.h b/include/linux/early_res.h new file mode 100644 index 000000000000..29c09f57a13c --- /dev/null +++ b/include/linux/early_res.h | |||
@@ -0,0 +1,23 @@ | |||
1 | #ifndef _LINUX_EARLY_RES_H | ||
2 | #define _LINUX_EARLY_RES_H | ||
3 | #ifdef __KERNEL__ | ||
4 | |||
5 | extern void reserve_early(u64 start, u64 end, char *name); | ||
6 | extern void reserve_early_overlap_ok(u64 start, u64 end, char *name); | ||
7 | extern void free_early(u64 start, u64 end); | ||
8 | void free_early_partial(u64 start, u64 end); | ||
9 | extern void early_res_to_bootmem(u64 start, u64 end); | ||
10 | |||
11 | void reserve_early_without_check(u64 start, u64 end, char *name); | ||
12 | u64 find_early_area(u64 ei_start, u64 ei_last, u64 start, u64 end, | ||
13 | u64 size, u64 align); | ||
14 | u64 find_early_area_size(u64 ei_start, u64 ei_last, u64 start, | ||
15 | u64 *sizep, u64 align); | ||
16 | u64 find_fw_memmap_area(u64 start, u64 end, u64 size, u64 align); | ||
17 | u64 get_max_mapped(void); | ||
18 | #include <linux/range.h> | ||
19 | int get_free_all_memory_range(struct range **rangep, int nodeid); | ||
20 | |||
21 | #endif /* __KERNEL__ */ | ||
22 | |||
23 | #endif /* _LINUX_EARLY_RES_H */ | ||
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 1221d2331a6d..7f0707463360 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
@@ -44,6 +44,16 @@ extern const char linux_proc_banner[]; | |||
44 | 44 | ||
45 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr)) | 45 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr)) |
46 | 46 | ||
47 | /* | ||
48 | * This looks more complex than it should be. But we need to | ||
49 | * get the type for the ~ right in round_down (it needs to be | ||
50 | * as wide as the result!), and we want to evaluate the macro | ||
51 | * arguments just once each. | ||
52 | */ | ||
53 | #define __round_mask(x, y) ((__typeof__(x))((y)-1)) | ||
54 | #define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1) | ||
55 | #define round_down(x, y) ((x) & ~__round_mask(x, y)) | ||
56 | |||
47 | #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) | 57 | #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) |
48 | #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) | 58 | #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) |
49 | #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) | 59 | #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) |
diff --git a/include/linux/mm.h b/include/linux/mm.h index 2e724c877ec1..90957f14195c 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/prio_tree.h> | 12 | #include <linux/prio_tree.h> |
13 | #include <linux/debug_locks.h> | 13 | #include <linux/debug_locks.h> |
14 | #include <linux/mm_types.h> | 14 | #include <linux/mm_types.h> |
15 | #include <linux/range.h> | ||
15 | 16 | ||
16 | struct mempolicy; | 17 | struct mempolicy; |
17 | struct anon_vma; | 18 | struct anon_vma; |
@@ -1049,6 +1050,10 @@ extern void get_pfn_range_for_nid(unsigned int nid, | |||
1049 | extern unsigned long find_min_pfn_with_active_regions(void); | 1050 | extern unsigned long find_min_pfn_with_active_regions(void); |
1050 | extern void free_bootmem_with_active_regions(int nid, | 1051 | extern void free_bootmem_with_active_regions(int nid, |
1051 | unsigned long max_low_pfn); | 1052 | unsigned long max_low_pfn); |
1053 | int add_from_early_node_map(struct range *range, int az, | ||
1054 | int nr_range, int nid); | ||
1055 | void *__alloc_memory_core_early(int nodeid, u64 size, u64 align, | ||
1056 | u64 goal, u64 limit); | ||
1052 | typedef int (*work_fn_t)(unsigned long, unsigned long, void *); | 1057 | typedef int (*work_fn_t)(unsigned long, unsigned long, void *); |
1053 | extern void work_with_active_regions(int nid, work_fn_t work_fn, void *data); | 1058 | extern void work_with_active_regions(int nid, work_fn_t work_fn, void *data); |
1054 | extern void sparse_memory_present_with_active_regions(int nid); | 1059 | extern void sparse_memory_present_with_active_regions(int nid); |
@@ -1317,12 +1322,19 @@ extern int randomize_va_space; | |||
1317 | const char * arch_vma_name(struct vm_area_struct *vma); | 1322 | const char * arch_vma_name(struct vm_area_struct *vma); |
1318 | void print_vma_addr(char *prefix, unsigned long rip); | 1323 | void print_vma_addr(char *prefix, unsigned long rip); |
1319 | 1324 | ||
1325 | void sparse_mem_maps_populate_node(struct page **map_map, | ||
1326 | unsigned long pnum_begin, | ||
1327 | unsigned long pnum_end, | ||
1328 | unsigned long map_count, | ||
1329 | int nodeid); | ||
1330 | |||
1320 | struct page *sparse_mem_map_populate(unsigned long pnum, int nid); | 1331 | struct page *sparse_mem_map_populate(unsigned long pnum, int nid); |
1321 | pgd_t *vmemmap_pgd_populate(unsigned long addr, int node); | 1332 | pgd_t *vmemmap_pgd_populate(unsigned long addr, int node); |
1322 | pud_t *vmemmap_pud_populate(pgd_t *pgd, unsigned long addr, int node); | 1333 | pud_t *vmemmap_pud_populate(pgd_t *pgd, unsigned long addr, int node); |
1323 | pmd_t *vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node); | 1334 | pmd_t *vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node); |
1324 | pte_t *vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node); | 1335 | pte_t *vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node); |
1325 | void *vmemmap_alloc_block(unsigned long size, int node); | 1336 | void *vmemmap_alloc_block(unsigned long size, int node); |
1337 | void *vmemmap_alloc_block_buf(unsigned long size, int node); | ||
1326 | void vmemmap_verify(pte_t *, int, unsigned long, unsigned long); | 1338 | void vmemmap_verify(pte_t *, int, unsigned long, unsigned long); |
1327 | int vmemmap_populate_basepages(struct page *start_page, | 1339 | int vmemmap_populate_basepages(struct page *start_page, |
1328 | unsigned long pages, int node); | 1340 | unsigned long pages, int node); |
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 41acd4bf7664..a01a103341bd 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h | |||
@@ -612,7 +612,9 @@ typedef struct pglist_data { | |||
612 | struct page_cgroup *node_page_cgroup; | 612 | struct page_cgroup *node_page_cgroup; |
613 | #endif | 613 | #endif |
614 | #endif | 614 | #endif |
615 | #ifndef CONFIG_NO_BOOTMEM | ||
615 | struct bootmem_data *bdata; | 616 | struct bootmem_data *bdata; |
617 | #endif | ||
616 | #ifdef CONFIG_MEMORY_HOTPLUG | 618 | #ifdef CONFIG_MEMORY_HOTPLUG |
617 | /* | 619 | /* |
618 | * Must be held any time you expect node_start_pfn, node_present_pages | 620 | * Must be held any time you expect node_start_pfn, node_present_pages |
diff --git a/include/linux/range.h b/include/linux/range.h new file mode 100644 index 000000000000..bd184a5db791 --- /dev/null +++ b/include/linux/range.h | |||
@@ -0,0 +1,30 @@ | |||
1 | #ifndef _LINUX_RANGE_H | ||
2 | #define _LINUX_RANGE_H | ||
3 | |||
4 | struct range { | ||
5 | u64 start; | ||
6 | u64 end; | ||
7 | }; | ||
8 | |||
9 | int add_range(struct range *range, int az, int nr_range, | ||
10 | u64 start, u64 end); | ||
11 | |||
12 | |||
13 | int add_range_with_merge(struct range *range, int az, int nr_range, | ||
14 | u64 start, u64 end); | ||
15 | |||
16 | void subtract_range(struct range *range, int az, u64 start, u64 end); | ||
17 | |||
18 | int clean_sort_range(struct range *range, int az); | ||
19 | |||
20 | void sort_range(struct range *range, int nr_range); | ||
21 | |||
22 | #define MAX_RESOURCE ((resource_size_t)~0) | ||
23 | static inline resource_size_t cap_resource(u64 val) | ||
24 | { | ||
25 | if (val > MAX_RESOURCE) | ||
26 | return MAX_RESOURCE; | ||
27 | |||
28 | return val; | ||
29 | } | ||
30 | #endif | ||