xref: /netbsd-src/external/bsd/jemalloc.old/include/jemalloc/internal/pages.h (revision 8e33eff89e26cf71871ead62f0d5063e1313c33a)
1*8e33eff8Schristos #ifndef JEMALLOC_INTERNAL_PAGES_EXTERNS_H
2*8e33eff8Schristos #define JEMALLOC_INTERNAL_PAGES_EXTERNS_H
3*8e33eff8Schristos 
4*8e33eff8Schristos /* Page size.  LG_PAGE is determined by the configure script. */
5*8e33eff8Schristos #ifdef PAGE_MASK
6*8e33eff8Schristos #  undef PAGE_MASK
7*8e33eff8Schristos #endif
8*8e33eff8Schristos #define PAGE		((size_t)(1U << LG_PAGE))
9*8e33eff8Schristos #define PAGE_MASK	((size_t)(PAGE - 1))
10*8e33eff8Schristos /* Return the page base address for the page containing address a. */
11*8e33eff8Schristos #define PAGE_ADDR2BASE(a)						\
12*8e33eff8Schristos 	((void *)((uintptr_t)(a) & ~PAGE_MASK))
13*8e33eff8Schristos /* Return the smallest pagesize multiple that is >= s. */
14*8e33eff8Schristos #define PAGE_CEILING(s)							\
15*8e33eff8Schristos 	(((s) + PAGE_MASK) & ~PAGE_MASK)
16*8e33eff8Schristos 
17*8e33eff8Schristos /* Huge page size.  LG_HUGEPAGE is determined by the configure script. */
18*8e33eff8Schristos #define HUGEPAGE	((size_t)(1U << LG_HUGEPAGE))
19*8e33eff8Schristos #define HUGEPAGE_MASK	((size_t)(HUGEPAGE - 1))
20*8e33eff8Schristos /* Return the huge page base address for the huge page containing address a. */
21*8e33eff8Schristos #define HUGEPAGE_ADDR2BASE(a)						\
22*8e33eff8Schristos 	((void *)((uintptr_t)(a) & ~HUGEPAGE_MASK))
23*8e33eff8Schristos /* Return the smallest pagesize multiple that is >= s. */
24*8e33eff8Schristos #define HUGEPAGE_CEILING(s)						\
25*8e33eff8Schristos 	(((s) + HUGEPAGE_MASK) & ~HUGEPAGE_MASK)
26*8e33eff8Schristos 
27*8e33eff8Schristos /* PAGES_CAN_PURGE_LAZY is defined if lazy purging is supported. */
28*8e33eff8Schristos #if defined(_WIN32) || defined(JEMALLOC_PURGE_MADVISE_FREE)
29*8e33eff8Schristos #  define PAGES_CAN_PURGE_LAZY
30*8e33eff8Schristos #endif
31*8e33eff8Schristos /*
32*8e33eff8Schristos  * PAGES_CAN_PURGE_FORCED is defined if forced purging is supported.
33*8e33eff8Schristos  *
34*8e33eff8Schristos  * The only supported way to hard-purge on Windows is to decommit and then
35*8e33eff8Schristos  * re-commit, but doing so is racy, and if re-commit fails it's a pain to
36*8e33eff8Schristos  * propagate the "poisoned" memory state.  Since we typically decommit as the
37*8e33eff8Schristos  * next step after purging on Windows anyway, there's no point in adding such
38*8e33eff8Schristos  * complexity.
39*8e33eff8Schristos  */
40*8e33eff8Schristos #if !defined(_WIN32) && ((defined(JEMALLOC_PURGE_MADVISE_DONTNEED) && \
41*8e33eff8Schristos     defined(JEMALLOC_PURGE_MADVISE_DONTNEED_ZEROS)) || \
42*8e33eff8Schristos     defined(JEMALLOC_MAPS_COALESCE))
43*8e33eff8Schristos #  define PAGES_CAN_PURGE_FORCED
44*8e33eff8Schristos #endif
45*8e33eff8Schristos 
46*8e33eff8Schristos static const bool pages_can_purge_lazy =
47*8e33eff8Schristos #ifdef PAGES_CAN_PURGE_LAZY
48*8e33eff8Schristos     true
49*8e33eff8Schristos #else
50*8e33eff8Schristos     false
51*8e33eff8Schristos #endif
52*8e33eff8Schristos     ;
53*8e33eff8Schristos static const bool pages_can_purge_forced =
54*8e33eff8Schristos #ifdef PAGES_CAN_PURGE_FORCED
55*8e33eff8Schristos     true
56*8e33eff8Schristos #else
57*8e33eff8Schristos     false
58*8e33eff8Schristos #endif
59*8e33eff8Schristos     ;
60*8e33eff8Schristos 
61*8e33eff8Schristos typedef enum {
62*8e33eff8Schristos 	thp_mode_default       = 0, /* Do not change hugepage settings. */
63*8e33eff8Schristos 	thp_mode_always        = 1, /* Always set MADV_HUGEPAGE. */
64*8e33eff8Schristos 	thp_mode_never         = 2, /* Always set MADV_NOHUGEPAGE. */
65*8e33eff8Schristos 
66*8e33eff8Schristos 	thp_mode_names_limit   = 3, /* Used for option processing. */
67*8e33eff8Schristos 	thp_mode_not_supported = 3  /* No THP support detected. */
68*8e33eff8Schristos } thp_mode_t;
69*8e33eff8Schristos 
70*8e33eff8Schristos #define THP_MODE_DEFAULT thp_mode_default
71*8e33eff8Schristos extern thp_mode_t opt_thp;
72*8e33eff8Schristos extern thp_mode_t init_system_thp_mode; /* Initial system wide state. */
73*8e33eff8Schristos extern const char *thp_mode_names[];
74*8e33eff8Schristos 
75*8e33eff8Schristos void *pages_map(void *addr, size_t size, size_t alignment, bool *commit);
76*8e33eff8Schristos void pages_unmap(void *addr, size_t size);
77*8e33eff8Schristos bool pages_commit(void *addr, size_t size);
78*8e33eff8Schristos bool pages_decommit(void *addr, size_t size);
79*8e33eff8Schristos bool pages_purge_lazy(void *addr, size_t size);
80*8e33eff8Schristos bool pages_purge_forced(void *addr, size_t size);
81*8e33eff8Schristos bool pages_huge(void *addr, size_t size);
82*8e33eff8Schristos bool pages_nohuge(void *addr, size_t size);
83*8e33eff8Schristos bool pages_dontdump(void *addr, size_t size);
84*8e33eff8Schristos bool pages_dodump(void *addr, size_t size);
85*8e33eff8Schristos bool pages_boot(void);
86*8e33eff8Schristos void pages_set_thp_state (void *ptr, size_t size);
87*8e33eff8Schristos 
88*8e33eff8Schristos #endif /* JEMALLOC_INTERNAL_PAGES_EXTERNS_H */
89