diff options
author | Jon Bloomfield <jon.bloomfield@intel.com> | 2018-09-27 13:23:17 -0400 |
---|---|---|
committer | Jon Bloomfield <jon.bloomfield@intel.com> | 2019-11-05 14:37:54 -0500 |
commit | 0546a29cd884fb8184731c79ab008927ca8859d0 (patch) | |
tree | 43bfcd52bc33f7ce95a871075acc4447e8f7e7ad | |
parent | 0f2f39758341df70202ae1c42d5a1e4ee392b6d3 (diff) |
drm/i915/cmdparser: Use explicit goto for error paths
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.
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: Jon Bloomfield <jon.bloomfield@intel.com>
Reviewed-by: Chris Wilson <chris.p.wilson@intel.com>
-rw-r--r-- | drivers/gpu/drm/i915/i915_cmd_parser.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/drivers/gpu/drm/i915/i915_cmd_parser.c b/drivers/gpu/drm/i915/i915_cmd_parser.c index 6794034c8ced..dc5bcbc3ba6e 100644 --- a/drivers/gpu/drm/i915/i915_cmd_parser.c +++ b/drivers/gpu/drm/i915/i915_cmd_parser.c | |||
@@ -1338,21 +1338,15 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine, | |||
1338 | do { | 1338 | do { |
1339 | u32 length; | 1339 | u32 length; |
1340 | 1340 | ||
1341 | if (*cmd == MI_BATCH_BUFFER_END) { | 1341 | if (*cmd == MI_BATCH_BUFFER_END) |
1342 | if (needs_clflush_after) { | ||
1343 | void *ptr = page_mask_bits(shadow_batch_obj->mm.mapping); | ||
1344 | drm_clflush_virt_range(ptr, | ||
1345 | (void *)(cmd + 1) - ptr); | ||
1346 | } | ||
1347 | break; | 1342 | break; |
1348 | } | ||
1349 | 1343 | ||
1350 | desc = find_cmd(engine, *cmd, desc, &default_desc); | 1344 | desc = find_cmd(engine, *cmd, desc, &default_desc); |
1351 | if (!desc) { | 1345 | if (!desc) { |
1352 | DRM_DEBUG_DRIVER("CMD: Unrecognized command: 0x%08X\n", | 1346 | DRM_DEBUG_DRIVER("CMD: Unrecognized command: 0x%08X\n", |
1353 | *cmd); | 1347 | *cmd); |
1354 | ret = -EINVAL; | 1348 | ret = -EINVAL; |
1355 | break; | 1349 | goto err; |
1356 | } | 1350 | } |
1357 | 1351 | ||
1358 | /* | 1352 | /* |
@@ -1362,7 +1356,7 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine, | |||
1362 | */ | 1356 | */ |
1363 | if (desc->cmd.value == MI_BATCH_BUFFER_START) { | 1357 | if (desc->cmd.value == MI_BATCH_BUFFER_START) { |
1364 | ret = -EACCES; | 1358 | ret = -EACCES; |
1365 | break; | 1359 | goto err; |
1366 | } | 1360 | } |
1367 | 1361 | ||
1368 | if (desc->flags & CMD_DESC_FIXED) | 1362 | if (desc->flags & CMD_DESC_FIXED) |
@@ -1376,22 +1370,29 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine, | |||
1376 | length, | 1370 | length, |
1377 | batch_end - cmd); | 1371 | batch_end - cmd); |
1378 | ret = -EINVAL; | 1372 | ret = -EINVAL; |
1379 | break; | 1373 | goto err; |
1380 | } | 1374 | } |
1381 | 1375 | ||
1382 | if (!check_cmd(engine, desc, cmd, length)) { | 1376 | if (!check_cmd(engine, desc, cmd, length)) { |
1383 | ret = -EACCES; | 1377 | ret = -EACCES; |
1384 | break; | 1378 | goto err; |
1385 | } | 1379 | } |
1386 | 1380 | ||
1387 | cmd += length; | 1381 | cmd += length; |
1388 | if (cmd >= batch_end) { | 1382 | if (cmd >= batch_end) { |
1389 | DRM_DEBUG_DRIVER("CMD: Got to the end of the buffer w/o a BBE cmd!\n"); | 1383 | DRM_DEBUG_DRIVER("CMD: Got to the end of the buffer w/o a BBE cmd!\n"); |
1390 | ret = -EINVAL; | 1384 | ret = -EINVAL; |
1391 | break; | 1385 | goto err; |
1392 | } | 1386 | } |
1393 | } while (1); | 1387 | } while (1); |
1394 | 1388 | ||
1389 | if (needs_clflush_after) { | ||
1390 | void *ptr = page_mask_bits(shadow_batch_obj->mm.mapping); | ||
1391 | |||
1392 | drm_clflush_virt_range(ptr, (void *)(cmd + 1) - ptr); | ||
1393 | } | ||
1394 | |||
1395 | err: | ||
1395 | i915_gem_object_unpin_map(shadow_batch_obj); | 1396 | i915_gem_object_unpin_map(shadow_batch_obj); |
1396 | return ret; | 1397 | return ret; |
1397 | } | 1398 | } |