|  | // 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. | 
|  |  | 
|  | #ifdef UNSAFE_BUFFERS_BUILD | 
|  | // TODO(crbug.com/40284755): Remove this and spanify to fix the errors. | 
|  | #pragma allow_unsafe_buffers | 
|  | #endif | 
|  |  | 
|  | #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 "base/time/time.h" | 
|  | #include "build/build_config.h" | 
|  | #include "partition_alloc/buildflags.h" | 
|  | #include "partition_alloc/partition_alloc_base/time/time.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 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 int GetPartitionAllocLargeThreadCacheSizeValue(); | 
|  | BASE_EXPORT int GetPartitionAllocLargeThreadCacheSizeValueForLowRAMAndroid(); | 
|  |  | 
|  | BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocLargeEmptySlotSpanRing); | 
|  |  | 
|  | 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); | 
|  |  | 
|  | using PartitionAllocSchedulerLoopQuarantineTaskControlledPurgeEnabledProcesses = | 
|  | internal::PAFeatureEnabledProcesses; | 
|  | BASE_EXPORT BASE_DECLARE_FEATURE( | 
|  | kPartitionAllocSchedulerLoopQuarantineTaskControlledPurge); | 
|  | BASE_EXPORT BASE_DECLARE_FEATURE_PARAM( | 
|  | PartitionAllocSchedulerLoopQuarantineTaskControlledPurgeEnabledProcesses, | 
|  | kPartitionAllocSchedulerLoopQuarantineTaskControlledPurgeEnabledProcessesParam); | 
|  |  | 
|  | // 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, | 
|  | }; | 
|  |  | 
|  | enum class RetagMode { | 
|  | // Allocations are retagged by incrementing the current tag. | 
|  | kIncrement, | 
|  |  | 
|  | // Allocations are retagged with a random tag. | 
|  | kRandom, | 
|  | }; | 
|  |  | 
|  | 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(RetagMode, kRetagModeParam); | 
|  | 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( | 
|  | 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_WIN) | 
|  | BASE_EXPORT BASE_DECLARE_FEATURE(kPageAllocatorRetryOnCommitFailure); | 
|  | #endif | 
|  |  | 
|  | #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) | 
|  | BASE_EXPORT BASE_DECLARE_FEATURE_PARAM( | 
|  | bool, | 
|  | kPartialLowEndModeExcludePartitionAllocSupport); | 
|  | #endif | 
|  |  | 
|  | BASE_EXPORT BASE_DECLARE_FEATURE(kEnableConfigurableThreadCacheMultiplier); | 
|  | BASE_EXPORT double GetThreadCacheMultiplier(); | 
|  | BASE_EXPORT double GetThreadCacheMultiplierForAndroid(); | 
|  |  | 
|  | BASE_EXPORT BASE_DECLARE_FEATURE(kEnableConfigurableThreadCachePurgeInterval); | 
|  | extern const partition_alloc::internal::base::TimeDelta | 
|  | GetThreadCacheMinPurgeInterval(); | 
|  | extern const partition_alloc::internal::base::TimeDelta | 
|  | GetThreadCacheMaxPurgeInterval(); | 
|  | extern const partition_alloc::internal::base::TimeDelta | 
|  | GetThreadCacheDefaultPurgeInterval(); | 
|  |  | 
|  | BASE_EXPORT BASE_DECLARE_FEATURE( | 
|  | kEnableConfigurableThreadCacheMinCachedMemoryForPurging); | 
|  | BASE_EXPORT int GetThreadCacheMinCachedMemoryForPurgingBytes(); | 
|  |  | 
|  | BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocDisableBRPInBufferPartition); | 
|  |  | 
|  | // When set, partitions use a larger ring buffer and free memory less | 
|  | // aggressively when in the foreground. | 
|  | BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocAdjustSizeWhenInForeground); | 
|  |  | 
|  | // When enabled, uses a more nuanced heuristic to determine if slot | 
|  | // spans can be treated as "single-slot." | 
|  | // | 
|  | // See also: https://crbug.com/333443437 | 
|  | BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocUseSmallSingleSlotSpans); | 
|  |  | 
|  | #if PA_BUILDFLAG(ENABLE_PARTITION_LOCK_PRIORITY_INHERITANCE) | 
|  | BASE_EXPORT BASE_DECLARE_FEATURE(kPartitionAllocUsePriorityInheritanceLocks); | 
|  | #endif  // PA_BUILDFLAG(ENABLE_PARTITION_LOCK_PRIORITY_INHERITANCE) | 
|  |  | 
|  | }  // namespace base::features | 
|  |  | 
|  | #endif  // BASE_ALLOCATOR_PARTITION_ALLOC_FEATURES_H_ |