]> git.neil.brown.name Git - history.git/commitdiff
Import 2.3.26 2.3.26
authorLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:28:21 +0000 (15:28 -0500)
committerLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:28:21 +0000 (15:28 -0500)
mm/bootmem.c

index e790acc4f186a24d4cae3ae2ebcd000ebd42d279..edc69e6b336f8911c659c52697c1da98bb71aa01 100644 (file)
@@ -36,9 +36,7 @@ unsigned long __init init_bootmem (unsigned long start, unsigned long pages)
 {
        unsigned long mapsize = (pages+7)/8;
 
-       if (bootmem_map)
-               BUG();
-       bootmem_map = __va(start << PAGE_SHIFT);
+       bootmem_map = phys_to_virt(start << PAGE_SHIFT);
        max_low_pfn = pages;
 
        /*
@@ -64,7 +62,6 @@ void __init reserve_bootmem (unsigned long addr, unsigned long size)
         */
        unsigned long end = (addr + size + PAGE_SIZE-1)/PAGE_SIZE;
 
-       if (!bootmem_map) BUG();
        if (!size) BUG();
 
        if (end > max_low_pfn)
@@ -77,18 +74,23 @@ void __init reserve_bootmem (unsigned long addr, unsigned long size)
 void __init free_bootmem (unsigned long addr, unsigned long size)
 {
        unsigned long i;
+       unsigned long start;
        /*
         * round down end of usable mem, partially free pages are
         * considered reserved.
         */
        unsigned long end = (addr + size)/PAGE_SIZE;
 
-       if (!bootmem_map) BUG();
        if (!size) BUG();
-
        if (end > max_low_pfn)
                BUG();
-       for (i = addr/PAGE_SIZE; i < end; i++) {
+
+       /*
+        * Round up the beginning of the address.
+        */
+       start = (addr + PAGE_SIZE-1) / PAGE_SIZE;
+
+       for (i = start; i < end; i++) {
                if (!test_and_clear_bit(i, bootmem_map))
                        BUG();
        }
@@ -117,7 +119,6 @@ void * __init __alloc_bootmem (unsigned long size, unsigned long align, unsigned
        unsigned long offset, remaining_size;
        unsigned long areasize, preferred;
 
-       if (!bootmem_map) BUG();
        if (!size) BUG();
 
        /*
@@ -152,6 +153,9 @@ restart_scan:
                preferred = 0;
                goto restart_scan;
        }
+       /*
+        * Whoops, we cannot satisfy the allocation request.
+        */
        BUG();
 found:
        if (start >= max_low_pfn)
@@ -173,11 +177,11 @@ found:
                        areasize = 0;
                        // last_pos unchanged
                        last_offset = offset+size;
-                       ret = __va(last_pos*PAGE_SIZE + offset);
+                       ret = phys_to_virt(last_pos*PAGE_SIZE + offset);
                } else {
                        size -= remaining_size;
                        areasize = (size+PAGE_SIZE-1)/PAGE_SIZE;
-                       ret = __va(last_pos*PAGE_SIZE + offset);
+                       ret = phys_to_virt(last_pos*PAGE_SIZE + offset);
                        last_pos = start+areasize-1;
                        last_offset = size;
                }
@@ -185,7 +189,7 @@ found:
        } else {
                last_pos = start + areasize - 1;
                last_offset = size & ~PAGE_MASK;
-               ret = __va(start * PAGE_SIZE);
+               ret = phys_to_virt(start * PAGE_SIZE);
        }
        /*
         * Reserve the area now:
@@ -211,12 +215,13 @@ unsigned long __init free_all_bootmem (void)
                        count++;
                        ClearPageReserved(page);
                        set_page_count(page, 1);
-                       if (i >= (__pa(MAX_DMA_ADDRESS) >> PAGE_SHIFT))
+                       if (i >= (virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT))
                                clear_bit(PG_DMA, &page->flags);
                        __free_page(page);
                }
        }
        total += count;
+
        /*
         * Now free the allocator bitmap itself, it's not
         * needed anymore: