OSDN Git Service

drm/i915: Simplify error escape from cmdparser
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 11 Dec 2019 11:04:35 +0000 (11:04 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 11 Dec 2019 22:40:40 +0000 (22:40 +0000)
We need to flush the destination buffer, even on error, to maintain
consistent cache state. Thereby removing the jump on error past the
clear, and reducing the loop-escape mechanism to a mere break.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191211110437.4082687-3-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_cmd_parser.c

index 2f5811d..b692c40 100644 (file)
@@ -1453,7 +1453,7 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine,
                if (!desc) {
                        DRM_DEBUG("CMD: Unrecognized command: 0x%08X\n", *cmd);
                        ret = -EINVAL;
-                       goto err;
+                       break;
                }
 
                if (desc->flags & CMD_DESC_FIXED)
@@ -1467,21 +1467,18 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine,
                                  length,
                                  batch_end - cmd);
                        ret = -EINVAL;
-                       goto err;
+                       break;
                }
 
                if (!check_cmd(engine, desc, cmd, length)) {
                        ret = -EACCES;
-                       goto err;
+                       break;
                }
 
                if (desc->cmd.value == MI_BATCH_BUFFER_START) {
                        ret = check_bbstart(cmd, offset, length, batch_length,
                                            batch_addr, shadow_addr,
                                            jump_whitelist);
-
-                       if (ret)
-                               goto err;
                        break;
                }
 
@@ -1493,7 +1490,7 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine,
                if  (cmd >= batch_end) {
                        DRM_DEBUG("CMD: Got to the end of the buffer w/o a BBE cmd!\n");
                        ret = -EINVAL;
-                       goto err;
+                       break;
                }
        } while (1);
 
@@ -1503,7 +1500,6 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine,
                drm_clflush_virt_range(ptr, (void *)(cmd + 1) - ptr);
        }
 
-err:
        if (!IS_ERR_OR_NULL(jump_whitelist))
                kfree(jump_whitelist);
        i915_gem_object_unpin_map(shadow->obj);