diff options
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/highmem.h | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/include/linux/highmem.h b/include/linux/highmem.h index 1fcb003317..61a5e5eb27 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 | /* | 127 | static 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 | |||
| 145 | static 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 | |||
| 151 | static 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 | ||
| 145 | static inline void __deprecated memclear_highpage_flush(struct page *page, | 157 | static 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 |
