summaryrefslogtreecommitdiff
path: root/include/linux/highmem.h
diff options
context:
space:
mode:
authorCong Wang <amwang@redhat.com>2011-11-25 22:08:45 +0800
committerCong Wang <xiyou.wangcong@gmail.com>2012-03-20 21:48:13 +0800
commit980c19e3f8ca1d5d43cce588059ea78cac27062a (patch)
tree35e9bea10a21ba78ba6fa58650c4ee6d18877f41 /include/linux/highmem.h
parentc16fa4f2ad19908a47c63d8fa436a1178438c7e7 (diff)
highmem: mark k[un]map_atomic() with two arguments as deprecated
For backward compatibility, we still keep the deprecated form, and will warn the users if they still use the deprecated one, like this: drivers/block/drbd/drbd_bitmap.c: In function ‘bm_page_io_async’: drivers/block/drbd/drbd_bitmap.c:973:3: warning: ‘kmap_atomic_deprecated’ is deprecated (declared at /home/wangcong/linux-2.6/include/linux/highmem.h:124) drivers/block/drbd/drbd_bitmap.c:977:3: warning: ‘kunmap_atomic_deprecated’ is deprecated (declared at /home/wangcong/linux-2.6/include/linux/highmem.h:144) Thanks to Nick Bowler for the cpp trick! Cc: Cesar Eduardo Barros <cesarb@cesarb.net> Cc: Nick Bowler <nbowler@elliptictech.com> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Signed-off-by: Cong Wang <amwang@redhat.com>
Diffstat (limited to 'include/linux/highmem.h')
-rw-r--r--include/linux/highmem.h52
1 files changed, 46 insertions, 6 deletions
diff --git a/include/linux/highmem.h b/include/linux/highmem.h
index 3a93f73a8acc..11617a835cf2 100644
--- a/include/linux/highmem.h
+++ b/include/linux/highmem.h
@@ -109,20 +109,60 @@ 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 *kmap_atomic(struct page *page)
+{
+ return __kmap_atomic(page);
+}
+
+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)