From 778497e7965dc8662c770a89ebbd741778feb71e Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Fri, 15 Jun 2018 14:31:19 +0100 Subject: lib: Purge os caches twice for good luck If at first we don't succeed, try, try again. References: https://bugs.freedesktop.org/show_bug.cgi?id=105967 Signed-off-by: Chris Wilson Reviewed-by: Joonas Lahtinen --- lib/intel_os.c | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) (limited to 'lib/intel_os.c') diff --git a/lib/intel_os.c b/lib/intel_os.c index 0cd959ea..88a61f37 100644 --- a/lib/intel_os.c +++ b/lib/intel_os.c @@ -379,32 +379,34 @@ void intel_purge_vm_caches(int drm_fd) { int fd; - igt_drop_caches_set(drm_fd, DROP_SHRINK_ALL | DROP_IDLE | DROP_FREED); - fd = open("/proc/sys/vm/drop_caches", O_WRONLY); if (fd >= 0) { - /* BIT(2): Be quiet. Cannot be combined with other operations, + /* + * BIT(2): Be quiet. Cannot be combined with other operations, * the sysctl has a max value of 4. */ igt_ignore_warn(write(fd, "4\n", 2)); close(fd); } - /* Reset write position back to start. Do as a seperate write to keep - * the stages segregated and avoid failure from the squelching stopping - * the purge. - */ - fd = open("/proc/sys/vm/drop_caches", O_WRONLY); - if (fd < 0) - return; + for (int loop = 0; loop < 2; loop++) { + igt_drop_caches_set(drm_fd, + DROP_SHRINK_ALL | DROP_IDLE | DROP_FREED); - /* BIT(0): Drop page cache - * BIT(1): Drop slab cache - */ - igt_ignore_warn(write(fd, "3\n", 2)); - close(fd); -} + fd = open("/proc/sys/vm/drop_caches", O_WRONLY); + if (fd < 0) + continue; + /* + * BIT(0): Drop page cache + * BIT(1): Drop slab cache + */ + igt_ignore_warn(write(fd, "3\n", 2)); + close(fd); + } + + errno = 0; +} /* * When testing a port to a new platform, create a standalone test binary -- cgit v1.2.3