diff options
author | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2004-11-30 17:17:07 +0000 |
---|---|---|
committer | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2004-11-30 17:17:07 +0000 |
commit | f5f1e2a8d2bd951dbd4ee813f1a2744632b65332 (patch) | |
tree | c127a07ff24209159342ee5ac482140efe466d6e /linux-2.4.28-xen-sparse | |
parent | 18bbf10459e256dc78df99306b6faa820b636936 (diff) | |
download | xen-f5f1e2a8d2bd951dbd4ee813f1a2744632b65332.tar.gz xen-f5f1e2a8d2bd951dbd4ee813f1a2744632b65332.tar.bz2 xen-f5f1e2a8d2bd951dbd4ee813f1a2744632b65332.zip |
bitkeeper revision 1.1159.187.42 (41acab13co1dnyoD3jJfv5m4ox_FFg)
Major balloon driver cleanups. This has required some moderately large
changes to start-of-day code in Linux 2.4 and 2.6.
Diffstat (limited to 'linux-2.4.28-xen-sparse')
-rw-r--r-- | linux-2.4.28-xen-sparse/arch/xen/kernel/setup.c | 20 | ||||
-rw-r--r-- | linux-2.4.28-xen-sparse/arch/xen/mm/init.c | 49 |
2 files changed, 32 insertions, 37 deletions
diff --git a/linux-2.4.28-xen-sparse/arch/xen/kernel/setup.c b/linux-2.4.28-xen-sparse/arch/xen/kernel/setup.c index 72454469d0..3b27174ba6 100644 --- a/linux-2.4.28-xen-sparse/arch/xen/kernel/setup.c +++ b/linux-2.4.28-xen-sparse/arch/xen/kernel/setup.c @@ -275,7 +275,8 @@ void __init setup_arch(char **cmdline_p) * arch/xen/drivers/balloon/balloon.c */ mem_param = parse_mem_cmdline(cmdline_p); - if (!mem_param) mem_param = xen_start_info.nr_pages; + if (mem_param < xen_start_info.nr_pages) + mem_param = xen_start_info.nr_pages; #define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) #define PFN_DOWN(x) ((x) >> PAGE_SHIFT) @@ -303,6 +304,7 @@ void __init setup_arch(char **cmdline_p) printk(KERN_WARNING "Use a PAE enabled kernel.\n"); else printk(KERN_WARNING "Use a HIGHMEM enabled kernel.\n"); + max_pfn = lmax_low_pfn; #else /* !CONFIG_HIGHMEM */ #ifndef CONFIG_X86_PAE if (max_pfn > MAX_NONPAE_PFN) { @@ -350,8 +352,6 @@ void __init setup_arch(char **cmdline_p) */ max_low_pfn = lmax_low_pfn; - - #ifdef CONFIG_BLK_DEV_INITRD if ( xen_start_info.mod_start != 0 ) { @@ -375,6 +375,20 @@ void __init setup_arch(char **cmdline_p) paging_init(); + /* Make sure we have a large enough P->M table. */ + if ( max_pfn > xen_start_info.nr_pages ) + { + phys_to_machine_mapping = alloc_bootmem_low_pages( + max_pfn * sizeof(unsigned long)); + memset(phys_to_machine_mapping, ~0, max_pfn * sizeof(unsigned long)); + memcpy(phys_to_machine_mapping, + (unsigned long *)xen_start_info.mfn_list, + xen_start_info.nr_pages * sizeof(unsigned long)); + free_bootmem(__pa(xen_start_info.mfn_list), + PFN_PHYS(PFN_UP(xen_start_info.nr_pages * + sizeof(unsigned long)))); + } + pfn_to_mfn_frame_list = alloc_bootmem_low_pages(PAGE_SIZE); for ( i=0, j=0; i < max_pfn; i+=(PAGE_SIZE/sizeof(unsigned long)), j++ ) { diff --git a/linux-2.4.28-xen-sparse/arch/xen/mm/init.c b/linux-2.4.28-xen-sparse/arch/xen/mm/init.c index 6a694022bf..dd622aebda 100644 --- a/linux-2.4.28-xen-sparse/arch/xen/mm/init.c +++ b/linux-2.4.28-xen-sparse/arch/xen/mm/init.c @@ -213,23 +213,16 @@ static void __init fixrange_init (unsigned long start, static void __init pagetable_init (void) { - unsigned long vaddr, end; + unsigned long vaddr, end, ram_end; pgd_t *kpgd, *pgd, *pgd_base; int i, j, k; pmd_t *kpmd, *pmd; pte_t *kpte, *pte, *pte_base; - /* create tables only for boot_pfn frames. max_low_pfn may be sized for - * pages yet to be allocated from the hypervisor, or it may be set - * to override the xen_start_info amount of memory - */ - int boot_pfn = min(xen_start_info.nr_pages,max_low_pfn); - - /* - * This can be zero as well - no problem, in that case we exit - * the loops anyway due to the PTRS_PER_* conditions. - */ - end = (unsigned long)__va(boot_pfn *PAGE_SIZE); + end = (unsigned long)__va(max_low_pfn * PAGE_SIZE); + ram_end = (unsigned long)__va(xen_start_info.nr_pages * PAGE_SIZE); + if ( ram_end > end ) + ram_end = end; pgd_base = init_mm.pgd; i = __pgd_offset(PAGE_OFFSET); @@ -237,12 +230,12 @@ static void __init pagetable_init (void) for (; i < PTRS_PER_PGD; pgd++, i++) { vaddr = i*PGDIR_SIZE; - if (end && (vaddr >= end)) + if (vaddr >= end) break; pmd = (pmd_t *)pgd; for (j = 0; j < PTRS_PER_PMD; pmd++, j++) { vaddr = i*PGDIR_SIZE + j*PMD_SIZE; - if (end && (vaddr >= end)) + if (vaddr >= end) break; /* Filled in for us already? */ @@ -250,10 +243,11 @@ static void __init pagetable_init (void) continue; pte_base = pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE); + clear_page(pte_base); for (k = 0; k < PTRS_PER_PTE; pte++, k++) { vaddr = i*PGDIR_SIZE + j*PMD_SIZE + k*PAGE_SIZE; - if (end && (vaddr >= end)) + if (vaddr >= ram_end) break; *pte = mk_pte_phys(__pa(vaddr), PAGE_KERNEL); } @@ -329,28 +323,14 @@ static inline int page_is_ram (unsigned long pagenr) return 1; } -static inline int page_kills_ppro(unsigned long pagenr) -{ - return 0; -} - #ifdef CONFIG_HIGHMEM -void __init one_highpage_init(struct page *page, int pfn, int bad_ppro) +void __init one_highpage_init(struct page *page, int free_page) { - if (!page_is_ram(pfn)) { - SetPageReserved(page); - return; - } - - if (bad_ppro && page_kills_ppro(pfn)) { - SetPageReserved(page); - return; - } - ClearPageReserved(page); set_bit(PG_highmem, &page->flags); atomic_set(&page->count, 1); - __free_page(page); + if ( free_page ) + __free_page(page); totalhigh_pages++; } #endif /* CONFIG_HIGHMEM */ @@ -392,8 +372,9 @@ static int __init free_pages_init(void) reservedpages++; } #ifdef CONFIG_HIGHMEM - for (pfn = xen_start_info.nr_pages-1; pfn >= highstart_pfn; pfn--) - one_highpage_init((struct page *) (mem_map + pfn), pfn, bad_ppro); + for (pfn = highend_pfn-1; pfn >= highstart_pfn; pfn--) + one_highpage_init((struct page *) (mem_map + pfn), pfn, + (pfn < xen_start_info.nr_pages)); totalram_pages += totalhigh_pages; #endif return reservedpages; |