util/os_misc: os_get_available_system_memory() for OpenBSD
authorJonathan Gray <jsg@jsg.id.au>
Thu, 5 Dec 2019 14:21:07 +0000 (01:21 +1100)
committerJonathan Gray <jsg@jsg.id.au>
Wed, 2 Sep 2020 02:15:07 +0000 (12:15 +1000)
Return the smallest value of available non-kernel physical memory and
the static per process data size limit as the amount of available
system memory on OpenBSD.

Fixes: b80930a6fea ("anv: add support for VK_EXT_memory_budget")
Signed-off-by: Jonathan Gray <jsg@jsg.id.au>
Acked-by: Jason Ekstrand <jason@jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6517>

src/util/os_misc.c

index 954900e3c5d7dd4ceaf5497c2d7e9eb5c15db755..e184edc893da432bb187189ec903a6c7185ae512 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "os_misc.h"
 #include "os_file.h"
 
 #include "os_misc.h"
 #include "os_file.h"
+#include "macros.h"
 
 #include <stdarg.h>
 
 
 #include <stdarg.h>
 
@@ -57,6 +58,9 @@
 #  include <log/log.h>
 #elif DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS || DETECT_OS_HURD
 #  include <unistd.h>
 #  include <log/log.h>
 #elif DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS || DETECT_OS_HURD
 #  include <unistd.h>
+#elif DETECT_OS_OPENBSD
+#  include <sys/resource.h>
+#  include <sys/sysctl.h>
 #elif DETECT_OS_APPLE || DETECT_OS_BSD
 #  include <sys/sysctl.h>
 #elif DETECT_OS_HAIKU
 #elif DETECT_OS_APPLE || DETECT_OS_BSD
 #  include <sys/sysctl.h>
 #elif DETECT_OS_HAIKU
@@ -209,6 +213,22 @@ os_get_available_system_memory(uint64_t *size)
 
    free(meminfo);
    return false;
 
    free(meminfo);
    return false;
+#elif DETECT_OS_OPENBSD
+   struct rlimit rl;
+   int mib[] = { CTL_HW, HW_USERMEM64 };
+   int64_t mem_available;
+   size_t len = sizeof(mem_available);
+
+   /* physmem - wired */
+   if (sysctl(mib, 2, &mem_available, &len, NULL, 0) == -1)
+      return false;
+
+   /* static login.conf limit */
+   if (getrlimit(RLIMIT_DATA, &rl) == -1)
+      return false;
+
+   *size = MIN2(mem_available, rl.rlim_cur);
+   return true;
 #else
    return false;
 #endif
 #else
    return false;
 #endif