bitkeeper revision 1.1159.258.14 (4220bd64Y3CN44gbDCh9mtv5s9QiDA)
authorkaf24@viper.(none) <kaf24@viper.(none)>
Sat, 26 Feb 2005 18:18:12 +0000 (18:18 +0000)
committerkaf24@viper.(none) <kaf24@viper.(none)>
Sat, 26 Feb 2005 18:18:12 +0000 (18:18 +0000)
Fix ballooning where initial allocation is lower than max possible lowmem.
Signed-off-by: Keir Fraser <keir@xensource.com>
linux-2.4.29-xen-sparse/arch/xen/mm/init.c
linux-2.6.10-xen-sparse/arch/xen/i386/mm/init.c
xen/arch/x86/domain.c

index c68e655a06421843a86d6e3b1e1dd34e712443a9..a2363d0cce8b7300979ad420fbdf5e04e0b9db68 100644 (file)
@@ -366,6 +366,12 @@ static int __init free_pages_init(void)
 
     /* this will put all low memory onto the freelists */
     totalram_pages += free_all_bootmem();
+    /* XEN: init and count low-mem pages outside initial allocation. */
+    for (pfn = boot_pfn; pfn < max_low_pfn; pfn++) {
+        ClearPageReserved(&mem_map[pfn]);
+        atomic_set(&mem_map[pfn].count, 1);
+        totalram_pages++;
+    }
 
     reservedpages = 0;
     for (pfn = 0; pfn < boot_pfn ; pfn++) {
index 70287cf4532f3c9f41e41f05ee6c1864a1a1c99d..78abb78eae0ad845612cef275ce573e63d4b2238 100644 (file)
@@ -177,8 +177,10 @@ static void __init kernel_physical_mapping_init(pgd_t *pgd_base)
                                pte = one_page_table_init(pmd);
 
                                pte += pte_ofs;
-                               /* XEN: Only map initial RAM allocation. */
-                               for (; pte_ofs < PTRS_PER_PTE && pfn < max_ram_pfn; pte++, pfn++, pte_ofs++) {
+                               for (; pte_ofs < PTRS_PER_PTE && pfn < max_low_pfn; pte++, pfn++, pte_ofs++) {
+                                               /* XEN: Only map initial RAM allocation. */
+                                               if (pfn >= max_ram_pfn)
+                                                       break;
                                                if (pte_present(*pte))
                                                        continue;
                                                if (is_kernel_text(address))
@@ -627,6 +629,7 @@ void __init mem_init(void)
        int codesize, reservedpages, datasize, initsize;
        int tmp;
        int bad_ppro;
+       unsigned long pfn;
 
 #ifndef CONFIG_DISCONTIGMEM
        if (!mem_map)
@@ -655,6 +658,12 @@ void __init mem_init(void)
 
        /* this will put all low memory onto the freelists */
        totalram_pages += __free_all_bootmem();
+       /* XEN: init and count low-mem pages outside initial allocation. */
+       for (pfn = xen_start_info.nr_pages; pfn < max_low_pfn; pfn++) {
+               ClearPageReserved(&mem_map[pfn]);
+               atomic_set(&mem_map[pfn].count, 1);
+               totalram_pages++;
+       }
 
        reservedpages = 0;
        for (tmp = 0; tmp < max_low_pfn; tmp++)
index e4c427d402122bd424dbbb916eabd46a093b9aed..21cfdd9515b07af55b34202c6d838bc0bcf2e2f8 100644 (file)
@@ -764,6 +764,7 @@ int construct_dom0(struct domain *p,
     printk("done.\n");
 
     /* Construct a frame-allocation list for the initial domain. */
+    p->max_pages = ~0U;
     for ( mfn = (alloc_start>>PAGE_SHIFT); 
           mfn < (alloc_end>>PAGE_SHIFT); 
           mfn++ )
@@ -773,7 +774,7 @@ int construct_dom0(struct domain *p,
         page->u.inuse.type_info = 0;
         page->count_info        = PGC_allocated | 1;
         list_add_tail(&page->list, &p->page_list);
-        p->tot_pages++; p->max_pages++;
+        p->tot_pages++; 
     }
 
     mpt_alloc = (vpt_start - dsi.v_start) + alloc_start;