diff options
author | 2019-11-13 06:29:55 +0000 | |
---|---|---|
committer | 2019-11-13 06:29:55 +0000 | |
commit | c1dee68720147c76d9e2f746e33e06a8db96e11d (patch) | |
tree | eba4889176229f7d0f6eab19455971e821e1238c | |
parent | drm/i915: Add gen9 BCS cmdparsing (diff) | |
download | wireguard-openbsd-c1dee68720147c76d9e2f746e33e06a8db96e11d.tar.xz wireguard-openbsd-c1dee68720147c76d9e2f746e33e06a8db96e11d.zip |
drm/i915/cmdparser: Use explicit goto for error paths
From Jon Bloomfield
f27bc2b5950dccac563706a764aa0c2d387db8e9 in linux 4.19.y/4.19.84
0546a29cd884fb8184731c79ab008927ca8859d0 in mainline linux
-rw-r--r-- | sys/dev/pci/drm/i915/i915_cmd_parser.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/sys/dev/pci/drm/i915/i915_cmd_parser.c b/sys/dev/pci/drm/i915/i915_cmd_parser.c index 2dcfd6a145a..379cd055476 100644 --- a/sys/dev/pci/drm/i915/i915_cmd_parser.c +++ b/sys/dev/pci/drm/i915/i915_cmd_parser.c @@ -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 = page_mask_bits(shadow_batch_obj->mm.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 = page_mask_bits(shadow_batch_obj->mm.mapping); + + drm_clflush_virt_range(ptr, (void *)(cmd + 1) - ptr); + } + +err: i915_gem_object_unpin_map(shadow_batch_obj); return ret; } |