Line data Source code
1 : /* SPDX-License-Identifier: GPL-2.0 */ 2 : /* 3 : * Copyright (c) 2000-2005 Silicon Graphics, Inc. 4 : * All Rights Reserved. 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> 12 : #include <linux/vmalloc.h> 13 : 14 : /* 15 : * General memory allocation interfaces 16 : */ 17 : 18 : typedef unsigned __bitwise xfs_km_flags_t; 19 : #define KM_NOFS ((__force xfs_km_flags_t)0x0004u) 20 : #define KM_MAYFAIL ((__force xfs_km_flags_t)0x0008u) 21 : #define KM_ZERO ((__force xfs_km_flags_t)0x0010u) 22 : #define KM_NOLOCKDEP ((__force xfs_km_flags_t)0x0020u) 23 : 24 : /* 25 : * We use a special process flag to avoid recursive callbacks into 26 : * the filesystem during transactions. We will also issue our own 27 : * warnings, so we explicitly skip any generic ones (silly of us). 28 : */ 29 : static inline gfp_t 30 3046111545 : kmem_flags_convert(xfs_km_flags_t flags) 31 : { 32 3046111545 : gfp_t lflags; 33 : 34 3046111545 : BUG_ON(flags & ~(KM_NOFS | KM_MAYFAIL | KM_ZERO | KM_NOLOCKDEP)); 35 : 36 3046111545 : lflags = GFP_KERNEL | __GFP_NOWARN; 37 3046111545 : if (flags & KM_NOFS) 38 1514147884 : lflags &= ~__GFP_FS; 39 : 40 : /* 41 : * Default page/slab allocator behavior is to retry for ever 42 : * for small allocations. We can override this behavior by using 43 : * __GFP_RETRY_MAYFAIL which will tell the allocator to retry as long 44 : * as it is feasible but rather fail than retry forever for all 45 : * request sizes. 46 : */ 47 3046111545 : if (flags & KM_MAYFAIL) 48 1113772175 : lflags |= __GFP_RETRY_MAYFAIL; 49 : 50 3046111545 : if (flags & KM_ZERO) 51 1830146026 : lflags |= __GFP_ZERO; 52 : 53 3046111545 : if (flags & KM_NOLOCKDEP) 54 : lflags |= __GFP_NOLOCKDEP; 55 : 56 3046111545 : return lflags; 57 : } 58 : 59 : extern void *kmem_alloc(size_t, xfs_km_flags_t); 60 : static inline void kmem_free(const void *ptr) 61 : { 62 29783346108 : kvfree(ptr); 63 1643704793 : } 64 : 65 : 66 : static inline void * 67 : kmem_zalloc(size_t size, xfs_km_flags_t flags) 68 : { 69 1830255679 : return kmem_alloc(size, flags | KM_ZERO); 70 : } 71 : 72 : /* 73 : * Zone interfaces 74 : */ 75 : static inline struct page * 76 436450746 : kmem_to_page(void *addr) 77 : { 78 436450746 : if (is_vmalloc_addr(addr)) 79 30928896 : return vmalloc_to_page(addr); 80 405523548 : return virt_to_page(addr); 81 : } 82 : 83 : #endif /* __XFS_SUPPORT_KMEM_H__ */