discardable_memory.cc 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. // 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. #include "base/memory/discardable_memory.h"
  5. #include "base/feature_list.h"
  6. #include "base/memory/discardable_memory_internal.h"
  7. #include "base/memory/madv_free_discardable_memory_posix.h"
  8. #include "base/metrics/field_trial_params.h"
  9. #include "base/notreached.h"
  10. #include "build/build_config.h"
  11. #if BUILDFLAG(IS_ANDROID)
  12. #include "third_party/ashmem/ashmem.h"
  13. #endif // BUILDFLAG(IS_ANDROID)
  14. namespace base {
  15. namespace features {
  16. #if BUILDFLAG(IS_POSIX)
  17. // Feature flag allowing the use of MADV_FREE discardable memory when there are
  18. // multiple supported discardable memory backings.
  19. const base::Feature kMadvFreeDiscardableMemory{
  20. "MadvFreeDiscardableMemory", base::FEATURE_DISABLED_BY_DEFAULT};
  21. #endif // BUILDFLAG(IS_POSIX)
  22. #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
  23. const base::Feature kDiscardableMemoryBackingTrial{
  24. "DiscardableMemoryBackingTrial", base::FEATURE_DISABLED_BY_DEFAULT};
  25. // Association of trial group names to trial group enum. Array order must match
  26. // order of DiscardableMemoryTrialGroup enum.
  27. const base::FeatureParam<DiscardableMemoryTrialGroup>::Option
  28. kDiscardableMemoryBackingParamOptions[] = {
  29. {DiscardableMemoryTrialGroup::kEmulatedSharedMemory, "shmem"},
  30. {DiscardableMemoryTrialGroup::kMadvFree, "madvfree"},
  31. {DiscardableMemoryTrialGroup::kAshmem, "ashmem"}};
  32. const base::FeatureParam<DiscardableMemoryTrialGroup>
  33. kDiscardableMemoryBackingParam{
  34. &kDiscardableMemoryBackingTrial, "DiscardableMemoryBacking",
  35. DiscardableMemoryTrialGroup::kEmulatedSharedMemory,
  36. &kDiscardableMemoryBackingParamOptions};
  37. #endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) ||
  38. // BUILDFLAG(IS_CHROMEOS)
  39. } // namespace features
  40. namespace {
  41. #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
  42. DiscardableMemoryBacking GetBackingForFieldTrial() {
  43. DiscardableMemoryTrialGroup trial_group =
  44. GetDiscardableMemoryBackingFieldTrialGroup();
  45. switch (trial_group) {
  46. case DiscardableMemoryTrialGroup::kEmulatedSharedMemory:
  47. case DiscardableMemoryTrialGroup::kAshmem:
  48. return DiscardableMemoryBacking::kSharedMemory;
  49. case DiscardableMemoryTrialGroup::kMadvFree:
  50. return DiscardableMemoryBacking::kMadvFree;
  51. }
  52. NOTREACHED();
  53. }
  54. #endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) ||
  55. // BUILDFLAG(IS_CHROMEOS)
  56. } // namespace
  57. #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
  58. // Probe capabilities of this device to determine whether we should participate
  59. // in the discardable memory backing trial.
  60. bool DiscardableMemoryBackingFieldTrialIsEnabled() {
  61. #if BUILDFLAG(IS_ANDROID)
  62. if (!ashmem_device_is_supported())
  63. return false;
  64. #endif // BUILDFLAG(IS_ANDROID)
  65. if (base::GetMadvFreeSupport() != base::MadvFreeSupport::kSupported)
  66. return false;
  67. // IMPORTANT: Only query the feature after we determine the device has the
  68. // capabilities required, which will have the side-effect of assigning a
  69. // trial-group.
  70. return base::FeatureList::IsEnabled(features::kDiscardableMemoryBackingTrial);
  71. }
  72. DiscardableMemoryTrialGroup GetDiscardableMemoryBackingFieldTrialGroup() {
  73. DCHECK(DiscardableMemoryBackingFieldTrialIsEnabled());
  74. return features::kDiscardableMemoryBackingParam.Get();
  75. }
  76. #endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) ||
  77. // BUILDFLAG(IS_CHROMEOS)
  78. DiscardableMemory::DiscardableMemory() = default;
  79. DiscardableMemory::~DiscardableMemory() = default;
  80. DiscardableMemoryBacking GetDiscardableMemoryBacking() {
  81. #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
  82. if (DiscardableMemoryBackingFieldTrialIsEnabled()) {
  83. return GetBackingForFieldTrial();
  84. }
  85. #endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) ||
  86. // BUILDFLAG(IS_CHROMEOS)
  87. #if BUILDFLAG(IS_ANDROID)
  88. if (ashmem_device_is_supported())
  89. return DiscardableMemoryBacking::kSharedMemory;
  90. #endif // BUILDFLAG(IS_ANDROID)
  91. #if BUILDFLAG(IS_POSIX)
  92. if (base::FeatureList::IsEnabled(
  93. base::features::kMadvFreeDiscardableMemory) &&
  94. base::GetMadvFreeSupport() == base::MadvFreeSupport::kSupported) {
  95. return DiscardableMemoryBacking::kMadvFree;
  96. }
  97. #endif // BUILDFLAG(IS_POSIX)
  98. return DiscardableMemoryBacking::kSharedMemory;
  99. }
  100. } // namespace base