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>
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
;
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
))
33 regular_page
= __get_free_page(GFP_ATOMIC
);
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.
47 return mem_map
+ MAP_NR(regular_page
);
50 struct page
* replace_with_highmem(struct page
* page
)
52 struct page
*highpage
;
55 if (PageHighMem(page
) || !nr_free_highpages
)
58 highpage
= get_free_highpage(GFP_ATOMIC
|__GFP_HIGHMEM
);
61 if (!PageHighMem(highpage
)) {
62 __free_page(highpage
);
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.