Using DROP_FREED invokes an rcu_barrier() to ensure that all RCU
protected objects are freed before it returns. rcu_barrier() is a very
high latency operation (~50ms at best) which is only required under
specific circumstances such as when we need a stable object count. By
removing it from gem_quiescent_gpu() we can save over 10s across a BAT
run.

Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
---
 lib/drmtest.c     |  3 +--
 lib/igt_debugfs.c | 14 ++++++++------
 lib/intel_os.c    | 15 +++++++++------
 3 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/lib/drmtest.c b/lib/drmtest.c
index fd11f5f58..40bd6fec8 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -163,8 +163,7 @@ void gem_quiescent_gpu(int fd)
 {
        igt_terminate_spin_batches();
 
-       igt_drop_caches_set(fd,
-                           DROP_ACTIVE | DROP_RETIRE | DROP_IDLE | DROP_FREED);
+       igt_drop_caches_set(fd, DROP_ACTIVE | DROP_RETIRE | DROP_IDLE);
 }
 
 /**
diff --git a/lib/igt_debugfs.c b/lib/igt_debugfs.c
index 1aec079c5..6d9d27d9c 100644
--- a/lib/igt_debugfs.c
+++ b/lib/igt_debugfs.c
@@ -977,13 +977,15 @@ static int get_object_count(int fd)
  */
 int igt_get_stable_obj_count(int driver)
 {
-       int obj_count;
-       gem_quiescent_gpu(driver);
-       obj_count = get_object_count(driver);
-       /* The test relies on the system being in the same state before and
+       /*
+        * The test relies on the system being in the same state before and
         * after the test so any difference in the object count is a result of
-        * leaks during the test. */
-       return obj_count;
+        * leaks during the test.
+        * */
+       igt_drop_caches_set(driver,
+                           DROP_ACTIVE | DROP_RETIRE | DROP_IDLE | DROP_FREED);
+
+       return get_object_count(driver);
 }
 
 void igt_debugfs_dump(int device, const char *filename)
diff --git a/lib/intel_os.c b/lib/intel_os.c
index bb2c16bf3..b5d9888d8 100644
--- a/lib/intel_os.c
+++ b/lib/intel_os.c
@@ -96,11 +96,6 @@ intel_get_avail_ram_mb(void)
 
 #ifdef HAVE_STRUCT_SYSINFO_TOTALRAM /* Linux */
        struct sysinfo sysinf;
-       int fd;
-
-       fd = drm_open_driver(DRIVER_INTEL);
-       intel_purge_vm_caches(fd);
-       close(fd);
 
        igt_assert(sysinfo(&sysinf) == 0);
        retval = sysinf.freeram;
@@ -281,6 +276,12 @@ void intel_require_memory(uint64_t count, uint64_t size, 
unsigned mode)
 {
        uint64_t required, total;
 
+       if (!__intel_check_memory(count, size, mode, &required, &total)) {
+               int fd = drm_open_driver(DRIVER_INTEL);
+               intel_purge_vm_caches(fd);
+               close(fd);
+       }
+
        igt_require_f(__intel_check_memory(count, size, mode,
                                            &required, &total),
                      "Estimated that we need %'llu objects and %'llu MiB for 
the test, but only have %'llu MiB available (%s%s) and a maximum of %'llu 
objects\n",
@@ -298,7 +299,9 @@ void intel_purge_vm_caches(int drm_fd)
 {
        int fd;
 
-       igt_drop_caches_set(drm_fd, DROP_SHRINK_ALL | DROP_IDLE | DROP_FREED);
+       igt_drop_caches_set(drm_fd,
+                           DROP_ACTIVE | DROP_RETIRE | DROP_IDLE |
+                           DROP_SHRINK_ALL | DROP_FREED);
 
        fd = open("/proc/sys/vm/drop_caches", O_WRONLY);
        if (fd >= 0) {
-- 
2.15.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to