Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 81848cc9 authored by Jon Bloomfield's avatar Jon Bloomfield Committed by Greg Kroah-Hartman
Browse files

drm/i915/cmdparser: Use explicit goto for error paths



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: default avatarJon 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: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: default avatarChris Wilson <chris.p.wilson@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent a6ba2df1
Loading
Loading
Loading
Loading
+13 −12
Original line number Diff line number Diff line
@@ -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;
}