Import 2.3.25pre1
[davej-history.git] / mm / highmem.c
blobfb7558863e3811f2b9a8820c6ee15b1715fa9498
1 /*
2 * High memory handling common code and variables.
4 * (C) 1999 Andrea Arcangeli, SuSE GmbH, andrea@suse.de
5 * Gerhard Wichert, Siemens AG, Gerhard.Wichert@pdb.siemens.de
7 * Redesigned the x86 32-bit VM architecture to deal with
8 * 64-bit physical space. With current x86 CPUs this
9 * means up to 64 Gigabytes physical RAM.
11 * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
14 #include <linux/mm.h>
15 #include <linux/pagemap.h>
16 #include <linux/highmem.h>
18 unsigned long highmem_mapnr;
19 unsigned long nr_free_highpages = 0;
21 struct page * prepare_highmem_swapout(struct page * page)
23 unsigned long regular_page;
24 unsigned long vaddr;
26 * If this is a highmem page so it can't be swapped out directly
27 * otherwise the b_data buffer addresses will break
28 * the lowlevel device drivers.
30 if (!PageHighMem(page))
31 return page;
33 regular_page = __get_free_page(GFP_ATOMIC);
34 if (!regular_page)
35 return NULL;
37 vaddr = kmap(page, KM_READ);
38 copy_page((void *)regular_page, (void *)vaddr);
39 kunmap(vaddr, KM_READ);
42 * ok, we can just forget about our highmem page since
43 * we stored its data into the new regular_page.
45 __free_page(page);
47 return mem_map + MAP_NR(regular_page);
50 struct page * replace_with_highmem(struct page * page)
52 struct page *highpage;
53 unsigned long vaddr;
55 if (PageHighMem(page) || !nr_free_highpages)
56 return page;
58 highpage = get_free_highpage(GFP_ATOMIC|__GFP_HIGHMEM);
59 if (!highpage)
60 return page;
61 if (!PageHighMem(highpage)) {
62 __free_page(highpage);
63 return page;
66 vaddr = kmap(highpage, KM_WRITE);
67 copy_page((void *)vaddr, (void *)page_address(page));
68 kunmap(vaddr, KM_WRITE);
70 /* Preserve the caching of the swap_entry. */
71 highpage->pg_offset = page->pg_offset;
72 highpage->mapping = page->mapping;
75 * We can just forget the old page since
76 * we stored its data into the new highmem-page.
78 __free_page(page);
80 return highpage;