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 9 #ifndef SCUDO_RSS_LIMIT_CHECKER_H_ 10 #define SCUDO_RSS_LIMIT_CHECKER_H_ 11 12 #include "atomic_helpers.h" 13 #include "common.h" 14 #include "internal_defs.h" 15 16 namespace scudo { 17 18 class RssLimitChecker { 19 public: 20 enum RssLimitExceeded { 21 Neither, 22 Soft, 23 Hard, 24 }; 25 init(int SoftRssLimitMb,int HardRssLimitMb)26 void init(int SoftRssLimitMb, int HardRssLimitMb) { 27 CHECK_GE(SoftRssLimitMb, 0); 28 CHECK_GE(HardRssLimitMb, 0); 29 this->SoftRssLimitMb = static_cast<uptr>(SoftRssLimitMb); 30 this->HardRssLimitMb = static_cast<uptr>(HardRssLimitMb); 31 } 32 33 // Opportunistic RSS limit check. This will update the RSS limit status, if 34 // it can, every 250ms, otherwise it will just return the current one. getRssLimitExceeded()35 RssLimitExceeded getRssLimitExceeded() { 36 if (!HardRssLimitMb && !SoftRssLimitMb) 37 return RssLimitExceeded::Neither; 38 39 u64 NextCheck = atomic_load_relaxed(&RssNextCheckAtNS); 40 u64 Now = getMonotonicTime(); 41 42 if (UNLIKELY(Now >= NextCheck)) 43 check(NextCheck); 44 45 return static_cast<RssLimitExceeded>(atomic_load_relaxed(&RssLimitStatus)); 46 } 47 getSoftRssLimit()48 uptr getSoftRssLimit() const { return SoftRssLimitMb; } getHardRssLimit()49 uptr getHardRssLimit() const { return HardRssLimitMb; } 50 51 private: 52 void check(u64 NextCheck); 53 54 uptr SoftRssLimitMb = 0; 55 uptr HardRssLimitMb = 0; 56 57 atomic_u64 RssNextCheckAtNS = {}; 58 atomic_u8 RssLimitStatus = {}; 59 }; 60 61 } // namespace scudo 62 63 #endif // SCUDO_RSS_LIMIT_CHECKER_H_ 64