| Index: base/sys_info_linux.cc
 | 
| diff --git a/base/sys_info_linux.cc b/base/sys_info_linux.cc
 | 
| index 298d245ecf580da4d8790f5dc47f851c0208ab5d..0cd05b363a23e34ae270ececb8c995305cd3eded 100644
 | 
| --- a/base/sys_info_linux.cc
 | 
| +++ b/base/sys_info_linux.cc
 | 
| @@ -13,6 +13,7 @@
 | 
|  #include "base/lazy_instance.h"
 | 
|  #include "base/logging.h"
 | 
|  #include "base/numerics/safe_conversions.h"
 | 
| +#include "base/process/process_metrics.h"
 | 
|  #include "base/strings/string_number_conversions.h"
 | 
|  #include "base/sys_info_internal.h"
 | 
|  #include "build/build_config.h"
 | 
| @@ -42,13 +43,29 @@ base::LazyInstance<
 | 
|  namespace base {
 | 
|  
 | 
|  // static
 | 
| +int64_t SysInfo::AmountOfPhysicalMemory() {
 | 
| +  return g_lazy_physical_memory.Get().value();
 | 
| +}
 | 
| +
 | 
| +// static
 | 
|  int64_t SysInfo::AmountOfAvailablePhysicalMemory() {
 | 
| -  return AmountOfMemory(_SC_AVPHYS_PAGES);
 | 
| +  SystemMemoryInfoKB info;
 | 
| +  if (!GetSystemMemoryInfo(&info))
 | 
| +    return 0;
 | 
| +  return AmountOfAvailablePhysicalMemory(info);
 | 
|  }
 | 
|  
 | 
|  // static
 | 
| -int64_t SysInfo::AmountOfPhysicalMemory() {
 | 
| -  return g_lazy_physical_memory.Get().value();
 | 
| +int64_t SysInfo::AmountOfAvailablePhysicalMemory(
 | 
| +    const SystemMemoryInfoKB& info) {
 | 
| +  // See details here:
 | 
| +  // https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773
 | 
| +  // The fallback logic (when there is no MemAvailable) would be more precise
 | 
| +  // if we had info about zones watermarks (/proc/zoneinfo).
 | 
| +  int64_t res_kb = info.available != 0
 | 
| +                       ? info.available - info.active_file
 | 
| +                       : info.free + info.reclaimable + info.inactive_file;
 | 
| +  return res_kb * 1024;
 | 
|  }
 | 
|  
 | 
|  // static
 | 
| 
 |