Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions Source/WTF/wtf/PageBlock.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,14 @@ namespace WTF {
// On Linux, Power systems normally use 64 KiB pages.
//
// aarch64 systems seem to be all over the place. Most Linux distros use 4 KiB, but RHEL uses
// 64 KiB. Linux on Apple Silicon uses 16KiB for best performance, so use that for Linux on
// aarch64 by default. USE(64KB_PAGE_BLOCK) allows overriding this.
// 64 KiB. Since we cannot know the page size at compile time on Linux, use 64 KiB as the ceiling
// for Linux ARM64 to support all possible page size configurations (4 KiB, 16 KiB, 64 KiB).
// USE(64KB_PAGE_BLOCK) allows overriding this on other architectures too.
//
// Use 64 KiB for any unknown CPUs to be conservative.
#if OS(DARWIN) || PLATFORM(PLAYSTATION) || CPU(MIPS) || CPU(MIPS64) || CPU(LOONGARCH64) || (OS(LINUX) && CPU(ARM64) && !USE(64KB_PAGE_BLOCK))
#if OS(DARWIN) || PLATFORM(PLAYSTATION) || CPU(MIPS) || CPU(MIPS64) || CPU(LOONGARCH64)
constexpr size_t CeilingOnPageSize = 16 * KB;
#elif USE(64KB_PAGE_BLOCK) || CPU(PPC) || CPU(PPC64) || CPU(PPC64LE) || CPU(UNKNOWN)
#elif USE(64KB_PAGE_BLOCK) || (OS(LINUX) && CPU(ARM64)) || CPU(PPC) || CPU(PPC64) || CPU(PPC64LE) || CPU(UNKNOWN)
constexpr size_t CeilingOnPageSize = 64 * KB;
#elif OS(WINDOWS) || CPU(X86) || CPU(X86_64) || CPU(ARM) || CPU(ARM64) || CPU(RISCV64)
constexpr size_t CeilingOnPageSize = 4 * KB;
Expand Down
4 changes: 4 additions & 0 deletions Source/bmalloc/bmalloc/BPlatform.h
Original file line number Diff line number Diff line change
Expand Up @@ -454,6 +454,10 @@
#define BUSE_PRECOMPUTED_CONSTANTS_VMPAGE16K 1
#endif

#if !defined(BUSE_PRECOMPUTED_CONSTANTS_VMPAGE64K)
#define BUSE_PRECOMPUTED_CONSTANTS_VMPAGE64K 1
#endif

/* We only export the mallocSize and mallocGoodSize APIs if they're supported by the SystemHeap allocator (currently only Darwin) and the current bmalloc allocator (currently only libpas). */
#if BUSE(LIBPAS) && BOS(DARWIN)
#define BENABLE_MALLOC_SIZE 1
Expand Down
16 changes: 16 additions & 0 deletions Source/bmalloc/libpas/src/libpas/jit_heap_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,16 +40,32 @@ PAS_BEGIN_EXTERN_C;
#define JIT_SMALL_SEGREGATED_MIN_ALIGN (1u << JIT_SMALL_SEGREGATED_MIN_ALIGN_SHIFT)
#define JIT_SMALL_BITFIT_MIN_ALIGN_SHIFT 2u
#define JIT_SMALL_BITFIT_MIN_ALIGN (1u << JIT_SMALL_BITFIT_MIN_ALIGN_SHIFT)
#if PAS_ARM64 && PAS_OS(LINUX)
#define JIT_SMALL_PAGE_SIZE 65536u
#define JIT_SMALL_GRANULE_SIZE 65536u
#else
#define JIT_SMALL_PAGE_SIZE 16384u
#define JIT_SMALL_GRANULE_SIZE 16384u
#endif
#if PAS_ARM64 && PAS_OS(LINUX)
/* granule_size >> min_align_shift must be < 254 (use_count is uint8_t with 255 = DECOMMITTED).
64K >> 8 = 256 overflows; 64K >> 9 = 128 is safe. Matches PAS_MIN_MEDIUM_ALIGN_SHIFT. */
#define JIT_MEDIUM_BITFIT_MIN_ALIGN_SHIFT 9u
#else
#define JIT_MEDIUM_BITFIT_MIN_ALIGN_SHIFT 8u
#endif
#define JIT_MEDIUM_BITFIT_MIN_ALIGN (1u << JIT_MEDIUM_BITFIT_MIN_ALIGN_SHIFT)
#if PAS_ARM64 && PAS_OS(LINUX)
#define JIT_MEDIUM_PAGE_SIZE 262144u
#define JIT_MEDIUM_GRANULE_SIZE 65536u
#else
#define JIT_MEDIUM_PAGE_SIZE 131072u
#if PAS_ARM64
#define JIT_MEDIUM_GRANULE_SIZE 16384u
#else
#define JIT_MEDIUM_GRANULE_SIZE 4096u
#endif
#endif

PAS_API void jit_heap_config_activate(void);

Expand Down
4 changes: 4 additions & 0 deletions Source/bmalloc/libpas/src/libpas/pas_expendable_memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,11 @@ struct pas_expendable_memory {
pas_expendable_memory_state states[1];
};

#if PAS_ARM64 && PAS_OS(LINUX)
#define PAS_EXPENDABLE_MEMORY_PAGE_SIZE 65536llu
#else
#define PAS_EXPENDABLE_MEMORY_PAGE_SIZE 16384llu
#endif

PAS_API extern pas_expendable_memory_state_version pas_expendable_memory_version_counter;

Expand Down
27 changes: 25 additions & 2 deletions Source/bmalloc/libpas/src/libpas/pas_internal_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,22 +35,43 @@
#define PAS_USE_MARGE_BITFIT_OVERRIDE true

/* The OS may have a smaller page size. That's OK. */
/* On Linux ARM64, kernels may be configured with 64 KiB pages (e.g. RHEL, Oracle Linux).
All page and granule sizes must be at least as large as the system page size, so use
64 KiB minimums on Linux ARM64 to support all possible kernel page configurations. */
#if PAS_ARM64 && PAS_OS(LINUX)
#define PAS_SMALL_PAGE_DEFAULT_SHIFT 16
#else
#define PAS_SMALL_PAGE_DEFAULT_SHIFT 14
#endif
#define PAS_SMALL_PAGE_DEFAULT_SIZE ((size_t)1 << PAS_SMALL_PAGE_DEFAULT_SHIFT)

#if PAS_ARM64 && PAS_OS(LINUX)
#define PAS_SMALL_BITFIT_PAGE_DEFAULT_SHIFT 16
#else
#define PAS_SMALL_BITFIT_PAGE_DEFAULT_SHIFT 14
#endif
#define PAS_SMALL_BITFIT_PAGE_DEFAULT_SIZE ((size_t)1 << PAS_SMALL_BITFIT_PAGE_DEFAULT_SHIFT)

#if PAS_ARM64 && PAS_OS(LINUX)
#define PAS_MEDIUM_PAGE_DEFAULT_SHIFT 18
#else
#define PAS_MEDIUM_PAGE_DEFAULT_SHIFT 17
#endif
#define PAS_MEDIUM_PAGE_DEFAULT_SIZE ((size_t)1 << PAS_MEDIUM_PAGE_DEFAULT_SHIFT)

#if PAS_ARM64 && PAS_OS(LINUX)
#define PAS_MEDIUM_BITFIT_PAGE_DEFAULT_SHIFT 19
#else
#define PAS_MEDIUM_BITFIT_PAGE_DEFAULT_SHIFT 19
#endif
#define PAS_MEDIUM_BITFIT_PAGE_DEFAULT_SIZE ((size_t)1 << PAS_MEDIUM_BITFIT_PAGE_DEFAULT_SHIFT)

#define PAS_MARGE_PAGE_DEFAULT_SHIFT 22
#define PAS_MARGE_PAGE_DEFAULT_SIZE ((size_t)1 << PAS_MARGE_PAGE_DEFAULT_SHIFT)

#if PAS_ARM64 || PAS_PLATFORM(PLAYSTATION)
#if PAS_ARM64 && PAS_OS(LINUX)
#define PAS_GRANULE_DEFAULT_SHIFT 16
#elif PAS_ARM64 || PAS_PLATFORM(PLAYSTATION)
#define PAS_GRANULE_DEFAULT_SHIFT 14
#else
#define PAS_GRANULE_DEFAULT_SHIFT 12
Expand Down Expand Up @@ -131,7 +152,9 @@

#define PAS_NUM_BASELINE_ALLOCATORS 32u

#define PAS_MAX_OBJECTS_PER_PAGE 2048
/* Must be >= max(page_size >> min_align_shift) across all segregated configs.
Utility heap uses PAS_INTERNAL_MIN_ALIGN_SHIFT (3) with the small page. */
#define PAS_MAX_OBJECTS_PER_PAGE (PAS_SMALL_PAGE_DEFAULT_SIZE >> PAS_INTERNAL_MIN_ALIGN_SHIFT)

#define PAS_MPROTECT_DECOMMITTED PAS_ENABLE_TESTING

Expand Down
Loading