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()))
37*88dca4caSChristoph 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