blob: 749e0ea84569d24f149e270e5dd71f65efbd377f [file] [log] [blame]
[email protected]ed1cca4f2014-01-08 12:27:371// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/memory/discardable_memory.h"
Lei Zhang5743c3d2021-04-08 20:21:496
Gordon Guanf2f7a8402019-11-27 18:26:447#include "base/feature_list.h"
8#include "base/memory/discardable_memory_internal.h"
9#include "base/memory/madv_free_discardable_memory_posix.h"
10#include "base/metrics/field_trial_params.h"
11#include "build/build_config.h"
12
13#if defined(OS_ANDROID)
Lei Zhang5743c3d2021-04-08 20:21:4914#include "third_party/ashmem/ashmem.h"
Gordon Guanf2f7a8402019-11-27 18:26:4415#endif // defined(OS_ANDROID)
[email protected]ed1cca4f2014-01-08 12:27:3716
[email protected]ed1cca4f2014-01-08 12:27:3717namespace base {
[email protected]ed1cca4f2014-01-08 12:27:3718
Gordon Guanf2f7a8402019-11-27 18:26:4419namespace features {
20#if defined(OS_POSIX)
21// Feature flag allowing the use of MADV_FREE discardable memory when there are
22// multiple supported discardable memory backings.
23const base::Feature kMadvFreeDiscardableMemory{
24 "MadvFreeDiscardableMemory", base::FEATURE_DISABLED_BY_DEFAULT};
25#endif // defined(OS_POSIX)
26
Sean McAllister39b8d342020-08-25 09:08:3227#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS)
Gordon Guanf2f7a8402019-11-27 18:26:4428const base::Feature kDiscardableMemoryBackingTrial{
29 "DiscardableMemoryBackingTrial", base::FEATURE_DISABLED_BY_DEFAULT};
30
31// Association of trial group names to trial group enum. Array order must match
32// order of DiscardableMemoryTrialGroup enum.
33const base::FeatureParam<DiscardableMemoryTrialGroup>::Option
34 kDiscardableMemoryBackingParamOptions[] = {
35 {DiscardableMemoryTrialGroup::kEmulatedSharedMemory, "shmem"},
36 {DiscardableMemoryTrialGroup::kMadvFree, "madvfree"},
37 {DiscardableMemoryTrialGroup::kAshmem, "ashmem"}};
38
39const base::FeatureParam<DiscardableMemoryTrialGroup>
40 kDiscardableMemoryBackingParam{
41 &kDiscardableMemoryBackingTrial, "DiscardableMemoryBacking",
42 DiscardableMemoryTrialGroup::kEmulatedSharedMemory,
43 &kDiscardableMemoryBackingParamOptions};
44
Sean McAllister39b8d342020-08-25 09:08:3245#endif // defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS)
Gordon Guanf2f7a8402019-11-27 18:26:4446
47} // namespace features
48
49namespace {
50
Sean McAllister39b8d342020-08-25 09:08:3251#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS)
Gordon Guanf2f7a8402019-11-27 18:26:4452
53DiscardableMemoryBacking GetBackingForFieldTrial() {
54 DiscardableMemoryTrialGroup trial_group =
55 GetDiscardableMemoryBackingFieldTrialGroup();
56 switch (trial_group) {
57 case DiscardableMemoryTrialGroup::kEmulatedSharedMemory:
58 case DiscardableMemoryTrialGroup::kAshmem:
59 return DiscardableMemoryBacking::kSharedMemory;
60 case DiscardableMemoryTrialGroup::kMadvFree:
61 return DiscardableMemoryBacking::kMadvFree;
62 }
63 NOTREACHED();
64}
Sean McAllister39b8d342020-08-25 09:08:3265#endif // defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS)
Gordon Guanf2f7a8402019-11-27 18:26:4466
Gordon Guanf2f7a8402019-11-27 18:26:4467} // namespace
68
Sean McAllister39b8d342020-08-25 09:08:3269#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS)
Gordon Guanf2f7a8402019-11-27 18:26:4470
71// Probe capabilities of this device to determine whether we should participate
72// in the discardable memory backing trial.
73bool DiscardableMemoryBackingFieldTrialIsEnabled() {
74#if defined(OS_ANDROID)
75 if (!ashmem_device_is_supported())
76 return false;
77#endif // defined(OS_ANDROID)
78 if (base::GetMadvFreeSupport() != base::MadvFreeSupport::kSupported)
79 return false;
80
81 // IMPORTANT: Only query the feature after we determine the device has the
82 // capabilities required, which will have the side-effect of assigning a
83 // trial-group.
84 return base::FeatureList::IsEnabled(features::kDiscardableMemoryBackingTrial);
85}
86
87DiscardableMemoryTrialGroup GetDiscardableMemoryBackingFieldTrialGroup() {
88 DCHECK(DiscardableMemoryBackingFieldTrialIsEnabled());
89 return features::kDiscardableMemoryBackingParam.Get();
90}
Sean McAllister39b8d342020-08-25 09:08:3291#endif // defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS)
Gordon Guanf2f7a8402019-11-27 18:26:4492
Chris Watkinsbb7211c2017-11-29 07:16:3893DiscardableMemory::DiscardableMemory() = default;
revemane7b42332015-03-18 04:40:1994
Chris Watkinsbb7211c2017-11-29 07:16:3895DiscardableMemory::~DiscardableMemory() = default;
[email protected]ed1cca4f2014-01-08 12:27:3796
Gordon Guanf2f7a8402019-11-27 18:26:4497DiscardableMemoryBacking GetDiscardableMemoryBacking() {
Sean McAllister39b8d342020-08-25 09:08:3298#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS)
Gordon Guancd2dc2cf2019-12-02 16:21:4099 if (DiscardableMemoryBackingFieldTrialIsEnabled()) {
100 return GetBackingForFieldTrial();
101 }
Sean McAllister39b8d342020-08-25 09:08:32102#endif // defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS)
Gordon Guancd2dc2cf2019-12-02 16:21:40103
104#if defined(OS_ANDROID)
105 if (ashmem_device_is_supported())
106 return DiscardableMemoryBacking::kSharedMemory;
107#endif // defined(OS_ANDROID)
108
109#if defined(OS_POSIX)
110 if (base::FeatureList::IsEnabled(
111 base::features::kMadvFreeDiscardableMemory) &&
112 base::GetMadvFreeSupport() == base::MadvFreeSupport::kSupported) {
113 return DiscardableMemoryBacking::kMadvFree;
114 }
115#endif // defined(OS_POSIX)
116
117 return DiscardableMemoryBacking::kSharedMemory;
Gordon Guanf2f7a8402019-11-27 18:26:44118}
119
[email protected]ed1cca4f2014-01-08 12:27:37120} // namespace base