rss_limit_checker.h revision 1.1.1.1
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 16namespace scudo { 17 18class RssLimitChecker { 19public: 20 enum RssLimitExceeded { 21 Neither, 22 Soft, 23 Hard, 24 }; 25 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. 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 48 uptr getSoftRssLimit() const { return SoftRssLimitMb; } 49 uptr getHardRssLimit() const { return HardRssLimitMb; } 50 51private: 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