| // Copyright 2020 The Chromium Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef BASE_ALLOCATOR_PARTITION_ALLOC_FEATURES_H_ | |
| #define BASE_ALLOCATOR_PARTITION_ALLOC_FEATURES_H_ | |
| #include <string> | |
| #include "base/base_export.h" | |
| #include "base/compiler_specific.h" | |
| #include "base/feature_list.h" | |
| #include "base/metrics/field_trial_params.h" | |
| #include "build/build_config.h" | |
| #include "partition_alloc/buildflags.h" | |
| #include "partition_alloc/partition_root.h" | |
| namespace base::features { | |
| namespace internal { | |
| enum class PAFeatureEnabledProcesses { | |
| // Enabled only in the browser process. | |
| kBrowserOnly, | |
| // Enabled only in the browser and renderer processes. | |
| kBrowserAndRenderer, | |
| // Enabled in all processes, except renderer. | |
| kNonRenderer, | |
| // Enabled only in the GPU process. | |
| kGPUOnly, | |
| // Enabled only in the browser and tne GPU process. | |
| kBrowserAndGPU, | |
| // Enabled only in renderer processes. | |
| kRendererOnly, | |
| // Enabled in all child processes, except zygote. | |
| kAllChildProcesses, | |
| // Enabled in all processes. | |
| kAllProcesses, | |
| }; | |
| } // namespace internal | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocUnretainedDanglingPtr); | |
| enum class UnretainedDanglingPtrMode { | |
| kCrash, | |
| kDumpWithoutCrashing, | |
| }; | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM(UnretainedDanglingPtrMode, | |
| kUnretainedDanglingPtrModeParam); | |
| // See /docs/dangling_ptr.md | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocDanglingPtr); | |
| enum class DanglingPtrMode { | |
| // Crash immediately after detecting a dangling raw_ptr. | |
| kCrash, // (default) | |
| // Log the signature of every occurrences without crashing. It is used by | |
| // bots. | |
| // Format "[DanglingSignature]\t<1>\t<2>\t<3>\t<4>" | |
| // 1. The function which freed the memory while it was still referenced. | |
| // 2. The task in which the memory was freed. | |
| // 3. The function which released the raw_ptr reference. | |
| // 4. The task in which the raw_ptr was released. | |
| kLogOnly, | |
| // Note: This will be extended with a single shot DumpWithoutCrashing. | |
| }; | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM(DanglingPtrMode, kDanglingPtrModeParam); | |
| enum class DanglingPtrType { | |
| // Act on any dangling raw_ptr released after being freed. | |
| kAll, // (default) | |
| // Detect when freeing memory and releasing the dangling raw_ptr happens in | |
| // a different task. Those are more likely to cause use after free. | |
| kCrossTask, | |
| // Note: This will be extended with LongLived | |
| }; | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM(DanglingPtrType, kDanglingPtrTypeParam); | |
| using PartitionAllocWithAdvancedChecksEnabledProcesses = | |
| internal::PAFeatureEnabledProcesses; | |
| #if PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocLargeThreadCacheSize); | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocLargeEmptySlotSpanRing); | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM( | |
| int, | |
| kPartitionAllocLargeEmptySlotSpanRingSize); | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocWithAdvancedChecks); | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM( | |
| PartitionAllocWithAdvancedChecksEnabledProcesses, | |
| kPartitionAllocWithAdvancedChecksEnabledProcessesParam); | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocSchedulerLoopQuarantine); | |
| // See "base/allocator/scheduler_loop_quarantine_config.h" for details. | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM( | |
| std::string, | |
| kPartitionAllocSchedulerLoopQuarantineConfig); | |
| // Eventually zero out most PartitionAlloc memory. This is not meant as a | |
| // security guarantee, but to increase the compression ratio of PartitionAlloc's | |
| // fragmented super pages. | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocEventuallyZeroFreedMemory); | |
| #endif // PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) | |
| using BackupRefPtrEnabledProcesses = internal::PAFeatureEnabledProcesses; | |
| enum class BackupRefPtrMode { | |
| // BRP is disabled across all partitions. Equivalent to the Finch flag being | |
| // disabled. | |
| kDisabled, | |
| // BRP is enabled in the main partition, as well as certain Renderer-only | |
| // partitions (if enabled in Renderer at all). | |
| kEnabled, | |
| }; | |
| enum class MemtagMode { | |
| // memtagMode will be SYNC. | |
| kSync, | |
| // memtagMode will be ASYNC. | |
| kAsync, | |
| }; | |
| using MemoryTaggingEnabledProcesses = internal::PAFeatureEnabledProcesses; | |
| enum class BucketDistributionMode : uint8_t { | |
| kDefault, | |
| kDenser, | |
| }; | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocBackupRefPtr); | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM(BackupRefPtrEnabledProcesses, | |
| kBackupRefPtrEnabledProcessesParam); | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM(BackupRefPtrMode, | |
| kBackupRefPtrModeParam); | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM(int, | |
| kBackupRefPtrExtraExtrasSizeParam); | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM( | |
| bool, | |
| kBackupRefPtrSuppressDoubleFreeDetectedCrash); | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM( | |
| bool, | |
| kBackupRefPtrSuppressCorruptionDetectedCrash); | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocMemoryTagging); | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM(MemtagMode, kMemtagModeParam); | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM(MemoryTaggingEnabledProcesses, | |
| kMemoryTaggingEnabledProcessesParam); | |
| // Kill switch for memory tagging. Skips any code related to memory tagging when | |
| // enabled. | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kKillPartitionAllocMemoryTagging); | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocPermissiveMte); | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kAsanBrpDereferenceCheck); | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kAsanBrpExtractionCheck); | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kAsanBrpInstantiationCheck); | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM(BucketDistributionMode, | |
| kPartitionAllocBucketDistributionParam); | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kLowerPAMemoryLimitForNonMainRenderers); | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocUseDenserDistribution); | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocMemoryReclaimer); | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM(TimeDelta, | |
| kPartitionAllocMemoryReclaimerInterval); | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocAdaptiveMemoryReclaimInterval); | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM( | |
| TimeDelta, | |
| kPartitionAllocAdaptiveMemoryReclaimMinInterval); | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM( | |
| TimeDelta, | |
| kPartitionAllocAdaptiveMemoryReclaimMaxInterval); | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM( | |
| TimeDelta, | |
| kPartitionAllocAdaptiveMemoryReclaimDefaultInterval); | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM( | |
| int, | |
| kPartitionAllocAdaptiveMemoryReclaimMinDecommittableBytes); | |
| BASE_EXPORT BASE_DECLARE_FEATURE( | |
| kPartitionAllocStraightenLargerSlotSpanFreeLists); | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM( | |
| partition_alloc::StraightenLargerSlotSpanFreeListsMode, | |
| kPartitionAllocStraightenLargerSlotSpanFreeListsMode); | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocSortSmallerSlotSpanFreeLists); | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocSortActiveSlotSpans); | |
| #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM( | |
| bool, | |
| kPartialLowEndModeExcludePartitionAllocSupport); | |
| #endif | |
| // When set, partitions use a larger ring buffer and free memory less | |
| // aggressively when in the foreground. | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocAdjustSizeWhenInForeground); | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM( | |
| int, | |
| kPartitionAllocForegroundEmptySlotSpanRingSize); | |
| BASE_EXPORT BASE_DECLARE_FEATURE_PARAM( | |
| int, | |
| kPartitionAllocBackgroundEmptySlotSpanRingSize); | |
| #if PA_BUILDFLAG(ENABLE_PARTITION_LOCK_PRIORITY_INHERITANCE) | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocUsePriorityInheritanceLocks); | |
| #endif // PA_BUILDFLAG(ENABLE_PARTITION_LOCK_PRIORITY_INHERITANCE) | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocTighterAlignedAllocBound); | |
| BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocMemoryPressureMonitor); | |
| } // namespace base::features | |
| #endif // BASE_ALLOCATOR_PARTITION_ALLOC_FEATURES_H_ |