drm/i915/cmdparser: Use explicit goto for error paths
authorJon Bloomfield <jon.bloomfield@intel.com>
Thu, 27 Sep 2018 17:23:17 +0000 (10:23 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 12 Nov 2019 18:16:22 +0000 (19:16 +0100)
commit 0546a29cd884fb8184731c79ab008927ca8859d0 upstream.

In the next patch we will be adding a second valid
termination condition which will require a small
amount of refactoring to share logic with the BB_END
case.

Refactor all error conditions to jump to a dedicated
exit path, with 'break' reserved only for a successful
parse.

Signed-off-by: Jon Bloomfield <jon.bloomfield@intel.com>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Takashi Iwai <tiwai@suse.de>
Cc: Tyler Hicks <tyhicks@canonical.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: Chris Wilson <chris.p.wilson@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/i915/i915_cmd_parser.c

index c662cd5344325bca02da764acf363d589501fae7..21451e8ca985e59d2b494b86fba27267e2a2a036 100644 (file)
@@ -1337,21 +1337,15 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine,
        do {
                u32 length;
 
-               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);
-                       }
+               if (*cmd == MI_BATCH_BUFFER_END)
                        break;
-               }
 
                desc = find_cmd(engine, *cmd, desc, &default_desc);
                if (!desc) {
                        DRM_DEBUG_DRIVER("CMD: Unrecognized command: 0x%08X\n",
                                         *cmd);
                        ret = -EINVAL;
-                       break;
+                       goto err;
                }
 
                /*
@@ -1361,7 +1355,7 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine,
                 */
                if (desc->cmd.value == MI_BATCH_BUFFER_START) {
                        ret = -EACCES;
-                       break;
+                       goto err;
                }
 
                if (desc->flags & CMD_DESC_FIXED)
@@ -1375,22 +1369,29 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine,
                                         length,
                                         batch_end - cmd);
                        ret = -EINVAL;
-                       break;
+                       goto err;
                }
 
                if (!check_cmd(engine, desc, cmd, length)) {
                        ret = -EACCES;
-                       break;
+                       goto err;
                }
 
                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;
-                       break;
+                       goto err;
                }
        } while (1);
 
+       if (needs_clflush_after) {
+               void *ptr = ptr_mask_bits(shadow_batch_obj->mapping);
+               drm_clflush_virt_range(ptr,
+                                      (void *)(cmd + 1) - ptr);
+       }
+
+err:
        i915_gem_object_unpin_map(shadow_batch_obj);
        return ret;
 }