xref: /openbmc/linux/fs/ntfs/malloc.h (revision 88dca4ca)
1a1d312deSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * malloc.h - NTFS kernel memory handling. Part of the Linux-NTFS project.
41da177e4SLinus Torvalds  *
5f6098cf4SAnton Altaparmakov  * Copyright (c) 2001-2005 Anton Altaparmakov
61da177e4SLinus Torvalds  */
71da177e4SLinus Torvalds 
81da177e4SLinus Torvalds #ifndef _LINUX_NTFS_MALLOC_H
91da177e4SLinus Torvalds #define _LINUX_NTFS_MALLOC_H
101da177e4SLinus Torvalds 
111da177e4SLinus Torvalds #include <linux/vmalloc.h>
121da177e4SLinus Torvalds #include <linux/slab.h>
131da177e4SLinus Torvalds #include <linux/highmem.h>
141da177e4SLinus Torvalds 
151da177e4SLinus Torvalds /**
1606d0e3cfSAnton Altaparmakov  * __ntfs_malloc - allocate memory in multiples of pages
1706d0e3cfSAnton Altaparmakov  * @size:	number of bytes to allocate
1806d0e3cfSAnton Altaparmakov  * @gfp_mask:	extra flags for the allocator
1906d0e3cfSAnton Altaparmakov  *
2006d0e3cfSAnton Altaparmakov  * Internal function.  You probably want ntfs_malloc_nofs()...
2106d0e3cfSAnton Altaparmakov  *
2206d0e3cfSAnton Altaparmakov  * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and
2306d0e3cfSAnton Altaparmakov  * returns a pointer to the allocated memory.
2406d0e3cfSAnton Altaparmakov  *
2506d0e3cfSAnton Altaparmakov  * If there was insufficient memory to complete the request, return NULL.
2606d0e3cfSAnton Altaparmakov  * Depending on @gfp_mask the allocation may be guaranteed to succeed.
2706d0e3cfSAnton Altaparmakov  */
__ntfs_malloc(unsigned long size,gfp_t gfp_mask)2829b89905SAnton Altaparmakov static inline void *__ntfs_malloc(unsigned long size, gfp_t gfp_mask)
2906d0e3cfSAnton Altaparmakov {
3006d0e3cfSAnton Altaparmakov 	if (likely(size <= PAGE_SIZE)) {
3106d0e3cfSAnton Altaparmakov 		BUG_ON(!size);
3206d0e3cfSAnton Altaparmakov 		/* kmalloc() has per-CPU caches so is faster for now. */
3389ecf38cSAnton Altaparmakov 		return kmalloc(PAGE_SIZE, gfp_mask & ~__GFP_HIGHMEM);
3406d0e3cfSAnton Altaparmakov 		/* return (void *)__get_free_page(gfp_mask); */
3506d0e3cfSAnton Altaparmakov 	}
36ca79b0c2SArun KS 	if (likely((size >> PAGE_SHIFT) < totalram_pages()))
3788dca4caSChristoph Hellwig 		return __vmalloc(size, gfp_mask);
3806d0e3cfSAnton Altaparmakov 	return NULL;
3906d0e3cfSAnton Altaparmakov }
4006d0e3cfSAnton Altaparmakov 
4106d0e3cfSAnton Altaparmakov /**
421da177e4SLinus Torvalds  * ntfs_malloc_nofs - allocate memory in multiples of pages
4306d0e3cfSAnton Altaparmakov  * @size:	number of bytes to allocate
441da177e4SLinus Torvalds  *
451da177e4SLinus Torvalds  * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and
461da177e4SLinus Torvalds  * returns a pointer to the allocated memory.
471da177e4SLinus Torvalds  *
481da177e4SLinus Torvalds  * If there was insufficient memory to complete the request, return NULL.
491da177e4SLinus Torvalds  */
ntfs_malloc_nofs(unsigned long size)501da177e4SLinus Torvalds static inline void *ntfs_malloc_nofs(unsigned long size)
511da177e4SLinus Torvalds {
5206d0e3cfSAnton Altaparmakov 	return __ntfs_malloc(size, GFP_NOFS | __GFP_HIGHMEM);
531da177e4SLinus Torvalds }
5406d0e3cfSAnton Altaparmakov 
5506d0e3cfSAnton Altaparmakov /**
5606d0e3cfSAnton Altaparmakov  * ntfs_malloc_nofs_nofail - allocate memory in multiples of pages
5706d0e3cfSAnton Altaparmakov  * @size:	number of bytes to allocate
5806d0e3cfSAnton Altaparmakov  *
5906d0e3cfSAnton Altaparmakov  * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and
6006d0e3cfSAnton Altaparmakov  * returns a pointer to the allocated memory.
6106d0e3cfSAnton Altaparmakov  *
6206d0e3cfSAnton Altaparmakov  * This function guarantees that the allocation will succeed.  It will sleep
6306d0e3cfSAnton Altaparmakov  * for as long as it takes to complete the allocation.
6406d0e3cfSAnton Altaparmakov  *
6506d0e3cfSAnton Altaparmakov  * If there was insufficient memory to complete the request, return NULL.
6606d0e3cfSAnton Altaparmakov  */
ntfs_malloc_nofs_nofail(unsigned long size)6706d0e3cfSAnton Altaparmakov static inline void *ntfs_malloc_nofs_nofail(unsigned long size)
6806d0e3cfSAnton Altaparmakov {
6906d0e3cfSAnton Altaparmakov 	return __ntfs_malloc(size, GFP_NOFS | __GFP_HIGHMEM | __GFP_NOFAIL);
701da177e4SLinus Torvalds }
711da177e4SLinus Torvalds 
ntfs_free(void * addr)721da177e4SLinus Torvalds static inline void ntfs_free(void *addr)
731da177e4SLinus Torvalds {
74b0cbeee7SPekka Enberg 	kvfree(addr);
751da177e4SLinus Torvalds }
761da177e4SLinus Torvalds 
771da177e4SLinus Torvalds #endif /* _LINUX_NTFS_MALLOC_H */
78