[igt-dev] [PATCH i-g-t] lib: Purge os caches twice for good luck

Chris Wilson chris at chris-wilson.co.uk
Fri Jun 15 13:32:49 UTC 2018


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 <chris at chris-wilson.co.uk>
---
 lib/intel_os.c | 34 ++++++++++++++++++----------------
 1 file changed, 18 insertions(+), 16 deletions(-)

diff --git a/lib/intel_os.c b/lib/intel_os.c
index 0cd959ea1..88a61f378 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
-- 
2.17.1



More information about the igt-dev mailing list