Commit | Line | Data |
---|---|---|
0b61f8a4 | 1 | // SPDX-License-Identifier: GPL-2.0 |
1da177e4 | 2 | /* |
7b718769 NS |
3 | * Copyright (c) 2000-2005 Silicon Graphics, Inc. |
4 | * All Rights Reserved. | |
1da177e4 LT |
5 | */ |
6 | #ifndef __XFS_SUPPORT_KMEM_H__ | |
7 | #define __XFS_SUPPORT_KMEM_H__ | |
8 | ||
9 | #include <linux/slab.h> | |
10 | #include <linux/sched.h> | |
11 | #include <linux/mm.h> | |
bdfb0430 | 12 | #include <linux/vmalloc.h> |
1da177e4 | 13 | |
8758280f NS |
14 | /* |
15 | * General memory allocation interfaces | |
16 | */ | |
17 | ||
77ba7877 | 18 | typedef unsigned __bitwise xfs_km_flags_t; |
77ba7877 AV |
19 | #define KM_NOFS ((__force xfs_km_flags_t)0x0004u) |
20 | #define KM_MAYFAIL ((__force xfs_km_flags_t)0x0008u) | |
359d992b | 21 | #define KM_ZERO ((__force xfs_km_flags_t)0x0010u) |
8758280f NS |
22 | |
23 | /* | |
24 | * We use a special process flag to avoid recursive callbacks into | |
25 | * the filesystem during transactions. We will also issue our own | |
26 | * warnings, so we explicitly skip any generic ones (silly of us). | |
27 | */ | |
28 | static inline gfp_t | |
77ba7877 | 29 | kmem_flags_convert(xfs_km_flags_t flags) |
1da177e4 | 30 | { |
8758280f | 31 | gfp_t lflags; |
1da177e4 | 32 | |
707e0dda | 33 | BUG_ON(flags & ~(KM_NOFS|KM_MAYFAIL|KM_ZERO)); |
1da177e4 | 34 | |
707e0dda TH |
35 | lflags = GFP_KERNEL | __GFP_NOWARN; |
36 | if (flags & KM_NOFS) | |
37 | lflags &= ~__GFP_FS; | |
359d992b | 38 | |
91c63ecd MH |
39 | /* |
40 | * Default page/slab allocator behavior is to retry for ever | |
41 | * for small allocations. We can override this behavior by using | |
42 | * __GFP_RETRY_MAYFAIL which will tell the allocator to retry as long | |
43 | * as it is feasible but rather fail than retry forever for all | |
44 | * request sizes. | |
45 | */ | |
46 | if (flags & KM_MAYFAIL) | |
47 | lflags |= __GFP_RETRY_MAYFAIL; | |
48 | ||
359d992b GZ |
49 | if (flags & KM_ZERO) |
50 | lflags |= __GFP_ZERO; | |
51 | ||
8758280f | 52 | return lflags; |
1da177e4 LT |
53 | } |
54 | ||
77ba7877 | 55 | extern void *kmem_alloc(size_t, xfs_km_flags_t); |
f8f9ee47 | 56 | extern void *kmem_alloc_io(size_t size, int align_mask, xfs_km_flags_t flags); |
cb0a8d23 | 57 | extern void *kmem_alloc_large(size_t size, xfs_km_flags_t); |
664b60f6 | 58 | extern void *kmem_realloc(const void *, size_t, xfs_km_flags_t); |
f3d21552 WY |
59 | static inline void kmem_free(const void *ptr) |
60 | { | |
61 | kvfree(ptr); | |
62 | } | |
8758280f | 63 | |
bdfb0430 | 64 | |
359d992b GZ |
65 | static inline void * |
66 | kmem_zalloc(size_t size, xfs_km_flags_t flags) | |
67 | { | |
68 | return kmem_alloc(size, flags | KM_ZERO); | |
cb0a8d23 DC |
69 | } |
70 | ||
71 | static inline void * | |
72 | kmem_zalloc_large(size_t size, xfs_km_flags_t flags) | |
73 | { | |
74 | return kmem_alloc_large(size, flags | KM_ZERO); | |
359d992b GZ |
75 | } |
76 | ||
8758280f NS |
77 | /* |
78 | * Zone interfaces | |
79 | */ | |
80 | ||
81 | #define KM_ZONE_HWALIGN SLAB_HWCACHE_ALIGN | |
82 | #define KM_ZONE_RECLAIM SLAB_RECLAIM_ACCOUNT | |
b0196009 | 83 | #define KM_ZONE_SPREAD SLAB_MEM_SPREAD |
5d097056 | 84 | #define KM_ZONE_ACCOUNT SLAB_ACCOUNT |
8758280f NS |
85 | |
86 | #define kmem_zone kmem_cache | |
87 | #define kmem_zone_t struct kmem_cache | |
88 | ||
89 | static inline kmem_zone_t * | |
1da177e4 LT |
90 | kmem_zone_init(int size, char *zone_name) |
91 | { | |
20c2df83 | 92 | return kmem_cache_create(zone_name, size, 0, 0, NULL); |
1da177e4 LT |
93 | } |
94 | ||
8758280f | 95 | static inline kmem_zone_t * |
d50112ed | 96 | kmem_zone_init_flags(int size, char *zone_name, slab_flags_t flags, |
51cc5068 | 97 | void (*construct)(void *)) |
8758280f | 98 | { |
20c2df83 | 99 | return kmem_cache_create(zone_name, size, 0, flags, construct); |
8758280f NS |
100 | } |
101 | ||
102 | static inline void | |
1da177e4 LT |
103 | kmem_zone_free(kmem_zone_t *zone, void *ptr) |
104 | { | |
105 | kmem_cache_free(zone, ptr); | |
106 | } | |
107 | ||
8758280f | 108 | static inline void |
1da177e4 LT |
109 | kmem_zone_destroy(kmem_zone_t *zone) |
110 | { | |
478f8da0 | 111 | kmem_cache_destroy(zone); |
1da177e4 LT |
112 | } |
113 | ||
77ba7877 | 114 | extern void *kmem_zone_alloc(kmem_zone_t *, xfs_km_flags_t); |
359d992b GZ |
115 | |
116 | static inline void * | |
117 | kmem_zone_zalloc(kmem_zone_t *zone, xfs_km_flags_t flags) | |
118 | { | |
119 | return kmem_zone_alloc(zone, flags | KM_ZERO); | |
120 | } | |
1da177e4 | 121 | |
72945d86 CH |
122 | static inline struct page * |
123 | kmem_to_page(void *addr) | |
124 | { | |
125 | if (is_vmalloc_addr(addr)) | |
126 | return vmalloc_to_page(addr); | |
127 | return virt_to_page(addr); | |
128 | } | |
129 | ||
1da177e4 | 130 | #endif /* __XFS_SUPPORT_KMEM_H__ */ |