Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[firefly-linux-kernel-4.4.55.git] / include / linux / highmem.h
index 3a93f73a8acc8001bb69d6fcf2f0cd871030aeaa..6549ed75e0a72f9364f9fc3dce94cb6c07405c5e 100644 (file)
@@ -55,12 +55,12 @@ static inline void kunmap(struct page *page)
 {
 }
 
-static inline void *__kmap_atomic(struct page *page)
+static inline void *kmap_atomic(struct page *page)
 {
        pagefault_disable();
        return page_address(page);
 }
-#define kmap_atomic_prot(page, prot)   __kmap_atomic(page)
+#define kmap_atomic_prot(page, prot)   kmap_atomic(page)
 
 static inline void __kunmap_atomic(void *addr)
 {
@@ -109,27 +109,62 @@ static inline void kmap_atomic_idx_pop(void)
 #endif
 
 /*
- * Make both: kmap_atomic(page, idx) and kmap_atomic(page) work.
+ * NOTE:
+ * kmap_atomic() and kunmap_atomic() with two arguments are deprecated.
+ * We only keep them for backward compatibility, any usage of them
+ * are now warned.
  */
-#define kmap_atomic(page, args...) __kmap_atomic(page)
+
+#define PASTE(a, b) a ## b
+#define PASTE2(a, b) PASTE(a, b)
+
+#define NARG_(_2, _1, n, ...) n
+#define NARG(...) NARG_(__VA_ARGS__, 2, 1, :)
+
+static inline void __deprecated *kmap_atomic_deprecated(struct page *page,
+                                                       enum km_type km)
+{
+       return kmap_atomic(page);
+}
+
+#define kmap_atomic1(...) kmap_atomic(__VA_ARGS__)
+#define kmap_atomic2(...) kmap_atomic_deprecated(__VA_ARGS__)
+#define kmap_atomic(...) PASTE2(kmap_atomic, NARG(__VA_ARGS__)(__VA_ARGS__))
+
+static inline void __deprecated __kunmap_atomic_deprecated(void *addr,
+                                                       enum km_type km)
+{
+       __kunmap_atomic(addr);
+}
 
 /*
  * Prevent people trying to call kunmap_atomic() as if it were kunmap()
  * kunmap_atomic() should get the return value of kmap_atomic, not the page.
  */
-#define kunmap_atomic(addr, args...)                           \
-do {                                                           \
-       BUILD_BUG_ON(__same_type((addr), struct page *));       \
-       __kunmap_atomic(addr);                                  \
+#define kunmap_atomic_deprecated(addr, km)                      \
+do {                                                            \
+       BUILD_BUG_ON(__same_type((addr), struct page *));       \
+       __kunmap_atomic_deprecated(addr, km);                   \
 } while (0)
 
+#define kunmap_atomic_withcheck(addr)                           \
+do {                                                            \
+       BUILD_BUG_ON(__same_type((addr), struct page *));       \
+       __kunmap_atomic(addr);                                  \
+} while (0)
+
+#define kunmap_atomic1(...) kunmap_atomic_withcheck(__VA_ARGS__)
+#define kunmap_atomic2(...) kunmap_atomic_deprecated(__VA_ARGS__)
+#define kunmap_atomic(...) PASTE2(kunmap_atomic, NARG(__VA_ARGS__)(__VA_ARGS__))
+/**** End of C pre-processor tricks for deprecated macros ****/
+
 /* when CONFIG_HIGHMEM is not set these will be plain clear/copy_page */
 #ifndef clear_user_highpage
 static inline void clear_user_highpage(struct page *page, unsigned long vaddr)
 {
-       void *addr = kmap_atomic(page, KM_USER0);
+       void *addr = kmap_atomic(page);
        clear_user_page(addr, vaddr, page);
-       kunmap_atomic(addr, KM_USER0);
+       kunmap_atomic(addr);
 }
 #endif
 
@@ -180,16 +215,16 @@ alloc_zeroed_user_highpage_movable(struct vm_area_struct *vma,
 
 static inline void clear_highpage(struct page *page)
 {
-       void *kaddr = kmap_atomic(page, KM_USER0);
+       void *kaddr = kmap_atomic(page);
        clear_page(kaddr);
-       kunmap_atomic(kaddr, KM_USER0);
+       kunmap_atomic(kaddr);
 }
 
 static inline void zero_user_segments(struct page *page,
        unsigned start1, unsigned end1,
        unsigned start2, unsigned end2)
 {
-       void *kaddr = kmap_atomic(page, KM_USER0);
+       void *kaddr = kmap_atomic(page);
 
        BUG_ON(end1 > PAGE_SIZE || end2 > PAGE_SIZE);
 
@@ -199,7 +234,7 @@ static inline void zero_user_segments(struct page *page,
        if (end2 > start2)
                memset(kaddr + start2, 0, end2 - start2);
 
-       kunmap_atomic(kaddr, KM_USER0);
+       kunmap_atomic(kaddr);
        flush_dcache_page(page);
 }
 
@@ -228,11 +263,11 @@ static inline void copy_user_highpage(struct page *to, struct page *from,
 {
        char *vfrom, *vto;
 
-       vfrom = kmap_atomic(from, KM_USER0);
-       vto = kmap_atomic(to, KM_USER1);
+       vfrom = kmap_atomic(from);
+       vto = kmap_atomic(to);
        copy_user_page(vto, vfrom, vaddr, to);
-       kunmap_atomic(vto, KM_USER1);
-       kunmap_atomic(vfrom, KM_USER0);
+       kunmap_atomic(vto);
+       kunmap_atomic(vfrom);
 }
 
 #endif
@@ -241,11 +276,11 @@ 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);
+       vfrom = kmap_atomic(from);
+       vto = kmap_atomic(to);
        copy_page(vto, vfrom);
-       kunmap_atomic(vto, KM_USER1);
-       kunmap_atomic(vfrom, KM_USER0);
+       kunmap_atomic(vto);
+       kunmap_atomic(vfrom);
 }
 
 #endif /* _LINUX_HIGHMEM_H */