[Mesa-dev] [PATCH v2 4/5] util: add phys_memory.h for all memory measurements
Greg V
greg at unrelenting.technology
Thu Jan 18 22:54:45 UTC 2018
Move the os_get_total_physical_memory function from gallium to util,
simplify it (all BSDs support sysconf, no need for sysctl),
use it in gallium, anv, dri/i915, dri/i965 and dri/swrast.
---
src/gallium/auxiliary/os/os_misc.c | 60 -----------------------
src/gallium/auxiliary/os/os_misc.h | 9 +---
src/intel/vulkan/anv_device.c | 12 +++--
src/mesa/drivers/dri/i915/intel_screen.c | 9 ++--
src/mesa/drivers/dri/i965/intel_screen.c | 9 ++--
src/mesa/drivers/dri/swrast/swrast.c | 23 ++-------
src/util/Makefile.sources | 1 +
src/util/meson.build | 1 +
src/util/phys_memory.h | 81 ++++++++++++++++++++++++++++++++
9 files changed, 100 insertions(+), 105 deletions(-)
create mode 100644 src/util/phys_memory.h
diff --git a/src/gallium/auxiliary/os/os_misc.c b/src/gallium/auxiliary/os/os_misc.c
index 09d4400e08..45ae0a1f5b 100644
--- a/src/gallium/auxiliary/os/os_misc.c
+++ b/src/gallium/auxiliary/os/os_misc.c
@@ -114,63 +114,3 @@ os_get_option(const char *name)
return getenv(name);
}
#endif /* !PIPE_SUBSYSTEM_EMBEDDED */
-
-
-/**
- * Return the size of the total physical memory.
- * \param size returns the size of the total physical memory
- * \return true for success, or false on failure
- */
-bool
-os_get_total_physical_memory(uint64_t *size)
-{
-#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_CYGWIN) || defined(PIPE_OS_SOLARIS)
- const long phys_pages = sysconf(_SC_PHYS_PAGES);
- const long page_size = sysconf(_SC_PAGE_SIZE);
-
- if (phys_pages <= 0 || page_size <= 0)
- return false;
-
- *size = (uint64_t)phys_pages * (uint64_t)page_size;
- return true;
-#elif defined(PIPE_OS_APPLE) || defined(PIPE_OS_BSD)
- size_t len = sizeof(*size);
- int mib[2];
-
- mib[0] = CTL_HW;
-#if defined(PIPE_OS_APPLE)
- mib[1] = HW_MEMSIZE;
-#elif defined(PIPE_OS_NETBSD) || defined(PIPE_OS_OPENBSD)
- mib[1] = HW_PHYSMEM64;
-#elif defined(PIPE_OS_FREEBSD)
- mib[1] = HW_REALMEM;
-#elif defined(PIPE_OS_DRAGONFLY)
- mib[1] = HW_PHYSMEM;
-#else
-#error Unsupported *BSD
-#endif
-
- return (sysctl(mib, 2, size, &len, NULL, 0) == 0);
-#elif defined(PIPE_OS_HAIKU)
- system_info info;
- status_t ret;
-
- ret = get_system_info(&info);
- if (ret != B_OK || info.max_pages <= 0)
- return false;
-
- *size = (uint64_t)info.max_pages * (uint64_t)B_PAGE_SIZE;
- return true;
-#elif defined(PIPE_OS_WINDOWS)
- MEMORYSTATUSEX status;
- BOOL ret;
-
- status.dwLength = sizeof(status);
- ret = GlobalMemoryStatusEx(&status);
- *size = status.ullTotalPhys;
- return (ret == TRUE);
-#else
-#error unexpected platform in os_sysinfo.c
- return false;
-#endif
-}
diff --git a/src/gallium/auxiliary/os/os_misc.h b/src/gallium/auxiliary/os/os_misc.h
index 403c8ee6ec..df3206252c 100644
--- a/src/gallium/auxiliary/os/os_misc.h
+++ b/src/gallium/auxiliary/os/os_misc.h
@@ -36,6 +36,7 @@
#include "pipe/p_compiler.h"
+#include "util/phys_memory.h"
#if defined(PIPE_OS_UNIX)
@@ -86,14 +87,6 @@ os_log_message(const char *message);
const char *
os_get_option(const char *name);
-
-/*
- * Get the total amount of physical memory available on the system.
- */
-bool
-os_get_total_physical_memory(uint64_t *size);
-
-
#ifdef __cplusplus
}
#endif
diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
index 777abd8757..606f8b7549 100644
--- a/src/intel/vulkan/anv_device.c
+++ b/src/intel/vulkan/anv_device.c
@@ -25,7 +25,6 @@
#include <stdbool.h>
#include <string.h>
#include <sys/mman.h>
-#include <sys/sysinfo.h>
#include <unistd.h>
#include <fcntl.h>
#include <xf86drm.h>
@@ -36,6 +35,7 @@
#include "util/debug.h"
#include "util/build_id.h"
#include "util/mesa-sha1.h"
+#include "util/phys_memory.h"
#include "vk_util.h"
#include "genxml/gen7_pack.h"
@@ -74,11 +74,13 @@ anv_compute_heap_size(int fd, uint64_t *heap_size)
}
}
- /* Query the total ram from the system */
- struct sysinfo info;
- sysinfo(&info);
+ uint64_t total_ram;
+
+ if (!os_get_total_physical_memory(&total_ram)) {
+ return vk_errorf(NULL, NULL, VK_ERROR_INITIALIZATION_FAILED,
+ "failed to get physical memory size");
+ }
- uint64_t total_ram = (uint64_t)info.totalram * (uint64_t)info.mem_unit;
/* We don't want to burn too much ram with the GPU. If the user has 4GiB
* or less, we use at most half. If they have more than 4GiB, we use 3/4.
diff --git a/src/mesa/drivers/dri/i915/intel_screen.c b/src/mesa/drivers/dri/i915/intel_screen.c
index 5024a69bd4..5182238bfa 100644
--- a/src/mesa/drivers/dri/i915/intel_screen.c
+++ b/src/mesa/drivers/dri/i915/intel_screen.c
@@ -40,6 +40,7 @@
#include "utils.h"
#include "util/xmlpool.h"
+#include "util/phys_memory.h"
static const __DRIconfigOptionsExtension i915_config_options = {
.base = { __DRI_CONFIG_OPTIONS, 1 },
@@ -738,15 +739,11 @@ i915_query_renderer_integer(__DRIscreen *psp, int param, unsigned int *value)
const unsigned gpu_mappable_megabytes =
(aper_size / (1024 * 1024)) * 3 / 4;
- const long system_memory_pages = sysconf(_SC_PHYS_PAGES);
- const long system_page_size = sysconf(_SC_PAGE_SIZE);
+ uint64_t system_memory_bytes;
- if (system_memory_pages <= 0 || system_page_size <= 0)
+ if (!os_get_total_physical_memory(&system_memory_bytes))
return -1;
- const uint64_t system_memory_bytes = (uint64_t) system_memory_pages
- * (uint64_t) system_page_size;
-
const unsigned system_memory_megabytes =
(unsigned) (system_memory_bytes / (1024 * 1024));
diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
index 9dbda5142e..0c081f49b2 100644
--- a/src/mesa/drivers/dri/i965/intel_screen.c
+++ b/src/mesa/drivers/dri/i965/intel_screen.c
@@ -42,6 +42,7 @@
#include "utils.h"
#include "util/xmlpool.h"
+#include "util/phys_memory.h"
static const __DRIconfigOptionsExtension brw_config_options = {
.base = { __DRI_CONFIG_OPTIONS, 1 },
@@ -1419,15 +1420,11 @@ brw_query_renderer_integer(__DRIscreen *dri_screen,
const unsigned gpu_mappable_megabytes =
screen->aperture_threshold / (1024 * 1024);
- const long system_memory_pages = sysconf(_SC_PHYS_PAGES);
- const long system_page_size = sysconf(_SC_PAGE_SIZE);
+ uint64_t system_memory_bytes;
- if (system_memory_pages <= 0 || system_page_size <= 0)
+ if (!os_get_total_physical_memory(&system_memory_bytes))
return -1;
- const uint64_t system_memory_bytes = (uint64_t) system_memory_pages
- * (uint64_t) system_page_size;
-
const unsigned system_memory_megabytes =
(unsigned) (system_memory_bytes / (1024 * 1024));
diff --git a/src/mesa/drivers/dri/swrast/swrast.c b/src/mesa/drivers/dri/swrast/swrast.c
index 4bee01ad30..eecdbc1566 100644
--- a/src/mesa/drivers/dri/swrast/swrast.c
+++ b/src/mesa/drivers/dri/swrast/swrast.c
@@ -51,6 +51,7 @@
#include "vbo/vbo.h"
#include "drivers/common/driverfuncs.h"
#include "drivers/common/meta.h"
+#include "util/phys_memory.h"
#include "utils.h"
#include "main/teximage.h"
@@ -142,29 +143,11 @@ swrast_query_renderer_integer(__DRIscreen *psp, int param,
value[0] = 0;
return 0;
case __DRI2_RENDERER_VIDEO_MEMORY: {
- /* This should probably share code with os_get_total_physical_memory()
- * from src/gallium/auxiliary/os/os_misc.c
- */
-#if defined(CTL_HW) && defined(HW_MEMSIZE)
- int mib[2] = { CTL_HW, HW_MEMSIZE };
- unsigned long system_memory_bytes;
- size_t len = sizeof(system_memory_bytes);
- if (sysctl(mib, 2, &system_memory_bytes, &len, NULL, 0) != 0)
- return -1;
-#elif defined(_SC_PHYS_PAGES) && defined(_SC_PAGE_SIZE)
- /* XXX: Do we want to return the full amount of system memory ? */
- const long system_memory_pages = sysconf(_SC_PHYS_PAGES);
- const long system_page_size = sysconf(_SC_PAGE_SIZE);
+ uint64_t system_memory_bytes;
- if (system_memory_pages <= 0 || system_page_size <= 0)
+ if (!os_get_total_physical_memory(&system_memory_bytes))
return -1;
- const uint64_t system_memory_bytes = (uint64_t) system_memory_pages
- * (uint64_t) system_page_size;
-#else
-#error "Unsupported platform"
-#endif
-
const unsigned system_memory_megabytes =
(unsigned) (system_memory_bytes / (1024 * 1024));
diff --git a/src/util/Makefile.sources b/src/util/Makefile.sources
index f30a063630..8ef7b7ab87 100644
--- a/src/util/Makefile.sources
+++ b/src/util/Makefile.sources
@@ -25,6 +25,7 @@ MESA_UTIL_FILES := \
mesa-sha1.h \
os_time.c \
os_time.h \
+ phys_memory.h \
sha1/sha1.c \
sha1/sha1.h \
ralloc.c \
diff --git a/src/util/meson.build b/src/util/meson.build
index 4e9ba14a2c..00d2018f2d 100644
--- a/src/util/meson.build
+++ b/src/util/meson.build
@@ -49,6 +49,7 @@ files_mesa_util = files(
'mesa-sha1.h',
'os_time.c',
'os_time.h',
+ 'phys_memory.h',
'sha1/sha1.c',
'sha1/sha1.h',
'ralloc.c',
diff --git a/src/util/phys_memory.h b/src/util/phys_memory.h
new file mode 100644
index 0000000000..f0822b4fec
--- /dev/null
+++ b/src/util/phys_memory.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright © 2008-2010 Vmware, Inc.
+ * Copyright © 2018 Greg V
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include <stdbool.h>
+#ifdef __APPLE__
+#include <sys/sysctl.h>
+#elif __HAIKU__
+#include <kernel/OS.h>
+#elif defined(_WIN32) || defined(WIN32)
+#include <windows.h>
+#else
+#include <unistd.h>
+#endif
+
+/**
+ * Return the size of the total physical memory.
+ * \param size returns the size of the total physical memory
+ * \return true for success, or false on failure
+ */
+static inline bool
+os_get_total_physical_memory(uint64_t *size)
+{
+#ifdef __APPLE__
+ // Use sysctl because _SC_PHYS_PAGES only started working in 10.11: https://twitter.com/cperciva/status/711799247817945088
+ size_t len = sizeof(*size);
+ int mib[2];
+
+ mib[0] = CTL_HW;
+ mib[1] = HW_MEMSIZE;
+
+ return (sysctl(mib, 2, size, &len, NULL, 0) == 0);
+#elif __HAIKU__
+ system_info info;
+ status_t ret;
+
+ ret = get_system_info(&info);
+ if (ret != B_OK || info.max_pages <= 0)
+ return false;
+
+ *size = (uint64_t)info.max_pages * (uint64_t)B_PAGE_SIZE;
+ return true;
+#elif defined(_WIN32) || defined(WIN32)
+ MEMORYSTATUSEX status;
+ BOOL ret;
+
+ status.dwLength = sizeof(status);
+ ret = GlobalMemoryStatusEx(&status);
+ *size = status.ullTotalPhys;
+ return (ret == TRUE);
+#else
+ const long phys_pages = sysconf(_SC_PHYS_PAGES);
+ const long page_size = sysconf(_SC_PAGESIZE);
+
+ if (phys_pages <= 0 || page_size <= 0)
+ return false;
+
+ *size = (uint64_t)phys_pages * (uint64_t)page_size;
+ return true;
+#endif
+}
--
2.15.1
More information about the mesa-dev
mailing list