1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | * malloc.h - NTFS kernel memory handling. Part of the Linux-NTFS project. |
4 | * |
5 | * Copyright (c) 2001-2005 Anton Altaparmakov |
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 | /** |
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()... |
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. |
26 | * Depending on @gfp_mask the allocation may be guaranteed to succeed. |
27 | */ |
28 | static inline void *__ntfs_malloc(unsigned long size, gfp_t gfp_mask) |
29 | { |
30 | if (likely(size <= PAGE_SIZE)) { |
31 | BUG_ON(!size); |
32 | /* kmalloc() has per-CPU caches so is faster for now. */ |
33 | return kmalloc(PAGE_SIZE, flags: gfp_mask & ~__GFP_HIGHMEM); |
34 | /* return (void *)__get_free_page(gfp_mask); */ |
35 | } |
36 | if (likely((size >> PAGE_SHIFT) < totalram_pages())) |
37 | return __vmalloc(size, gfp_mask); |
38 | return NULL; |
39 | } |
40 | |
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 | |
72 | static inline void ntfs_free(void *addr) |
73 | { |
74 | kvfree(addr); |
75 | } |
76 | |
77 | #endif /* _LINUX_NTFS_MALLOC_H */ |
78 | |