Commit | Line | Data |
---|---|---|
a1d312de | 1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
1da177e4 LT |
2 | /* |
3 | * malloc.h - NTFS kernel memory handling. Part of the Linux-NTFS project. | |
4 | * | |
f6098cf4 | 5 | * Copyright (c) 2001-2005 Anton Altaparmakov |
1da177e4 LT |
6 | */ |
7 | ||
8 | #ifndef _LINUX_NTFS_MALLOC_H | |
9 | #define _LINUX_NTFS_MALLOC_H | |
10 | ||
11 | #include <linux/vmalloc.h> | |
12 | #include <linux/slab.h> | |
13 | #include <linux/highmem.h> | |
14 | ||
15 | /** | |
06d0e3cf AA |
16 | * __ntfs_malloc - allocate memory in multiples of pages |
17 | * @size: number of bytes to allocate | |
18 | * @gfp_mask: extra flags for the allocator | |
19 | * | |
20 | * Internal function. You probably want ntfs_malloc_nofs()... | |
1da177e4 LT |
21 | * |
22 | * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and | |
23 | * returns a pointer to the allocated memory. | |
24 | * | |
25 | * If there was insufficient memory to complete the request, return NULL. | |
06d0e3cf | 26 | * Depending on @gfp_mask the allocation may be guaranteed to succeed. |
1da177e4 | 27 | */ |
29b89905 | 28 | static inline void *__ntfs_malloc(unsigned long size, gfp_t gfp_mask) |
1da177e4 LT |
29 | { |
30 | if (likely(size <= PAGE_SIZE)) { | |
31 | BUG_ON(!size); | |
32 | /* kmalloc() has per-CPU caches so is faster for now. */ | |
89ecf38c | 33 | return kmalloc(PAGE_SIZE, gfp_mask & ~__GFP_HIGHMEM); |
06d0e3cf | 34 | /* return (void *)__get_free_page(gfp_mask); */ |
1da177e4 | 35 | } |
ca79b0c2 | 36 | if (likely((size >> PAGE_SHIFT) < totalram_pages())) |
06d0e3cf | 37 | return __vmalloc(size, gfp_mask, PAGE_KERNEL); |
1da177e4 LT |
38 | return NULL; |
39 | } | |
40 | ||
06d0e3cf AA |
41 | /** |
42 | * ntfs_malloc_nofs - allocate memory in multiples of pages | |
43 | * @size: number of bytes to allocate | |
44 | * | |
45 | * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and | |
46 | * returns a pointer to the allocated memory. | |
47 | * | |
48 | * If there was insufficient memory to complete the request, return NULL. | |
49 | */ | |
50 | static inline void *ntfs_malloc_nofs(unsigned long size) | |
51 | { | |
52 | return __ntfs_malloc(size, GFP_NOFS | __GFP_HIGHMEM); | |
53 | } | |
54 | ||
55 | /** | |
56 | * ntfs_malloc_nofs_nofail - allocate memory in multiples of pages | |
57 | * @size: number of bytes to allocate | |
58 | * | |
59 | * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and | |
60 | * returns a pointer to the allocated memory. | |
61 | * | |
62 | * This function guarantees that the allocation will succeed. It will sleep | |
63 | * for as long as it takes to complete the allocation. | |
64 | * | |
65 | * If there was insufficient memory to complete the request, return NULL. | |
66 | */ | |
67 | static inline void *ntfs_malloc_nofs_nofail(unsigned long size) | |
68 | { | |
69 | return __ntfs_malloc(size, GFP_NOFS | __GFP_HIGHMEM | __GFP_NOFAIL); | |
70 | } | |
71 | ||
1da177e4 LT |
72 | static inline void ntfs_free(void *addr) |
73 | { | |
b0cbeee7 | 74 | kvfree(addr); |
1da177e4 LT |
75 | } |
76 | ||
77 | #endif /* _LINUX_NTFS_MALLOC_H */ |