xref: /freebsd/contrib/jemalloc/include/jemalloc/internal/pages.h (revision c43cad87172039ccf38172129c79755ea79e6102)
1 #ifndef JEMALLOC_INTERNAL_PAGES_EXTERNS_H
2 #define JEMALLOC_INTERNAL_PAGES_EXTERNS_H
3 
4 /* Page size.  LG_PAGE is determined by the configure script. */
5 #ifdef PAGE_MASK
6 #  undef PAGE_MASK
7 #endif
8 #define PAGE		((size_t)(1U << LG_PAGE))
9 #define PAGE_MASK	((size_t)(PAGE - 1))
10 /* Return the page base address for the page containing address a. */
11 #define PAGE_ADDR2BASE(a)						\
12 	((void *)((uintptr_t)(a) & ~PAGE_MASK))
13 /* Return the smallest pagesize multiple that is >= s. */
14 #define PAGE_CEILING(s)							\
15 	(((s) + PAGE_MASK) & ~PAGE_MASK)
16 /* Return the largest pagesize multiple that is <=s. */
17 #define PAGE_FLOOR(s) 							\
18 	((s) & ~PAGE_MASK)
19 
20 /* Huge page size.  LG_HUGEPAGE is determined by the configure script. */
21 #define HUGEPAGE	((size_t)(1U << LG_HUGEPAGE))
22 #define HUGEPAGE_MASK	((size_t)(HUGEPAGE - 1))
23 
24 #if LG_HUGEPAGE != 0
25 #  define HUGEPAGE_PAGES (HUGEPAGE / PAGE)
26 #else
27 /*
28  * It's convenient to define arrays (or bitmaps) of HUGEPAGE_PAGES lengths.  If
29  * we can't autodetect the hugepage size, it gets treated as 0, in which case
30  * we'll trigger a compiler error in those arrays.  Avoid this case by ensuring
31  * that this value is at least 1.  (We won't ever run in this degraded state;
32  * hpa_supported() returns false in this case.
33  */
34 #  define HUGEPAGE_PAGES 1
35 #endif
36 
37 /* Return the huge page base address for the huge page containing address a. */
38 #define HUGEPAGE_ADDR2BASE(a)						\
39 	((void *)((uintptr_t)(a) & ~HUGEPAGE_MASK))
40 /* Return the smallest pagesize multiple that is >= s. */
41 #define HUGEPAGE_CEILING(s)						\
42 	(((s) + HUGEPAGE_MASK) & ~HUGEPAGE_MASK)
43 
44 /* PAGES_CAN_PURGE_LAZY is defined if lazy purging is supported. */
45 #if defined(_WIN32) || defined(JEMALLOC_PURGE_MADVISE_FREE)
46 #  define PAGES_CAN_PURGE_LAZY
47 #endif
48 /*
49  * PAGES_CAN_PURGE_FORCED is defined if forced purging is supported.
50  *
51  * The only supported way to hard-purge on Windows is to decommit and then
52  * re-commit, but doing so is racy, and if re-commit fails it's a pain to
53  * propagate the "poisoned" memory state.  Since we typically decommit as the
54  * next step after purging on Windows anyway, there's no point in adding such
55  * complexity.
56  */
57 #if !defined(_WIN32) && ((defined(JEMALLOC_PURGE_MADVISE_DONTNEED) && \
58     defined(JEMALLOC_PURGE_MADVISE_DONTNEED_ZEROS)) || \
59     defined(JEMALLOC_MAPS_COALESCE))
60 #  define PAGES_CAN_PURGE_FORCED
61 #endif
62 
63 static const bool pages_can_purge_lazy =
64 #ifdef PAGES_CAN_PURGE_LAZY
65     true
66 #else
67     false
68 #endif
69     ;
70 static const bool pages_can_purge_forced =
71 #ifdef PAGES_CAN_PURGE_FORCED
72     true
73 #else
74     false
75 #endif
76     ;
77 
78 #if defined(JEMALLOC_HAVE_MADVISE_HUGE) || defined(JEMALLOC_HAVE_MEMCNTL)
79 #  define PAGES_CAN_HUGIFY
80 #endif
81 
82 static const bool pages_can_hugify =
83 #ifdef PAGES_CAN_HUGIFY
84     true
85 #else
86     false
87 #endif
88     ;
89 
90 typedef enum {
91 	thp_mode_default       = 0, /* Do not change hugepage settings. */
92 	thp_mode_always        = 1, /* Always set MADV_HUGEPAGE. */
93 	thp_mode_never         = 2, /* Always set MADV_NOHUGEPAGE. */
94 
95 	thp_mode_names_limit   = 3, /* Used for option processing. */
96 	thp_mode_not_supported = 3  /* No THP support detected. */
97 } thp_mode_t;
98 
99 #define THP_MODE_DEFAULT thp_mode_default
100 extern thp_mode_t opt_thp;
101 extern thp_mode_t init_system_thp_mode; /* Initial system wide state. */
102 extern const char *thp_mode_names[];
103 
104 void *pages_map(void *addr, size_t size, size_t alignment, bool *commit);
105 void pages_unmap(void *addr, size_t size);
106 bool pages_commit(void *addr, size_t size);
107 bool pages_decommit(void *addr, size_t size);
108 bool pages_purge_lazy(void *addr, size_t size);
109 bool pages_purge_forced(void *addr, size_t size);
110 bool pages_huge(void *addr, size_t size);
111 bool pages_nohuge(void *addr, size_t size);
112 bool pages_dontdump(void *addr, size_t size);
113 bool pages_dodump(void *addr, size_t size);
114 bool pages_boot(void);
115 void pages_set_thp_state (void *ptr, size_t size);
116 void pages_mark_guards(void *head, void *tail);
117 void pages_unmark_guards(void *head, void *tail);
118 
119 #endif /* JEMALLOC_INTERNAL_PAGES_EXTERNS_H */
120