From 50d02d61943fce1de8eef915524f56864d813654 Mon Sep 17 00:00:00 2001
From: Sean Bright <sean.bright@gmail.com>
Date: Thu, 16 Jan 2020 08:32:34 -0500
Subject: [PATCH] pbx.c: Include filesystem cache in free memory calculation

ASTERISK-28695 #close
Reported by: Kevin Flyn

Change-Id: Ief098bb6eb77378daeace8f97ba30701c8de55b8
---
 doc/CHANGES-staging/minmemfree.txt |  5 +++++
 main/pbx.c                         | 12 +++++++-----
 2 files changed, 12 insertions(+), 5 deletions(-)
 create mode 100644 doc/CHANGES-staging/minmemfree.txt

diff --git a/doc/CHANGES-staging/minmemfree.txt b/doc/CHANGES-staging/minmemfree.txt
new file mode 100644
index 0000000000..5762c15d16
--- /dev/null
+++ b/doc/CHANGES-staging/minmemfree.txt
@@ -0,0 +1,5 @@
+Subject: minmemfree
+
+The 'minmemfree' configuration option now counts memory allocated to
+the filesystem cache as "free" because it is memory that is available
+to the process.
diff --git a/main/pbx.c b/main/pbx.c
index 872d67413d..f7b813b66a 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -4614,7 +4614,6 @@ static int increase_call_count(const struct ast_channel *c)
 	int failed = 0;
 	double curloadavg;
 #if defined(HAVE_SYSINFO)
-	long curfreemem;
 	struct sysinfo sys_info;
 #endif
 
@@ -4634,13 +4633,16 @@ static int increase_call_count(const struct ast_channel *c)
 	}
 #if defined(HAVE_SYSINFO)
 	if (option_minmemfree) {
+		/* Make sure that the free system memory is above the configured low watermark */
 		if (!sysinfo(&sys_info)) {
-			/* make sure that the free system memory is above the configured low watermark
-			 * convert the amount of freeram from mem_units to MB */
-			curfreemem = sys_info.freeram * sys_info.mem_unit;
+			/* Convert the amount of available RAM from mem_units to MB. The calculation
+			 * was done this way to avoid overflow problems */
+			uint64_t curfreemem = sys_info.freeram + sys_info.bufferram;
+			curfreemem *= sys_info.mem_unit;
 			curfreemem /= 1024 * 1024;
 			if (curfreemem < option_minmemfree) {
-				ast_log(LOG_WARNING, "Available system memory (~%ldMB) is below the configured low watermark (%ldMB)\n", curfreemem, option_minmemfree);
+				ast_log(LOG_WARNING, "Available system memory (~%" PRIu64 "MB) is below the configured low watermark (%ldMB)\n",
+					curfreemem, option_minmemfree);
 				failed = -1;
 			}
 		}
-- 
GitLab