diff options
Diffstat (limited to 'include/linux/highmem.h')
| -rw-r--r-- | include/linux/highmem.h | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/include/linux/highmem.h b/include/linux/highmem.h index a515eb0afdfb..98e2cce996a4 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h | |||
| @@ -94,17 +94,26 @@ static inline void clear_highpage(struct page *page) | |||
| 94 | 94 | ||
| 95 | /* | 95 | /* |
| 96 | * Same but also flushes aliased cache contents to RAM. | 96 | * Same but also flushes aliased cache contents to RAM. |
| 97 | * | ||
| 98 | * This must be a macro because KM_USER0 and friends aren't defined if | ||
| 99 | * !CONFIG_HIGHMEM | ||
| 97 | */ | 100 | */ |
| 98 | static inline void memclear_highpage_flush(struct page *page, unsigned int offset, unsigned int size) | 101 | #define zero_user_page(page, offset, size, km_type) \ |
| 102 | do { \ | ||
| 103 | void *kaddr; \ | ||
| 104 | \ | ||
| 105 | BUG_ON((offset) + (size) > PAGE_SIZE); \ | ||
| 106 | \ | ||
| 107 | kaddr = kmap_atomic(page, km_type); \ | ||
| 108 | memset((char *)kaddr + (offset), 0, (size)); \ | ||
| 109 | flush_dcache_page(page); \ | ||
| 110 | kunmap_atomic(kaddr, (km_type)); \ | ||
| 111 | } while (0) | ||
| 112 | |||
| 113 | static inline void __deprecated memclear_highpage_flush(struct page *page, | ||
| 114 | unsigned int offset, unsigned int size) | ||
| 99 | { | 115 | { |
| 100 | void *kaddr; | 116 | zero_user_page(page, offset, size, KM_USER0); |
| 101 | |||
| 102 | BUG_ON(offset + size > PAGE_SIZE); | ||
| 103 | |||
| 104 | kaddr = kmap_atomic(page, KM_USER0); | ||
| 105 | memset((char *)kaddr + offset, 0, size); | ||
| 106 | flush_dcache_page(page); | ||
| 107 | kunmap_atomic(kaddr, KM_USER0); | ||
| 108 | } | 117 | } |
| 109 | 118 | ||
| 110 | #ifndef __HAVE_ARCH_COPY_USER_HIGHPAGE | 119 | #ifndef __HAVE_ARCH_COPY_USER_HIGHPAGE |
