Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 69e1e79b2660d6d6bdddb59b632d004e483be7d3
      
https://github.com/WebKit/WebKit/commit/69e1e79b2660d6d6bdddb59b632d004e483be7d3
  Author: Marcus Plutowski <[email protected]>
  Date:   2026-10-12 (Mon, 12 Oct 2026)

  Changed paths:
    M Source/bmalloc/CMakeLists.txt
    M Source/bmalloc/bmalloc.xcodeproj/project.pbxproj
    M Source/bmalloc/libpas/Documentation.md
    M Source/bmalloc/libpas/libpas.xcodeproj/project.pbxproj
    M Source/bmalloc/libpas/src/libpas/bmalloc_heap_config.c
    M Source/bmalloc/libpas/src/libpas/bmalloc_heap_flex_internal.h
    M Source/bmalloc/libpas/src/libpas/bmalloc_heap_inlines.h
    M Source/bmalloc/libpas/src/libpas/bmalloc_heap_iso_internal.h
    M Source/bmalloc/libpas/src/libpas/hotbit_heap_config.c
    M Source/bmalloc/libpas/src/libpas/iso_heap_config.c
    M Source/bmalloc/libpas/src/libpas/iso_heap_inlines.h
    M Source/bmalloc/libpas/src/libpas/iso_test_heap_config.c
    M Source/bmalloc/libpas/src/libpas/jit_heap_config.c
    M Source/bmalloc/libpas/src/libpas/jit_heap_config.h
    M Source/bmalloc/libpas/src/libpas/minalign32_heap_config.c
    M Source/bmalloc/libpas/src/libpas/pagesize64k_heap_config.c
    M Source/bmalloc/libpas/src/libpas/pas_allocation_result.c
    M Source/bmalloc/libpas/src/libpas/pas_allocation_result.h
    M Source/bmalloc/libpas/src/libpas/pas_basic_heap_page_caches.h
    M Source/bmalloc/libpas/src/libpas/pas_bitfit_allocator.c
    M Source/bmalloc/libpas/src/libpas/pas_bitfit_directory.c
    M Source/bmalloc/libpas/src/libpas/pas_bitfit_page_inlines.h
    M Source/bmalloc/libpas/src/libpas/pas_bootstrap_free_heap.c
    M Source/bmalloc/libpas/src/libpas/pas_bootstrap_heap_page_provider.h
    M Source/bmalloc/libpas/src/libpas/pas_commit_span.c
    M Source/bmalloc/libpas/src/libpas/pas_commit_span.h
    M Source/bmalloc/libpas/src/libpas/pas_compact_heap_reservation.c
    M Source/bmalloc/libpas/src/libpas/pas_deferred_decommit_log.c
    M Source/bmalloc/libpas/src/libpas/pas_enumerable_page_malloc.c
    M Source/bmalloc/libpas/src/libpas/pas_enumerable_page_malloc.h
    M Source/bmalloc/libpas/src/libpas/pas_enumerator_region.c
    M Source/bmalloc/libpas/src/libpas/pas_expendable_memory.c
    M Source/bmalloc/libpas/src/libpas/pas_free_granules.c
    M Source/bmalloc/libpas/src/libpas/pas_heap_config.h
    M Source/bmalloc/libpas/src/libpas/pas_heap_config_utils.h
    M Source/bmalloc/libpas/src/libpas/pas_heap_config_utils_inlines.h
    M Source/bmalloc/libpas/src/libpas/pas_large_free_heap_deferred_commit_log.c
    M Source/bmalloc/libpas/src/libpas/pas_large_free_heap_helpers.c
    M Source/bmalloc/libpas/src/libpas/pas_large_heap.c
    M 
Source/bmalloc/libpas/src/libpas/pas_large_heap_physical_page_sharing_cache.c
    M 
Source/bmalloc/libpas/src/libpas/pas_large_heap_physical_page_sharing_cache.h
    M Source/bmalloc/libpas/src/libpas/pas_large_sharing_pool.c
    M Source/bmalloc/libpas/src/libpas/pas_large_sharing_pool.h
    M Source/bmalloc/libpas/src/libpas/pas_large_virtual_range.h
    M Source/bmalloc/libpas/src/libpas/pas_mar_registry.c
    M Source/bmalloc/libpas/src/libpas/pas_mar_registry.h
    M Source/bmalloc/libpas/src/libpas/pas_megapage_cache.h
    A Source/bmalloc/libpas/src/libpas/pas_memory_flavor.h
    M Source/bmalloc/libpas/src/libpas/pas_mte.h
    M Source/bmalloc/libpas/src/libpas/pas_mte_bootstrap_free_heap.c
    R Source/bmalloc/libpas/src/libpas/pas_page_flags.h
    M Source/bmalloc/libpas/src/libpas/pas_page_malloc.c
    M Source/bmalloc/libpas/src/libpas/pas_page_malloc.h
    M Source/bmalloc/libpas/src/libpas/pas_segregated_page.c
    M Source/bmalloc/libpas/src/libpas/pas_segregated_size_directory.c
    M Source/bmalloc/libpas/src/libpas/pas_segregated_view_allocator_inlines.h
    M Source/bmalloc/libpas/src/libpas/pas_status_reporter.c
    M Source/bmalloc/libpas/src/libpas/pas_status_reporter.h
    M Source/bmalloc/libpas/src/libpas/pas_thread_local_cache.c
    M Source/bmalloc/libpas/src/libpas/pas_utility_heap_config.h
    M Source/bmalloc/libpas/src/libpas/pas_virtual_range.h
    M Source/bmalloc/libpas/src/libpas/tagged_bmalloc_heap_config.c
    M Source/bmalloc/libpas/src/libpas/tagged_bmalloc_heap_config.h
    M Source/bmalloc/libpas/src/libpas/tagged_bmalloc_heap_inlines.h
    M Source/bmalloc/libpas/src/libpas/thingy_heap.c
    M Source/bmalloc/libpas/src/libpas/thingy_heap_config.c
    M Source/bmalloc/libpas/src/test/LargeFreeHeapTests.cpp
    M Source/bmalloc/libpas/src/test/LargeSharingPoolTests.cpp
    A Source/bmalloc/libpas/src/test/MemoryFlavorTests.cpp
    M Source/bmalloc/libpas/src/test/TestHarness.cpp
    M Source/bmalloc/libpas/src/test/xctest/LibpasTests.mm

  Log Message:
  -----------
  [libpas] Introduce pas_memory_flavor and make pas_page_malloc flavor-aware
https://bugs.webkit.org/show_bug.cgi?id=326610
rdar://189358151

Reviewed by Dan Hecht.

Each pas_heap_config now has a pas_memory_flavor, which replaces its
pas_page_flags. The essential motivation is that in order to map memory
with a given set of flags, we need a distinct bootstrap-page-provider.
As such it wouldn't make sense to support arbitrary combinations of
flags; these 'flavors' are then the specific flag-combinations we
support, plus the ability to distinguish ownership even with identical
mapping flags.

Some motivating examples:
 - clean detection of MTE vs. non-MTE memory
 - natively allocating JIT memory, rather than requiring it be piped in
   from the consumer
 - first-class support for reservations like the Gigacage
 - allocating memory with special attributes (e.g. read-only)

As of right now only MTE is fully supported as an alternative flavor.
Everywhere that previously had is_mte or is_small_or_medium plumbed down
now uses the memory-flavor instead. This addresses some latent issues we
had with zeroing, which previously did not correctly distinguish MTE
from non-MTE tagged memory in the case of large objects; 'latent'
because we never actually tag large objects.

The goal is that every pas_heap will allocate memory with a single
flavor; in actuality, each can at least allocate two, thanks to the
system-heap.

Beyond the above, the status reporter now also dumps
pas_mte_bootstrap_free_heap, which backs all of tagged_bmalloc's memory,
including its large allocations. The mach_vm_map path for allocating MTE
memory is also now inlined rather than indirected via macro.

Tests: new MemoryFlavorTest suite, plus LargeSharingPoolTests

* Source/bmalloc/CMakeLists.txt:
* Source/bmalloc/bmalloc.xcodeproj/project.pbxproj:
* Source/bmalloc/libpas/Documentation.md:
* Source/bmalloc/libpas/libpas.xcodeproj/project.pbxproj:
* Source/bmalloc/libpas/src/libpas/bmalloc_heap_config.c:
* Source/bmalloc/libpas/src/libpas/bmalloc_heap_flex_internal.h:
(bmalloc_try_allocate_zeroed_flex_inline):
(bmalloc_allocate_zeroed_flex_inline):
* Source/bmalloc/libpas/src/libpas/bmalloc_heap_inlines.h:
(bmalloc_try_allocate_auxiliary_zeroed_inline):
(bmalloc_allocate_auxiliary_zeroed_inline):
(bmalloc_try_allocate_auxiliary_zeroed_with_alignment_inline):
(bmalloc_allocate_auxiliary_zeroed_with_alignment_inline):
(bmalloc_try_allocate_zeroed_with_alignment_inline):
(bmalloc_try_allocate_zeroed_inline):
(bmalloc_allocate_zeroed_inline):
(bmalloc_allocate_zeroed_with_alignment_inline):
* Source/bmalloc/libpas/src/libpas/bmalloc_heap_iso_internal.h:
(bmalloc_try_iso_allocate_zeroed_array_by_size_inline):
(bmalloc_iso_allocate_zeroed_array_by_size_inline):
* Source/bmalloc/libpas/src/libpas/hotbit_heap_config.c:
* Source/bmalloc/libpas/src/libpas/iso_heap_config.c:
* Source/bmalloc/libpas/src/libpas/iso_heap_inlines.h:
(iso_try_allocate_common_primitive_zeroed_inline):
(iso_allocate_common_primitive_zeroed_inline):
(iso_try_allocate_array_by_count_zeroed_inline):
(iso_allocate_array_by_count_zeroed_inline):
(iso_try_allocate_primitive_zeroed_inline):
(iso_allocate_primitive_zeroed_inline):
(iso_try_allocate_for_flex_inline):
* Source/bmalloc/libpas/src/libpas/iso_test_heap_config.c:
* Source/bmalloc/libpas/src/libpas/jit_heap_config.c:
(allocate_from_fresh):
* Source/bmalloc/libpas/src/libpas/jit_heap_config.h:
* Source/bmalloc/libpas/src/libpas/minalign32_heap_config.c:
* Source/bmalloc/libpas/src/libpas/pagesize64k_heap_config.c:
* Source/bmalloc/libpas/src/libpas/pas_allocation_result.c:
(pas_allocation_result_zero_large_slow):
* Source/bmalloc/libpas/src/libpas/pas_allocation_result.h:
(pas_allocation_result_zero):
* Source/bmalloc/libpas/src/libpas/pas_basic_heap_page_caches.h:
* Source/bmalloc/libpas/src/libpas/pas_bitfit_allocator.c:
(pas_bitfit_allocator_commit_view):
* Source/bmalloc/libpas/src/libpas/pas_bitfit_directory.c:
(pas_bitfit_directory_take_last_empty):
* Source/bmalloc/libpas/src/libpas/pas_bitfit_page_inlines.h:
(pas_bitfit_page_allocation_commit_granules_or_reloop):
* Source/bmalloc/libpas/src/libpas/pas_bootstrap_heap_page_provider.h:
* Source/bmalloc/libpas/src/libpas/pas_commit_span.c:
(pas_commit_span_construct):
(commit):
(decommit):
* Source/bmalloc/libpas/src/libpas/pas_commit_span.h:
* Source/bmalloc/libpas/src/libpas/pas_deferred_decommit_log.c:
(decommit_all):
* Source/bmalloc/libpas/src/libpas/pas_expendable_memory.c:
(scavenge_impl):
* Source/bmalloc/libpas/src/libpas/pas_free_granules.c:
(pas_free_granules_decommit_after_locking_range):
* Source/bmalloc/libpas/src/libpas/pas_heap_config.h:
(pas_heap_config_assert_global_invariants):
* Source/bmalloc/libpas/src/libpas/pas_heap_config_utils.h:
* Source/bmalloc/libpas/src/libpas/pas_heap_config_utils_inlines.h:
* Source/bmalloc/libpas/src/libpas/pas_large_free_heap_deferred_commit_log.c:
(commit):
(commit_all):
* Source/bmalloc/libpas/src/libpas/pas_large_free_heap_helpers.c:
(large_utility_aligned_allocator):
(pas_large_free_heap_helpers_try_allocate_with_alignment):
(pas_large_free_heap_helpers_deallocate):
* Source/bmalloc/libpas/src/libpas/pas_large_heap.c:
(allocate_impl):
(pas_large_heap_try_deallocate):
(pas_large_heap_try_shrink):
* Source/bmalloc/libpas/src/libpas/pas_large_heap_physical_page_sharing_cache.c:
(large_aligned_allocator):
* Source/bmalloc/libpas/src/libpas/pas_large_heap_physical_page_sharing_cache.h:
* Source/bmalloc/libpas/src/libpas/pas_large_sharing_pool.c:
(create_node):
(create_and_insert):
(boot_tree):
(states_match):
(split_node_and_get_right_impl):
(try_splat_impl):
(try_splat):
(splat):
(pas_large_sharing_pool_boot_free):
(pas_large_sharing_pool_free):
(pas_large_sharing_pool_allocate_and_commit):
(pas_large_sharing_pool_decommit_least_recently_used):
* Source/bmalloc/libpas/src/libpas/pas_large_sharing_pool.h:
* Source/bmalloc/libpas/src/libpas/pas_large_virtual_range.h:
(pas_large_virtual_range_create):
(pas_large_virtual_range_create_empty):
* Source/bmalloc/libpas/src/libpas/pas_mar_registry.c:
(pas_mar_did_allocate_and_zero):
* Source/bmalloc/libpas/src/libpas/pas_mar_registry.h:
* Source/bmalloc/libpas/src/libpas/pas_megapage_cache.h:
* Source/bmalloc/libpas/src/libpas/pas_memory_flavor.h:
(pas_memory_flavor_libpas_can_map):
(pas_memory_flavor_client_owns_permissions):
(pas_memory_flavor_is_executable):
(pas_memory_flavor_needs_mte_tag_storage):
(pas_memory_flavor_get_string):
* Source/bmalloc/libpas/src/libpas/pas_mte.h:
(pas_mte_retag_freed_region_if_tagged):
* Source/bmalloc/libpas/src/libpas/pas_page_flags.h: Removed.
* Source/bmalloc/libpas/src/libpas/pas_page_malloc.c:
(try_map_pages_with_mte_tag_storage):
(pas_page_malloc_try_map_pages):
(pas_page_malloc_try_allocate_without_deallocating_padding):
(zero_fill_pages_with_mte_tag_storage):
(pas_page_malloc_zero_fill):
(commit_impl):
(pas_page_malloc_commit):
(pas_page_malloc_commit_without_mprotect):
(decommit_impl):
(pas_page_malloc_decommit):
(pas_page_malloc_decommit_without_mprotect):
* Source/bmalloc/libpas/src/libpas/pas_page_malloc.h:
* Source/bmalloc/libpas/src/libpas/pas_segregated_page.c:
(pas_segregated_page_take_physically):
(pas_segregated_page_commit_fully):
* Source/bmalloc/libpas/src/libpas/pas_segregated_size_directory.c:
(take_last_empty_consider_view):
* Source/bmalloc/libpas/src/libpas/pas_segregated_view_allocator_inlines.h:
(pas_segregated_view_will_start_allocating):
* Source/bmalloc/libpas/src/libpas/pas_status_reporter.c:
(pas_status_reporter_dump_mte_bootstrap_free_heap):
(dump_large_sharing_pool_node_callback):
(pas_status_reporter_dump_everything):
* Source/bmalloc/libpas/src/libpas/pas_status_reporter.h:
* Source/bmalloc/libpas/src/libpas/pas_thread_local_cache.c:
(deallocate):
(pas_thread_local_cache_ensure_committed):
(decommit_allocator_range):
* Source/bmalloc/libpas/src/libpas/pas_utility_heap_config.h:
* Source/bmalloc/libpas/src/libpas/pas_virtual_range.h:
(pas_virtual_range_create):
(pas_virtual_range_create_empty):
* Source/bmalloc/libpas/src/libpas/tagged_bmalloc_heap_config.c:
* Source/bmalloc/libpas/src/libpas/tagged_bmalloc_heap_config.h:
* Source/bmalloc/libpas/src/libpas/tagged_bmalloc_heap_inlines.h:
(tagged_bmalloc_try_allocate_zeroed_with_alignment_inline):
(tagged_bmalloc_try_allocate_zeroed_inline):
(tagged_bmalloc_allocate_zeroed_inline):
(tagged_bmalloc_allocate_zeroed_with_alignment_inline):
* Source/bmalloc/libpas/src/libpas/thingy_heap.c:
(thingy_try_allocate_primitive_zeroed):
(thingy_try_allocate_zeroed):
(thingy_try_allocate_zeroed_array):
* Source/bmalloc/libpas/src/libpas/thingy_heap_config.c:
* Source/bmalloc/libpas/src/test/LargeSharingPoolTests.cpp:
(std::Range::Range):
(std::Range::operator== const):
(std::operator<<):
(std::testGoodCoalesceEpochUpdate):
(std::testDifferentFlavorsDoNotCoalesce):
(addLargeSharingPoolTests):
* Source/bmalloc/libpas/src/test/MemoryFlavorTests.cpp: Added.
(std::testHeapConfigFlavors):
(std::testPageCachesUseHeapConfigFlavor):
(std::hasMTETagStorage):
(std::checkMTETagStorage):
(std::testAllocateAndZeroFill):
(addMemoryFlavorTests):
* Source/bmalloc/libpas/src/test/TestHarness.cpp:
(main):
* Source/bmalloc/libpas/src/test/xctest/LibpasTests.mm:
* Source/bmalloc/libpas/src/libpas/pas_bootstrap_free_heap.c:
(bootstrap_source_allocate_aligned):
* Source/bmalloc/libpas/src/libpas/pas_compact_heap_reservation.c:
(initialize_if_necessary):
* Source/bmalloc/libpas/src/libpas/pas_enumerable_page_malloc.c:
(pas_enumerable_page_malloc_try_allocate_without_deallocating_padding):
* Source/bmalloc/libpas/src/libpas/pas_enumerable_page_malloc.h:
* Source/bmalloc/libpas/src/libpas/pas_enumerator_region.c:
(pas_enumerator_region_allocate):
* Source/bmalloc/libpas/src/libpas/pas_mte_bootstrap_free_heap.c:
(bootstrap_source_allocate_aligned):
* Source/bmalloc/libpas/src/test/LargeFreeHeapTests.cpp:
(std::testBootstrapHeap):

Canonical link: https://commits.webkit.org/323533@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications

Reply via email to