6793737a08439d79a3fe57334317f81c6863cc2e
[compat-rdma/compat.git] / include / linux / mm.h
1 #ifndef _COMPAT_LINUX_MM_H
2 #define _COMPAT_LINUX_MM_H
3
4 #include "../../compat/config.h"
5
6 #include_next <linux/mm.h>
7
8 #ifndef HAVE_KVZALLOC
9 #include <linux/vmalloc.h>
10 #include <linux/slab.h>
11
12 static inline void *kvzalloc(unsigned long size,...) {
13         void *rtn;
14
15         rtn = kzalloc(size, GFP_KERNEL | __GFP_NOWARN);
16         if (!rtn)
17                 rtn = vzalloc(size);
18         return rtn;
19 }
20 #endif
21
22 #ifndef HAVE_KVMALLOC_ARRAY
23 #include <linux/vmalloc.h>
24 #include <linux/slab.h>
25
26 static inline void *kvmalloc_array(size_t n, size_t size,...) {
27         void *rtn;
28
29         rtn = kcalloc(n, size, GFP_KERNEL | __GFP_NOWARN);
30         if (!rtn)
31                 rtn = vzalloc(n * size);
32         return rtn;
33 }
34 #endif
35
36 #ifndef HAVE_KVMALLOC_NODE
37 #include <linux/vmalloc.h>
38 #include <linux/slab.h>
39
40 static inline void *kvmalloc_node(size_t size, gfp_t flags, int node) {
41         void *rtn;
42
43         rtn = kmalloc_node(size, GFP_KERNEL | __GFP_NOWARN, node);
44         if (!rtn)
45                 rtn = vmalloc(size);
46         return rtn;
47 }
48 #endif
49
50 #ifndef HAVE_KVZALLOC_NODE
51 #include <linux/vmalloc.h>
52 #include <linux/slab.h>
53
54 static inline void *kvzalloc_node(size_t size, gfp_t flags, int node)
55 {
56         void *p = kvmalloc_node(size, flags, node);
57         if (p)
58                 memset(p, 0, size);
59         return p;
60 }
61 #endif
62
63 #ifndef HAVE_WANT_INIT_ON_ALLOC
64 static inline bool want_init_on_alloc(gfp_t flags)
65 {
66         return flags & __GFP_ZERO;
67 }
68 #endif
69
70 #ifndef HAVE_PUT_USER_PAGE
71 /**
72  * put_user_page() - release a gup-pinned page
73  * @page:            pointer to page to be released
74  *
75  * Pages that were pinned via get_user_pages*() must be released via
76  * either put_user_page(), or one of the put_user_pages*() routines
77  * below. This is so that eventually, pages that are pinned via
78  * get_user_pages*() can be separately tracked and uniquely handled. In
79  * particular, interactions with RDMA and filesystems need special
80  * handling.
81  *
82  * put_user_page() and put_page() are not interchangeable, despite this early
83  * implementation that makes them look the same. put_user_page() calls must
84  * be perfectly matched up with get_user_page() calls.
85  */
86 static inline void put_user_page(struct page *page)
87 {
88         put_page(page);
89 }
90
91 void put_user_pages_dirty(struct page **pages, unsigned long npages);
92 void put_user_pages_dirty_lock(struct page **pages, unsigned long npages);
93 void put_user_pages(struct page **pages, unsigned long npages);
94 #endif /* HAVE_PUT_USER_PAGE */
95
96 #endif /* _COMPAT_LINUX_MM_H */
97