diff --git a/tcmalloc/huge_page_filler.h b/tcmalloc/huge_page_filler.h index 18576f258..1ff6812ef 100644 --- a/tcmalloc/huge_page_filler.h +++ b/tcmalloc/huge_page_filler.h @@ -887,7 +887,8 @@ class HugePageFiller { // Utility function to handle a non-hugepage backed `page_tracker` and // mark its unmapped pages appropriately. - Length HandleUnbackedHugePage(PageTracker* page_tracker, PageBitmap unbacked) + Length HandleUnbackedHugePage(PageTracker* page_tracker, + const PageBitmap& unbacked) ABSL_EXCLUSIVE_LOCKS_REQUIRED(pageheap_lock); private: @@ -1935,7 +1936,7 @@ inline void HugePageFiller::OnCollapseSuccess(TrackerType* pt) { template inline Length HugePageFiller::HandleUnbackedHugePage( - PageTracker* tracker, PageBitmap unbacked) { + PageTracker* tracker, const PageBitmap& unbacked) { RemoveFromFillerList(tracker); Length unmapped_length = tracker->MarkSubreleased(unbacked); subrelease_stats_.total_pages_subreleased += unmapped_length; diff --git a/tcmalloc/huge_page_filler_fuzz.cc b/tcmalloc/huge_page_filler_fuzz.cc index df25e8e0a..e6f46102b 100644 --- a/tcmalloc/huge_page_filler_fuzz.cc +++ b/tcmalloc/huge_page_filler_fuzz.cc @@ -746,7 +746,7 @@ void TreatTrackers::Perform(State& state) const { } for (PageTracker* pt : state.trackers) { HugePage hp = pt->location(); - PageBitmap rel = pt->released_by_page(); + const PageBitmap& rel = pt->released_by_page(); for (size_t i = 0; i < kPagesPerHugePage.raw_num(); ++i) { PageId p = hp.first_page() + Length(i); if (rel.GetBit(i)) { diff --git a/tcmalloc/huge_page_tracker.h b/tcmalloc/huge_page_tracker.h index 85370c12f..f432bc218 100644 --- a/tcmalloc/huge_page_tracker.h +++ b/tcmalloc/huge_page_tracker.h @@ -209,14 +209,16 @@ class PageTracker : public TList::Elem { Length ReleaseFree(MemoryModifyFunction& unback) ABSL_EXCLUSIVE_LOCKS_REQUIRED(pageheap_lock); - Length MarkSubreleased(PageBitmap unbacked) + Length MarkSubreleased(const PageBitmap& unbacked) ABSL_EXCLUSIVE_LOCKS_REQUIRED(pageheap_lock); - [[nodiscard]] PageBitmap released_by_page() const { + [[nodiscard]] const PageBitmap& released_by_page() const + ABSL_EXCLUSIVE_LOCKS_REQUIRED(pageheap_lock) { return released_by_page_; } - [[nodiscard]] PageBitmap allocated_pages_bitmap() const { + [[nodiscard]] const PageBitmap& allocated_pages_bitmap() const + ABSL_EXCLUSIVE_LOCKS_REQUIRED(pageheap_lock) { return free_.bits(); } @@ -326,9 +328,9 @@ class PageTracker : public TList::Elem { size_t n_used_stale; }; - HardwarePageResidencyInfo CountInfoInHugePage(PageBitmap unbacked, - PageBitmap swapped, - PageBitmap stale) const; + HardwarePageResidencyInfo CountInfoInHugePage(const PageBitmap& unbacked, + const PageBitmap& swapped, + const PageBitmap& stale) const; private: HugePage location_; @@ -427,7 +429,8 @@ inline void PageTracker::SetAnonVmaName(MemoryTagFunction& set_anon_vma_name, } inline PageTracker::HardwarePageResidencyInfo PageTracker::CountInfoInHugePage( - PageBitmap unbacked, PageBitmap swapped, PageBitmap stale) const { + const PageBitmap& unbacked, const PageBitmap& swapped, + const PageBitmap& stale) const { // TODO(b/424551232): Add support for the scenario when native page size is // larger than TCMalloc page size. const size_t kHardwarePagesInHugePage = kHugePageSize / GetPageSize(); @@ -436,7 +439,7 @@ inline PageTracker::HardwarePageResidencyInfo PageTracker::CountInfoInHugePage( } TC_ASSERT_LE(kHardwarePagesInHugePage, kMaxResidencyBits); - const PageBitmap free = free_.bits(); + const PageBitmap& free = free_.bits(); TC_ASSERT_EQ(kHardwarePagesInHugePage % kPagesPerHugePage.raw_num(), 0); const int shift = kHardwarePagesInHugePage / kPagesPerHugePage.raw_num(); @@ -521,8 +524,8 @@ inline Length PageTracker::ReleaseFree(MemoryModifyFunction& unback) { return Length(count); } -inline Length PageTracker::MarkSubreleased(PageBitmap unbacked) { - PageBitmap free = free_.bits(); +inline Length PageTracker::MarkSubreleased(const PageBitmap& unbacked) { + const PageBitmap& free = free_.bits(); // TODO(b/525422238): The residency bitmap was captured outside of the // lock. So, in a rare case, it's possible that the page was allocated, diff --git a/tcmalloc/internal/range_tracker.h b/tcmalloc/internal/range_tracker.h index 9144e5384..c7f4be154 100644 --- a/tcmalloc/internal/range_tracker.h +++ b/tcmalloc/internal/range_tracker.h @@ -169,7 +169,7 @@ class RangeTracker { void Clear(); - Bitmap bits() const; + const Bitmap& bits() const; private: Bitmap bits_; @@ -319,7 +319,7 @@ inline void RangeTracker::Unmark(size_t index, size_t n) { } template -inline Bitmap RangeTracker::bits() const { +inline const Bitmap& RangeTracker::bits() const { return bits_; }