https://github.com/da-viper updated 
https://github.com/llvm/llvm-project/pull/182011

>From cbf20d3fa92d7c0cc239f885fa8914fc2fea8f2a Mon Sep 17 00:00:00 2001
From: Ebuka Ezike <[email protected]>
Date: Wed, 18 Feb 2026 11:25:35 +0000
Subject: [PATCH 1/2] [lldb] Fix Linux memory monitor.

Only call the callback when we are actually low on memory.
Increase the threshold to 200ms in a 2 second interval to match
systemd's default see
[DefaultMemoryPressureWatch](https://www.freedesktop.org/software/systemd/man/latest/systemd-system.conf.html#DefaultMemoryPressureWatch=).
---
 lldb/source/Host/common/MemoryMonitor.cpp | 48 ++++++++++++++++++++---
 1 file changed, 43 insertions(+), 5 deletions(-)

diff --git a/lldb/source/Host/common/MemoryMonitor.cpp 
b/lldb/source/Host/common/MemoryMonitor.cpp
index 7734be8688675..82b5356c9983b 100644
--- a/lldb/source/Host/common/MemoryMonitor.cpp
+++ b/lldb/source/Host/common/MemoryMonitor.cpp
@@ -18,6 +18,8 @@
 #include <cstring>
 
 #if defined(__linux__)
+#include "lldb/Host/posix/Support.h"
+#include "llvm/Support/LineIterator.h"
 #include <fcntl.h>
 #include <poll.h>
 #include <sys/eventfd.h>
@@ -44,7 +46,7 @@ class MemoryMonitorLinux : public MemoryMonitor {
   ~MemoryMonitorLinux() {
     if (m_memory_monitor_thread.IsJoinable())
       m_memory_monitor_thread.Join(nullptr);
-    if (m_stop_fd != 1)
+    if (m_stop_fd != -1)
       ::close(m_stop_fd);
   }
 
@@ -96,8 +98,8 @@ class MemoryMonitorLinux : public MemoryMonitor {
 
     llvm::scope_exit cleanup([&]() { ::close(pfds[pressure_idx].fd); });
 
-    // Detect a 50ms stall in a 2 second time window.
-    constexpr llvm::StringRef trigger = "some 50000 2000000";
+    // Detect a 200ms stall in a 2 second time window.
+    constexpr llvm::StringRef trigger = "some 200000 2000000";
     if (::write(pfds[pressure_idx].fd, trigger.data(), trigger.size() + 1) < 0)
       return {};
 
@@ -109,14 +111,50 @@ class MemoryMonitorLinux : public MemoryMonitor {
         if (pfds[stop_idx].revents & (POLLIN | POLLERR))
           return {};
 
-        if (pfds[pressure_idx].revents & POLLERR)
+        const short pressure_revents = pfds[stop_idx].revents;
+        if (pressure_revents & POLLERR)
           return {};
-        if (pfds[pressure_idx].revents & POLLPRI)
+        if ((pressure_revents & POLLPRI) && isLowMemory())
           m_callback();
       }
     }
     return {};
   }
+
+  static bool isLowMemory() {
+    llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> bufferOrErr =
+        getProcFile("meminfo");
+
+    if (!bufferOrErr)
+      return false;
+
+    uint64_t mem_total = 0;
+    uint64_t mem_available = 0;
+    const int radix = 10;
+
+    for (llvm::line_iterator iter(**bufferOrErr, true); !iter.is_at_end();
+         ++iter) {
+      llvm::StringRef line = *iter;
+      if (line.consume_front("MemTotal:")) {
+        line.ltrim().consumeInteger(radix, mem_total);
+        continue;
+      }
+
+      if (line.consume_front("MemAvailable:")) {
+        line.ltrim().consumeInteger(radix, mem_available);
+        // MemAvailable comes after MemTotal.
+        break;
+      }
+    }
+
+    if (mem_total == 0 || mem_available == 0)
+      return false;
+
+    const uint64_t approx_memory_percent = (mem_available * 100) / mem_total;
+    const uint64_t low_memory_percent = 20;
+    return approx_memory_percent < low_memory_percent;
+  }
+
   int m_stop_fd = -1;
   HostThread m_memory_monitor_thread;
 };

>From 942526aa6939f3001dab56f63a934ef8181ea5ca Mon Sep 17 00:00:00 2001
From: Ebuka Ezike <[email protected]>
Date: Wed, 18 Feb 2026 15:24:59 +0000
Subject: [PATCH 2/2] add review changes

---
 lldb/source/Host/common/MemoryMonitor.cpp | 27 ++++++++++++-----------
 1 file changed, 14 insertions(+), 13 deletions(-)

diff --git a/lldb/source/Host/common/MemoryMonitor.cpp 
b/lldb/source/Host/common/MemoryMonitor.cpp
index 82b5356c9983b..49e568aa26590 100644
--- a/lldb/source/Host/common/MemoryMonitor.cpp
+++ b/lldb/source/Host/common/MemoryMonitor.cpp
@@ -114,41 +114,42 @@ class MemoryMonitorLinux : public MemoryMonitor {
         const short pressure_revents = pfds[stop_idx].revents;
         if (pressure_revents & POLLERR)
           return {};
-        if ((pressure_revents & POLLPRI) && isLowMemory())
-          m_callback();
+        if (pressure_revents & POLLPRI) {
+          if (const std::optional<bool> is_low_opt = IsLowMemory();
+              is_low_opt && *is_low_opt)
+            m_callback();
+        }
       }
     }
     return {};
   }
 
-  static bool isLowMemory() {
-    llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> bufferOrErr =
+  static std::optional<bool> IsLowMemory() {
+    llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> buffer_or_err =
         getProcFile("meminfo");
 
-    if (!bufferOrErr)
-      return false;
+    if (!buffer_or_err)
+      return std::nullopt;
 
     uint64_t mem_total = 0;
     uint64_t mem_available = 0;
     const int radix = 10;
 
-    for (llvm::line_iterator iter(**bufferOrErr, true); !iter.is_at_end();
+    for (llvm::line_iterator iter(**buffer_or_err, true); !iter.is_at_end();
          ++iter) {
       llvm::StringRef line = *iter;
       if (line.consume_front("MemTotal:")) {
         line.ltrim().consumeInteger(radix, mem_total);
-        continue;
+      } else if (line.consume_front("MemAvailable:")) {
+        line.ltrim().consumeInteger(radix, mem_available);
       }
 
-      if (line.consume_front("MemAvailable:")) {
-        line.ltrim().consumeInteger(radix, mem_available);
-        // MemAvailable comes after MemTotal.
+      if (mem_total && mem_available)
         break;
-      }
     }
 
     if (mem_total == 0 || mem_available == 0)
-      return false;
+      return std::nullopt;
 
     const uint64_t approx_memory_percent = (mem_available * 100) / mem_total;
     const uint64_t low_memory_percent = 20;

_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to