1
2
3
4#include <linux/config.h>
5#include <linux/kernel.h>
6#include <linux/mm.h>
7#include <linux/init.h>
8#include <linux/bootmem.h>
9#include <linux/mmzone.h>
10#include <linux/spinlock.h>
11
12int numnodes = 1;
13
14static bootmem_data_t contig_bootmem_data;
15pg_data_t contig_page_data = { .bdata = &contig_bootmem_data };
16
17#ifndef CONFIG_DISCONTIGMEM
18
19
20
21
22
23
24void __init free_area_init_node(int nid, pg_data_t *pgdat, struct page *pmap,
25 unsigned long *zones_size, unsigned long node_start_pfn,
26 unsigned long *zholes_size)
27{
28 unsigned long size;
29
30 pgdat = &contig_page_data;
31 contig_page_data.node_id = 0;
32 contig_page_data.node_start_pfn = node_start_pfn;
33 calculate_totalpages (&contig_page_data, zones_size, zholes_size);
34 if (pmap == (struct page *)0) {
35 size = (pgdat->node_size + 1) * sizeof(struct page);
36 pmap = (struct page *) alloc_bootmem_node(pgdat, size);
37 }
38 contig_page_data.node_mem_map = pmap;
39 free_area_init_core(&contig_page_data, zones_size, zholes_size);
40 mem_map = contig_page_data.node_mem_map;
41}
42
43#endif
44
45struct page * alloc_pages_node(int nid, unsigned int gfp_mask, unsigned int order)
46{
47#ifdef CONFIG_NUMA
48 return __alloc_pages(gfp_mask, order, NODE_DATA(nid)->node_zonelists + (gfp_mask & GFP_ZONEMASK));
49#else
50 return alloc_pages(gfp_mask, order);
51#endif
52}
53
54#ifdef CONFIG_DISCONTIGMEM
55
56#define LONG_ALIGN(x) (((x)+(sizeof(long))-1)&~((sizeof(long))-1))
57
58
59
60
61void __init free_area_init_node(int nid, pg_data_t *pgdat, struct page *pmap,
62 unsigned long *zones_size, unsigned long node_start_pfn,
63 unsigned long *zholes_size)
64{
65 int i;
66 unsigned long size;
67
68 pgdat->node_id = nid;
69 pgdat->node_start_pfn = node_start_pfn;
70 calculate_totalpages (pgdat, zones_size, zholes_size);
71 if (pmap == (struct page *)0) {
72 size = (pgdat->node_size + 1) * sizeof(struct page);
73 pmap = (struct page *) alloc_bootmem_node(pgdat, size);
74 }
75 pgdat->node_mem_map = pmap;
76 free_area_init_core(pgdat, zones_size, zholes_size);
77
78
79
80
81 size = 0;
82 for (i = 0; i < MAX_NR_ZONES; i++)
83 size += zones_size[i];
84 size = LONG_ALIGN((size + 7) >> 3);
85 pgdat->valid_addr_bitmap = (unsigned long *)alloc_bootmem_node(pgdat, size);
86 memset(pgdat->valid_addr_bitmap, 0, size);
87}
88
89#endif
90