rss_limit_checker.h 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. //===-- common.h ------------------------------------------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #ifndef SCUDO_RSS_LIMIT_CHECKER_H_
  9. #define SCUDO_RSS_LIMIT_CHECKER_H_
  10. #include "atomic_helpers.h"
  11. #include "common.h"
  12. #include "internal_defs.h"
  13. namespace scudo {
  14. class RssLimitChecker {
  15. public:
  16. enum RssLimitExceeded {
  17. Neither,
  18. Soft,
  19. Hard,
  20. };
  21. void init(int SoftRssLimitMb, int HardRssLimitMb) {
  22. CHECK_GE(SoftRssLimitMb, 0);
  23. CHECK_GE(HardRssLimitMb, 0);
  24. this->SoftRssLimitMb = static_cast<uptr>(SoftRssLimitMb);
  25. this->HardRssLimitMb = static_cast<uptr>(HardRssLimitMb);
  26. }
  27. // Opportunistic RSS limit check. This will update the RSS limit status, if
  28. // it can, every 250ms, otherwise it will just return the current one.
  29. RssLimitExceeded getRssLimitExceeded() {
  30. if (!HardRssLimitMb && !SoftRssLimitMb)
  31. return RssLimitExceeded::Neither;
  32. u64 NextCheck = atomic_load_relaxed(&RssNextCheckAtNS);
  33. u64 Now = getMonotonicTime();
  34. if (UNLIKELY(Now >= NextCheck))
  35. check(NextCheck);
  36. return static_cast<RssLimitExceeded>(atomic_load_relaxed(&RssLimitStatus));
  37. }
  38. uptr getSoftRssLimit() const { return SoftRssLimitMb; }
  39. uptr getHardRssLimit() const { return HardRssLimitMb; }
  40. private:
  41. void check(u64 NextCheck);
  42. uptr SoftRssLimitMb = 0;
  43. uptr HardRssLimitMb = 0;
  44. atomic_u64 RssNextCheckAtNS = {};
  45. atomic_u8 RssLimitStatus = {};
  46. };
  47. } // namespace scudo
  48. #endif // SCUDO_RSS_LIMIT_CHECKER_H_