Blame view

include/linux/highmem.h 4.75 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
  #ifndef _LINUX_HIGHMEM_H
  #define _LINUX_HIGHMEM_H
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3
4
  #include <linux/fs.h>
  #include <linux/mm.h>
ad76fb6b5   Peter Zijlstra   [PATCH] mm: k{,um...
5
  #include <linux/uaccess.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
7
  
  #include <asm/cacheflush.h>
03beb0766   James Bottomley   [PATCH] Add API f...
8
  #ifndef ARCH_HAS_FLUSH_ANON_PAGE
a6f36be32   Russell King   [ARM] pass vma fo...
9
  static inline void flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr)
03beb0766   James Bottomley   [PATCH] Add API f...
10
11
12
  {
  }
  #endif
5a3a5a98b   James Bottomley   [PATCH] Add flush...
13
14
15
16
17
  #ifndef ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE
  static inline void flush_kernel_dcache_page(struct page *page)
  {
  }
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
18
19
20
21
22
23
  #ifdef CONFIG_HIGHMEM
  
  #include <asm/highmem.h>
  
  /* declarations for linux/mm/highmem.c */
  unsigned int nr_free_highpages(void);
c1f60a5a4   Christoph Lameter   [PATCH] reduce MA...
24
  extern unsigned long totalhigh_pages;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25

ce6234b52   Jeremy Fitzhardinge   [PATCH] i386: PAR...
26
  void kmap_flush_unused(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
28
29
  #else /* CONFIG_HIGHMEM */
  
  static inline unsigned int nr_free_highpages(void) { return 0; }
c1f60a5a4   Christoph Lameter   [PATCH] reduce MA...
30
  #define totalhigh_pages 0
a6ca1b99e   James Bottomley   [PATCH] update to...
31
  #ifndef ARCH_HAS_KMAP
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32
33
34
35
36
37
38
  static inline void *kmap(struct page *page)
  {
  	might_sleep();
  	return page_address(page);
  }
  
  #define kunmap(page) do { (void) (page); } while (0)
254f9c5cd   Geert Uytterhoeven   Convert non-highm...
39
40
41
42
43
44
45
  #include <asm/kmap_types.h>
  
  static inline void *kmap_atomic(struct page *page, enum km_type idx)
  {
  	pagefault_disable();
  	return page_address(page);
  }
ce6234b52   Jeremy Fitzhardinge   [PATCH] i386: PAR...
46
  #define kmap_atomic_prot(page, idx, prot)	kmap_atomic(page, idx)
254f9c5cd   Geert Uytterhoeven   Convert non-highm...
47

ad76fb6b5   Peter Zijlstra   [PATCH] mm: k{,um...
48
49
  #define kunmap_atomic(addr, idx)	do { pagefault_enable(); } while (0)
  #define kmap_atomic_pfn(pfn, idx)	kmap_atomic(pfn_to_page(pfn), (idx))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
  #define kmap_atomic_to_page(ptr)	virt_to_page(ptr)
ce6234b52   Jeremy Fitzhardinge   [PATCH] i386: PAR...
51
52
  
  #define kmap_flush_unused()	do {} while(0)
a6ca1b99e   James Bottomley   [PATCH] update to...
53
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
55
56
57
58
59
60
61
62
  
  #endif /* CONFIG_HIGHMEM */
  
  /* when CONFIG_HIGHMEM is not set these will be plain clear/copy_page */
  static inline void clear_user_highpage(struct page *page, unsigned long vaddr)
  {
  	void *addr = kmap_atomic(page, KM_USER0);
  	clear_user_page(addr, vaddr, page);
  	kunmap_atomic(addr, KM_USER0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
63
64
65
  }
  
  #ifndef __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
769848c03   Mel Gorman   Add __GFP_MOVABLE...
66
67
68
69
70
71
72
73
74
75
76
77
78
79
  /**
   * __alloc_zeroed_user_highpage - Allocate a zeroed HIGHMEM page for a VMA with caller-specified movable GFP flags
   * @movableflags: The GFP flags related to the pages future ability to move like __GFP_MOVABLE
   * @vma: The VMA the page is to be allocated for
   * @vaddr: The virtual address the page will be inserted into
   *
   * This function will allocate a page for a VMA but the caller is expected
   * to specify via movableflags whether the page will be movable in the
   * future or not
   *
   * An architecture may override this function by defining
   * __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE and providing their own
   * implementation.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
  static inline struct page *
769848c03   Mel Gorman   Add __GFP_MOVABLE...
81
82
83
  __alloc_zeroed_user_highpage(gfp_t movableflags,
  			struct vm_area_struct *vma,
  			unsigned long vaddr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
84
  {
769848c03   Mel Gorman   Add __GFP_MOVABLE...
85
86
  	struct page *page = alloc_page_vma(GFP_HIGHUSER | movableflags,
  			vma, vaddr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
87
88
89
90
91
92
93
  
  	if (page)
  		clear_user_highpage(page, vaddr);
  
  	return page;
  }
  #endif
769848c03   Mel Gorman   Add __GFP_MOVABLE...
94
  /**
769848c03   Mel Gorman   Add __GFP_MOVABLE...
95
96
97
98
99
100
101
102
103
104
105
106
107
   * alloc_zeroed_user_highpage_movable - Allocate a zeroed HIGHMEM page for a VMA that the caller knows can move
   * @vma: The VMA the page is to be allocated for
   * @vaddr: The virtual address the page will be inserted into
   *
   * This function will allocate a page for a VMA that the caller knows will
   * be able to migrate in the future using move_pages() or reclaimed
   */
  static inline struct page *
  alloc_zeroed_user_highpage_movable(struct vm_area_struct *vma,
  					unsigned long vaddr)
  {
  	return __alloc_zeroed_user_highpage(__GFP_MOVABLE, vma, vaddr);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
108
109
110
111
112
113
  static inline void clear_highpage(struct page *page)
  {
  	void *kaddr = kmap_atomic(page, KM_USER0);
  	clear_page(kaddr);
  	kunmap_atomic(kaddr, KM_USER0);
  }
eebd2aa35   Christoph Lameter   Pagecache zeroing...
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
  static inline void zero_user_segments(struct page *page,
  	unsigned start1, unsigned end1,
  	unsigned start2, unsigned end2)
  {
  	void *kaddr = kmap_atomic(page, KM_USER0);
  
  	BUG_ON(end1 > PAGE_SIZE || end2 > PAGE_SIZE);
  
  	if (end1 > start1)
  		memset(kaddr + start1, 0, end1 - start1);
  
  	if (end2 > start2)
  		memset(kaddr + start2, 0, end2 - start2);
  
  	kunmap_atomic(kaddr, KM_USER0);
  	flush_dcache_page(page);
  }
  
  static inline void zero_user_segment(struct page *page,
  	unsigned start, unsigned end)
  {
  	zero_user_segments(page, start, end, 0, 0);
  }
  
  static inline void zero_user(struct page *page,
  	unsigned start, unsigned size)
  {
  	zero_user_segments(page, start, start + size, 0, 0);
  }
01f2705da   Nate Diller   fs: convert core ...
143

f37bc2712   Nate Diller   fs: deprecate mem...
144
  static inline void __deprecated memclear_highpage_flush(struct page *page,
01f2705da   Nate Diller   fs: convert core ...
145
  			unsigned int offset, unsigned int size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
146
  {
eebd2aa35   Christoph Lameter   Pagecache zeroing...
147
  	zero_user(page, offset, size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
148
  }
77fff4ae2   Atsushi Nemoto   [PATCH] Fix COW D...
149
  #ifndef __HAVE_ARCH_COPY_USER_HIGHPAGE
9de455b20   Atsushi Nemoto   [PATCH] Pass vma ...
150
151
  static inline void copy_user_highpage(struct page *to, struct page *from,
  	unsigned long vaddr, struct vm_area_struct *vma)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
152
153
154
155
156
157
158
159
  {
  	char *vfrom, *vto;
  
  	vfrom = kmap_atomic(from, KM_USER0);
  	vto = kmap_atomic(to, KM_USER1);
  	copy_user_page(vto, vfrom, vaddr, to);
  	kunmap_atomic(vfrom, KM_USER0);
  	kunmap_atomic(vto, KM_USER1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
160
  }
77fff4ae2   Atsushi Nemoto   [PATCH] Fix COW D...
161
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
162
163
164
165
166
167
168
169
170
171
172
173
  static inline void copy_highpage(struct page *to, struct page *from)
  {
  	char *vfrom, *vto;
  
  	vfrom = kmap_atomic(from, KM_USER0);
  	vto = kmap_atomic(to, KM_USER1);
  	copy_page(vto, vfrom);
  	kunmap_atomic(vfrom, KM_USER0);
  	kunmap_atomic(vto, KM_USER1);
  }
  
  #endif /* _LINUX_HIGHMEM_H */