1 /* Public domain. */ 2 3 #ifndef _LINUX_MM_H 4 #define _LINUX_MM_H 5 6 #include <sys/types.h> 7 #include <sys/param.h> 8 #include <sys/malloc.h> 9 #include <sys/stdint.h> 10 #include <sys/atomic.h> 11 #include <machine/cpu.h> 12 #include <uvm/uvm_extern.h> 13 #include <uvm/uvm_glue.h> 14 #include <lib/libkern/libkern.h> /* for flsl */ 15 #include <linux/shrinker.h> 16 #include <linux/overflow.h> 17 #include <linux/pgtable.h> 18 19 #define PageHighMem(x) 0 20 21 #define page_to_phys(page) (VM_PAGE_TO_PHYS(page)) 22 #define page_to_pfn(pp) (VM_PAGE_TO_PHYS(pp) / PAGE_SIZE) 23 #define pfn_to_page(pfn) (PHYS_TO_VM_PAGE(ptoa(pfn))) 24 #define nth_page(page, n) (&(page)[(n)]) 25 #define offset_in_page(off) ((vaddr_t)(off) & PAGE_MASK) 26 #define set_page_dirty(page) atomic_clearbits_int(&page->pg_flags, PG_CLEAN) 27 28 #define PAGE_ALIGN(addr) (((addr) + PAGE_MASK) & ~PAGE_MASK) 29 30 #define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) 31 #define PFN_DOWN(x) ((x) >> PAGE_SHIFT) 32 #define PFN_PHYS(x) ((x) << PAGE_SHIFT) 33 34 bool is_vmalloc_addr(const void *); 35 36 static inline void * 37 kvmalloc(size_t size, gfp_t flags) 38 { 39 return malloc(size, M_DRM, flags); 40 } 41 42 static inline void * 43 kvmalloc_array(size_t n, size_t size, int flags) 44 { 45 if (n != 0 && SIZE_MAX / n < size) 46 return NULL; 47 return malloc(n * size, M_DRM, flags); 48 } 49 50 static inline struct vm_page * 51 vmalloc_to_page(const void *va) 52 { 53 return uvm_atopg((vaddr_t)va); 54 } 55 56 static inline struct vm_page * 57 virt_to_page(const void *va) 58 { 59 return uvm_atopg((vaddr_t)va); 60 } 61 62 static inline void * 63 kvcalloc(size_t n, size_t size, int flags) 64 { 65 return kvmalloc_array(n, size, flags | M_ZERO); 66 } 67 68 static inline void * 69 kvzalloc(size_t size, int flags) 70 { 71 return malloc(size, M_DRM, flags | M_ZERO); 72 } 73 74 static inline void 75 kvfree(const void *objp) 76 { 77 free((void *)objp, M_DRM, 0); 78 } 79 80 static inline long 81 si_mem_available(void) 82 { 83 return uvmexp.free; 84 } 85 86 static inline unsigned int 87 get_order(size_t size) 88 { 89 return flsl((size - 1) >> PAGE_SHIFT); 90 } 91 92 static inline int 93 totalram_pages(void) 94 { 95 return uvmexp.npages; 96 } 97 98 #endif 99