Added support for IPoIB on RHEL7.6
[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_KVCALLOC
64 #include <linux/vmalloc.h>
65 #include <linux/slab.h>
66
67 static inline void *kvcalloc(size_t n, size_t size, gfp_t flags)
68 {
69         return kvmalloc_array(n, size, flags | __GFP_ZERO);
70 }
71 #endif
72
73 #ifndef HAVE_WANT_INIT_ON_ALLOC
74 static inline bool want_init_on_alloc(gfp_t flags)
75 {
76         return flags & __GFP_ZERO;
77 }
78 #endif
79
80 #ifndef HAVE_PUT_USER_PAGE
81 /**
82  * put_user_page() - release a gup-pinned page
83  * @page:            pointer to page to be released
84  *
85  * Pages that were pinned via get_user_pages*() must be released via
86  * either put_user_page(), or one of the put_user_pages*() routines
87  * below. This is so that eventually, pages that are pinned via
88  * get_user_pages*() can be separately tracked and uniquely handled. In
89  * particular, interactions with RDMA and filesystems need special
90  * handling.
91  *
92  * put_user_page() and put_page() are not interchangeable, despite this early
93  * implementation that makes them look the same. put_user_page() calls must
94  * be perfectly matched up with get_user_page() calls.
95  */
96 static inline void put_user_page(struct page *page)
97 {
98         put_page(page);
99 }
100
101 void put_user_pages_dirty(struct page **pages, unsigned long npages);
102 void put_user_pages_dirty_lock(struct page **pages, unsigned long npages);
103 void put_user_pages(struct page **pages, unsigned long npages);
104 #endif /* HAVE_PUT_USER_PAGE */
105
106 #endif /* _COMPAT_LINUX_MM_H */
107