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