[compiler-rt] r335054 - [scudo] Move noinline functions definitions out of line

Filipe Cabecinhas via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 19 11:41:35 PDT 2018


Thanks!

 Filipe

On Tue, 19 Jun 2018 at 16:40, Kostya Kortchinsky via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: cryptoad
> Date: Tue Jun 19 08:36:30 2018
> New Revision: 335054
>
> URL: http://llvm.org/viewvc/llvm-project?rev=335054&view=rev
> Log:
> [scudo] Move noinline functions definitions out of line
>
> Summary:
> Mark `isRssLimitExceeded` as `NOINLINE`, and move it's definition as well
> as
> the one of `performSanityChecks` out of the class definition, as requested.
>
> Reviewers: filcab, alekseyshl
>
> Reviewed By: alekseyshl
>
> Subscribers: delcypher, #sanitizers, llvm-commits
>
> Differential Revision: https://reviews.llvm.org/D48228
>
> Modified:
>     compiler-rt/trunk/lib/scudo/scudo_allocator.cpp
>
> Modified: compiler-rt/trunk/lib/scudo/scudo_allocator.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/scudo/scudo_allocator.cpp?rev=335054&r1=335053&r2=335054&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/scudo/scudo_allocator.cpp (original)
> +++ compiler-rt/trunk/lib/scudo/scudo_allocator.cpp Tue Jun 19 08:36:30
> 2018
> @@ -243,38 +243,7 @@ struct ScudoAllocator {
>    explicit ScudoAllocator(LinkerInitialized)
>      : AllocatorQuarantine(LINKER_INITIALIZED) {}
>
> -  NOINLINE void performSanityChecks() {
> -    // Verify that the header offset field can hold the maximum offset.
> In the
> -    // case of the Secondary allocator, it takes care of alignment and the
> -    // offset will always be 0. In the case of the Primary, the worst case
> -    // scenario happens in the last size class, when the backend
> allocation
> -    // would already be aligned on the requested alignment, which would
> happen
> -    // to be the maximum alignment that would fit in that size class. As a
> -    // result, the maximum offset will be at most the maximum alignment
> for the
> -    // last size class minus the header size, in multiples of
> MinAlignment.
> -    UnpackedHeader Header = {};
> -    const uptr MaxPrimaryAlignment =
> -        1 << MostSignificantSetBitIndex(SizeClassMap::kMaxSize -
> MinAlignment);
> -    const uptr MaxOffset =
> -        (MaxPrimaryAlignment - Chunk::getHeaderSize()) >> MinAlignmentLog;
> -    Header.Offset = MaxOffset;
> -    if (Header.Offset != MaxOffset)
> -      dieWithMessage("maximum possible offset doesn't fit in header\n");
> -    // Verify that we can fit the maximum size or amount of unused bytes
> in the
> -    // header. Given that the Secondary fits the allocation to a page,
> the worst
> -    // case scenario happens in the Primary. It will depend on the second
> to
> -    // last and last class sizes, as well as the dynamic base for the
> Primary.
> -    // The following is an over-approximation that works for our needs.
> -    const uptr MaxSizeOrUnusedBytes = SizeClassMap::kMaxSize - 1;
> -    Header.SizeOrUnusedBytes = MaxSizeOrUnusedBytes;
> -    if (Header.SizeOrUnusedBytes != MaxSizeOrUnusedBytes)
> -      dieWithMessage("maximum possible unused bytes doesn't fit in
> header\n");
> -
> -    const uptr LargestClassId = SizeClassMap::kLargestClassID;
> -    Header.ClassId = LargestClassId;
> -    if (Header.ClassId != LargestClassId)
> -      dieWithMessage("largest class ID doesn't fit in header\n");
> -  }
> +  NOINLINE void performSanityChecks();
>
>    void init() {
>      SanitizerToolName = "Scudo";
> @@ -323,37 +292,7 @@ struct ScudoAllocator {
>      return Chunk::isValid(Ptr);
>    }
>
> -  // Opportunistic RSS limit check. This will update the RSS limit
> status, if
> -  // it can, every 100ms, otherwise it will just return the current one.
> -  bool isRssLimitExceeded() {
> -    u64 LastCheck = atomic_load_relaxed(&RssLastCheckedAtNS);
> -    const u64 CurrentCheck = MonotonicNanoTime();
> -    if (LIKELY(CurrentCheck < LastCheck + (100ULL * 1000000ULL)))
> -      return atomic_load_relaxed(&RssLimitExceeded);
> -    if (!atomic_compare_exchange_weak(&RssLastCheckedAtNS, &LastCheck,
> -                                      CurrentCheck, memory_order_relaxed))
> -      return atomic_load_relaxed(&RssLimitExceeded);
> -    // TODO(kostyak): We currently use sanitizer_common's GetRSS which
> reads the
> -    //                RSS from /proc/self/statm by default. We might want
> to
> -    //                call getrusage directly, even if it's less accurate.
> -    const uptr CurrentRssMb = GetRSS() >> 20;
> -    if (HardRssLimitMb && UNLIKELY(HardRssLimitMb < CurrentRssMb))
> -      dieWithMessage("hard RSS limit exhausted (%zdMb vs %zdMb)\n",
> -                     HardRssLimitMb, CurrentRssMb);
> -    if (SoftRssLimitMb) {
> -      if (atomic_load_relaxed(&RssLimitExceeded)) {
> -        if (CurrentRssMb <= SoftRssLimitMb)
> -          atomic_store_relaxed(&RssLimitExceeded, false);
> -      } else {
> -        if (CurrentRssMb > SoftRssLimitMb) {
> -          atomic_store_relaxed(&RssLimitExceeded, true);
> -          Printf("Scudo INFO: soft RSS limit exhausted (%zdMb vs
> %zdMb)\n",
> -                 SoftRssLimitMb, CurrentRssMb);
> -        }
> -      }
> -    }
> -    return atomic_load_relaxed(&RssLimitExceeded);
> -  }
> +  NOINLINE bool isRssLimitExceeded();
>
>    // Allocates a chunk.
>    void *allocate(uptr Size, uptr Alignment, AllocType Type,
> @@ -622,6 +561,71 @@ struct ScudoAllocator {
>    }
>  };
>
> +NOINLINE void ScudoAllocator::performSanityChecks() {
> +  // Verify that the header offset field can hold the maximum offset. In
> the
> +  // case of the Secondary allocator, it takes care of alignment and the
> +  // offset will always be 0. In the case of the Primary, the worst case
> +  // scenario happens in the last size class, when the backend allocation
> +  // would already be aligned on the requested alignment, which would
> happen
> +  // to be the maximum alignment that would fit in that size class. As a
> +  // result, the maximum offset will be at most the maximum alignment for
> the
> +  // last size class minus the header size, in multiples of MinAlignment.
> +  UnpackedHeader Header = {};
> +  const uptr MaxPrimaryAlignment =
> +      1 << MostSignificantSetBitIndex(SizeClassMap::kMaxSize -
> MinAlignment);
> +  const uptr MaxOffset =
> +      (MaxPrimaryAlignment - Chunk::getHeaderSize()) >> MinAlignmentLog;
> +  Header.Offset = MaxOffset;
> +  if (Header.Offset != MaxOffset)
> +    dieWithMessage("maximum possible offset doesn't fit in header\n");
> +  // Verify that we can fit the maximum size or amount of unused bytes in
> the
> +  // header. Given that the Secondary fits the allocation to a page, the
> worst
> +  // case scenario happens in the Primary. It will depend on the second to
> +  // last and last class sizes, as well as the dynamic base for the
> Primary.
> +  // The following is an over-approximation that works for our needs.
> +  const uptr MaxSizeOrUnusedBytes = SizeClassMap::kMaxSize - 1;
> +  Header.SizeOrUnusedBytes = MaxSizeOrUnusedBytes;
> +  if (Header.SizeOrUnusedBytes != MaxSizeOrUnusedBytes)
> +    dieWithMessage("maximum possible unused bytes doesn't fit in
> header\n");
> +
> +  const uptr LargestClassId = SizeClassMap::kLargestClassID;
> +  Header.ClassId = LargestClassId;
> +  if (Header.ClassId != LargestClassId)
> +    dieWithMessage("largest class ID doesn't fit in header\n");
> +}
> +
> +// Opportunistic RSS limit check. This will update the RSS limit status,
> if
> +// it can, every 100ms, otherwise it will just return the current one.
> +NOINLINE bool ScudoAllocator::isRssLimitExceeded() {
> +  u64 LastCheck = atomic_load_relaxed(&RssLastCheckedAtNS);
> +  const u64 CurrentCheck = MonotonicNanoTime();
> +  if (LIKELY(CurrentCheck < LastCheck + (100ULL * 1000000ULL)))
> +    return atomic_load_relaxed(&RssLimitExceeded);
> +  if (!atomic_compare_exchange_weak(&RssLastCheckedAtNS, &LastCheck,
> +                                    CurrentCheck, memory_order_relaxed))
> +    return atomic_load_relaxed(&RssLimitExceeded);
> +  // TODO(kostyak): We currently use sanitizer_common's GetRSS which
> reads the
> +  //                RSS from /proc/self/statm by default. We might want to
> +  //                call getrusage directly, even if it's less accurate.
> +  const uptr CurrentRssMb = GetRSS() >> 20;
> +  if (HardRssLimitMb && UNLIKELY(HardRssLimitMb < CurrentRssMb))
> +    dieWithMessage("hard RSS limit exhausted (%zdMb vs %zdMb)\n",
> +                   HardRssLimitMb, CurrentRssMb);
> +  if (SoftRssLimitMb) {
> +    if (atomic_load_relaxed(&RssLimitExceeded)) {
> +      if (CurrentRssMb <= SoftRssLimitMb)
> +        atomic_store_relaxed(&RssLimitExceeded, false);
> +    } else {
> +      if (CurrentRssMb > SoftRssLimitMb) {
> +        atomic_store_relaxed(&RssLimitExceeded, true);
> +        Printf("Scudo INFO: soft RSS limit exhausted (%zdMb vs %zdMb)\n",
> +               SoftRssLimitMb, CurrentRssMb);
> +      }
> +    }
> +  }
> +  return atomic_load_relaxed(&RssLimitExceeded);
> +}
> +
>  static ScudoAllocator Instance(LINKER_INITIALIZED);
>
>  static ScudoBackendAllocator &getBackendAllocator() {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-- 
  Filipe
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180619/d26e74aa/attachment.html>


More information about the llvm-commits mailing list