aboutsummaryrefslogtreecommitdiffstats
path: root/linux-2.4.28-xen-sparse
diff options
context:
space:
mode:
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2004-11-30 17:17:07 +0000
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2004-11-30 17:17:07 +0000
commitf5f1e2a8d2bd951dbd4ee813f1a2744632b65332 (patch)
treec127a07ff24209159342ee5ac482140efe466d6e /linux-2.4.28-xen-sparse
parent18bbf10459e256dc78df99306b6faa820b636936 (diff)
downloadxen-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.c20
-rw-r--r--linux-2.4.28-xen-sparse/arch/xen/mm/init.c49
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;