drm/i915/cmdparser: Limit clflush to active cachelines
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 10 Mar 2017 11:55:18 +0000 (11:55 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 12 Nov 2019 18:16:15 +0000 (19:16 +0100)
commit 504ae4024131c5a01c3ce8382d49b801375e039c upstream.

We only need to clflush those cachelines that we have validated to be
read by the GPU. Userspace typically fills the batch length in
correctly, the exceptions tend to be explicit tests within igt.

v2: Use ptr_mask_bits() to make Mika happy
v3: cmd is not advanced on MI_BBE, so make sure to include an extra
dword in the clflush.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170310115518.13832-1-chris@chris-wilson.co.uk
Signed-off-by: Jon Bloomfield <jon.bloomfield@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/i915/i915_cmd_parser.c

index bdfdb4595a9e1b6d85701c6755180ac005b41a05..cd124df3e005d1fdde2b6b5c21d71b96994cc043 100644 (file)
@@ -1279,11 +1279,17 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine,
         * space. Parsing should be faster in some cases this way.
         */
        batch_end = cmd + (batch_len / sizeof(*batch_end));
-       while (cmd < batch_end) {
+       do {
                u32 length;
 
-               if (*cmd == MI_BATCH_BUFFER_END)
+               if (*cmd == MI_BATCH_BUFFER_END) {
+                       if (needs_clflush_after) {
+                               void *ptr = ptr_mask_bits(shadow_batch_obj->mapping);
+                               drm_clflush_virt_range(ptr,
+                                                      (void *)(cmd + 1) - ptr);
+                       }
                        break;
+               }
 
                desc = find_cmd(engine, *cmd, desc, &default_desc);
                if (!desc) {
@@ -1323,17 +1329,14 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine,
                }
 
                cmd += length;
-       }
-
-       if (cmd >= batch_end) {
-               DRM_DEBUG_DRIVER("CMD: Got to the end of the buffer w/o a BBE cmd!\n");
-               ret = -EINVAL;
-       }
+               if  (cmd >= batch_end) {
+                       DRM_DEBUG_DRIVER("CMD: Got to the end of the buffer w/o a BBE cmd!\n");
+                       ret = -EINVAL;
+                       break;
+               }
+       } while (1);
 
-       if (ret == 0 && needs_clflush_after)
-               drm_clflush_virt_range(shadow_batch_obj->mapping, batch_len);
        i915_gem_object_unpin_map(shadow_batch_obj);
-
        return ret;
 }