Though less likely in practice, igt uses MI_NOOP frequently to pad out
its the batch buffers. The lookup and valiation of the MI_NOOP command
description is noticeable, though the side-effect of poisoning the
last-validate-command cache is more likely to impact upon real CS.

Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_cmd_parser.c | 58 +++++++++++++-------------
 1 file changed, 30 insertions(+), 28 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_cmd_parser.c 
b/drivers/gpu/drm/i915/i915_cmd_parser.c
index e88970256e8e..20014663cd5e 100644
--- a/drivers/gpu/drm/i915/i915_cmd_parser.c
+++ b/drivers/gpu/drm/i915/i915_cmd_parser.c
@@ -1453,42 +1453,44 @@ int intel_engine_cmd_parser(struct intel_engine_cs 
*engine,
         */
        batch_end = cmd + batch_length / sizeof(*batch_end);
        do {
-               u32 length;
+               u32 length = 1;
 
                if (*cmd == MI_BATCH_BUFFER_END)
                        break;
 
-               desc = find_cmd(engine, *cmd, desc, &default_desc);
-               if (!desc) {
-                       DRM_DEBUG("CMD: Unrecognized command: 0x%08X\n", *cmd);
-                       ret = -EINVAL;
-                       break;
-               }
+               if (*cmd) {
+                       desc = find_cmd(engine, *cmd, desc, &default_desc);
+                       if (!desc) {
+                               DRM_DEBUG("CMD: Unrecognized command: 
0x%08X\n", *cmd);
+                               ret = -EINVAL;
+                               break;
+                       }
 
-               if (desc->flags & CMD_DESC_FIXED)
-                       length = desc->length.fixed;
-               else
-                       length = (*cmd & desc->length.mask) + LENGTH_BIAS;
+                       if (desc->flags & CMD_DESC_FIXED)
+                               length = desc->length.fixed;
+                       else
+                               length = (*cmd & desc->length.mask) + 
LENGTH_BIAS;
 
-               if ((batch_end - cmd) < length) {
-                       DRM_DEBUG("CMD: Command length exceeds batch length: 
0x%08X length=%u batchlen=%td\n",
-                                 *cmd,
-                                 length,
-                                 batch_end - cmd);
-                       ret = -EINVAL;
-                       break;
-               }
+                       if ((batch_end - cmd) < length) {
+                               DRM_DEBUG("CMD: Command length exceeds batch 
length: 0x%08X length=%u batchlen=%td\n",
+                                         *cmd,
+                                         length,
+                                         batch_end - cmd);
+                               ret = -EINVAL;
+                               break;
+                       }
 
-               if (!check_cmd(engine, desc, cmd, length)) {
-                       ret = -EACCES;
-                       break;
-               }
+                       if (!check_cmd(engine, desc, cmd, length)) {
+                               ret = -EACCES;
+                               break;
+                       }
 
-               if (cmd_desc_is(desc, MI_BATCH_BUFFER_START)) {
-                       ret = check_bbstart(cmd, offset, length, batch_length,
-                                           batch_addr, shadow_addr,
-                                           jump_whitelist);
-                       break;
+                       if (cmd_desc_is(desc, MI_BATCH_BUFFER_START)) {
+                               ret = check_bbstart(cmd, offset, length, 
batch_length,
+                                                   batch_addr, shadow_addr,
+                                                   jump_whitelist);
+                               break;
+                       }
                }
 
                if (!IS_ERR_OR_NULL(jump_whitelist))
-- 
2.20.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to