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
63static const bool pages_can_purge_lazy =
64#ifdef PAGES_CAN_PURGE_LAZY
65 true
66#else
67 false
68#endif
69 ;
70static 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
82static const bool pages_can_hugify =
83#ifdef PAGES_CAN_HUGIFY
84 true
85#else
86 false
87#endif
88 ;
89
90typedef 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
100extern thp_mode_t opt_thp;
101extern thp_mode_t init_system_thp_mode; /* Initial system wide state. */
102extern const char *thp_mode_names[];
103
104void *pages_map(void *addr, size_t size, size_t alignment, bool *commit);
105void pages_unmap(void *addr, size_t size);
106bool pages_commit(void *addr, size_t size);
107bool pages_decommit(void *addr, size_t size);
108bool pages_purge_lazy(void *addr, size_t size);
109bool pages_purge_forced(void *addr, size_t size);
110bool pages_huge(void *addr, size_t size);
111bool pages_nohuge(void *addr, size_t size);
112bool pages_dontdump(void *addr, size_t size);
113bool pages_dodump(void *addr, size_t size);
114bool pages_boot(void);
115void pages_set_thp_state (void *ptr, size_t size);
116void pages_mark_guards(void *head, void *tail);
117void pages_unmark_guards(void *head, void *tail);
118
119#endif /* JEMALLOC_INTERNAL_PAGES_EXTERNS_H */
120