aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/highmem.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/highmem.h')
-rw-r--r--include/linux/highmem.h48
1 files changed, 30 insertions, 18 deletions
diff --git a/include/linux/highmem.h b/include/linux/highmem.h
index 1fcb0033179e..61a5e5eb27f0 100644
--- a/include/linux/highmem.h
+++ b/include/linux/highmem.h
@@ -124,28 +124,40 @@ static inline void clear_highpage(struct page *page)
124 kunmap_atomic(kaddr, KM_USER0); 124 kunmap_atomic(kaddr, KM_USER0);
125} 125}
126 126
127/* 127static inline void zero_user_segments(struct page *page,
128 * Same but also flushes aliased cache contents to RAM. 128 unsigned start1, unsigned end1,
129 * 129 unsigned start2, unsigned end2)
130 * This must be a macro because KM_USER0 and friends aren't defined if 130{
131 * !CONFIG_HIGHMEM 131 void *kaddr = kmap_atomic(page, KM_USER0);
132 */ 132
133#define zero_user_page(page, offset, size, km_type) \ 133 BUG_ON(end1 > PAGE_SIZE || end2 > PAGE_SIZE);
134 do { \ 134
135 void *kaddr; \ 135 if (end1 > start1)
136 \ 136 memset(kaddr + start1, 0, end1 - start1);
137 BUG_ON((offset) + (size) > PAGE_SIZE); \ 137
138 \ 138 if (end2 > start2)
139 kaddr = kmap_atomic(page, km_type); \ 139 memset(kaddr + start2, 0, end2 - start2);
140 memset((char *)kaddr + (offset), 0, (size)); \ 140
141 flush_dcache_page(page); \ 141 kunmap_atomic(kaddr, KM_USER0);
142 kunmap_atomic(kaddr, (km_type)); \ 142 flush_dcache_page(page);
143 } while (0) 143}
144
145static inline void zero_user_segment(struct page *page,
146 unsigned start, unsigned end)
147{
148 zero_user_segments(page, start, end, 0, 0);
149}
150
151static inline void zero_user(struct page *page,
152 unsigned start, unsigned size)
153{
154 zero_user_segments(page, start, start + size, 0, 0);
155}
144 156
145static inline void __deprecated memclear_highpage_flush(struct page *page, 157static inline void __deprecated memclear_highpage_flush(struct page *page,
146 unsigned int offset, unsigned int size) 158 unsigned int offset, unsigned int size)
147{ 159{
148 zero_user_page(page, offset, size, KM_USER0); 160 zero_user(page, offset, size);
149} 161}
150 162
151#ifndef __HAVE_ARCH_COPY_USER_HIGHPAGE 163#ifndef __HAVE_ARCH_COPY_USER_HIGHPAGE