return 0;
 }
 
-#define wa_ctx_emit(batch, cmd)                                                \
+#define wa_ctx_emit(batch, index, cmd)                                 \
        do {                                                            \
-               if (WARN_ON(index >= (PAGE_SIZE / sizeof(uint32_t)))) { \
+               int __index = (index)++;                                \
+               if (WARN_ON(__index >= (PAGE_SIZE / sizeof(uint32_t)))) { \
                        return -ENOSPC;                                 \
                }                                                       \
-               batch[index++] = (cmd);                                 \
+               batch[__index] = (cmd);                                 \
        } while (0)
 
 
 {
        uint32_t l3sqc4_flush = (0x40400000 | GEN8_LQSC_FLUSH_COHERENT_LINES);
 
-       wa_ctx_emit(batch, (MI_STORE_REGISTER_MEM_GEN8(1) |
-                           MI_SRM_LRM_GLOBAL_GTT));
-       wa_ctx_emit(batch, GEN8_L3SQCREG4);
-       wa_ctx_emit(batch, ring->scratch.gtt_offset + 256);
-       wa_ctx_emit(batch, 0);
-
-       wa_ctx_emit(batch, MI_LOAD_REGISTER_IMM(1));
-       wa_ctx_emit(batch, GEN8_L3SQCREG4);
-       wa_ctx_emit(batch, l3sqc4_flush);
-
-       wa_ctx_emit(batch, GFX_OP_PIPE_CONTROL(6));
-       wa_ctx_emit(batch, (PIPE_CONTROL_CS_STALL |
-                           PIPE_CONTROL_DC_FLUSH_ENABLE));
-       wa_ctx_emit(batch, 0);
-       wa_ctx_emit(batch, 0);
-       wa_ctx_emit(batch, 0);
-       wa_ctx_emit(batch, 0);
-
-       wa_ctx_emit(batch, (MI_LOAD_REGISTER_MEM_GEN8(1) |
-                           MI_SRM_LRM_GLOBAL_GTT));
-       wa_ctx_emit(batch, GEN8_L3SQCREG4);
-       wa_ctx_emit(batch, ring->scratch.gtt_offset + 256);
-       wa_ctx_emit(batch, 0);
+       wa_ctx_emit(batch, index, (MI_STORE_REGISTER_MEM_GEN8(1) |
+                                  MI_SRM_LRM_GLOBAL_GTT));
+       wa_ctx_emit(batch, index, GEN8_L3SQCREG4);
+       wa_ctx_emit(batch, index, ring->scratch.gtt_offset + 256);
+       wa_ctx_emit(batch, index, 0);
+
+       wa_ctx_emit(batch, index, MI_LOAD_REGISTER_IMM(1));
+       wa_ctx_emit(batch, index, GEN8_L3SQCREG4);
+       wa_ctx_emit(batch, index, l3sqc4_flush);
+
+       wa_ctx_emit(batch, index, GFX_OP_PIPE_CONTROL(6));
+       wa_ctx_emit(batch, index, (PIPE_CONTROL_CS_STALL |
+                                  PIPE_CONTROL_DC_FLUSH_ENABLE));
+       wa_ctx_emit(batch, index, 0);
+       wa_ctx_emit(batch, index, 0);
+       wa_ctx_emit(batch, index, 0);
+       wa_ctx_emit(batch, index, 0);
+
+       wa_ctx_emit(batch, index, (MI_LOAD_REGISTER_MEM_GEN8(1) |
+                                  MI_SRM_LRM_GLOBAL_GTT));
+       wa_ctx_emit(batch, index, GEN8_L3SQCREG4);
+       wa_ctx_emit(batch, index, ring->scratch.gtt_offset + 256);
+       wa_ctx_emit(batch, index, 0);
 
        return index;
 }
        uint32_t index = wa_ctx_start(wa_ctx, *offset, CACHELINE_DWORDS);
 
        /* WaDisableCtxRestoreArbitration:bdw,chv */
-       wa_ctx_emit(batch, MI_ARB_ON_OFF | MI_ARB_DISABLE);
+       wa_ctx_emit(batch, index, MI_ARB_ON_OFF | MI_ARB_DISABLE);
 
        /* WaFlushCoherentL3CacheLinesAtContextSwitch:bdw */
        if (IS_BROADWELL(ring->dev)) {
        /* Actual scratch location is at 128 bytes offset */
        scratch_addr = ring->scratch.gtt_offset + 2*CACHELINE_BYTES;
 
-       wa_ctx_emit(batch, GFX_OP_PIPE_CONTROL(6));
-       wa_ctx_emit(batch, (PIPE_CONTROL_FLUSH_L3 |
-                           PIPE_CONTROL_GLOBAL_GTT_IVB |
-                           PIPE_CONTROL_CS_STALL |
-                           PIPE_CONTROL_QW_WRITE));
-       wa_ctx_emit(batch, scratch_addr);
-       wa_ctx_emit(batch, 0);
-       wa_ctx_emit(batch, 0);
-       wa_ctx_emit(batch, 0);
+       wa_ctx_emit(batch, index, GFX_OP_PIPE_CONTROL(6));
+       wa_ctx_emit(batch, index, (PIPE_CONTROL_FLUSH_L3 |
+                                  PIPE_CONTROL_GLOBAL_GTT_IVB |
+                                  PIPE_CONTROL_CS_STALL |
+                                  PIPE_CONTROL_QW_WRITE));
+       wa_ctx_emit(batch, index, scratch_addr);
+       wa_ctx_emit(batch, index, 0);
+       wa_ctx_emit(batch, index, 0);
+       wa_ctx_emit(batch, index, 0);
 
        /* Pad to end of cacheline */
        while (index % CACHELINE_DWORDS)
-               wa_ctx_emit(batch, MI_NOOP);
+               wa_ctx_emit(batch, index, MI_NOOP);
 
        /*
         * MI_BATCH_BUFFER_END is not required in Indirect ctx BB because
        uint32_t index = wa_ctx_start(wa_ctx, *offset, CACHELINE_DWORDS);
 
        /* WaDisableCtxRestoreArbitration:bdw,chv */
-       wa_ctx_emit(batch, MI_ARB_ON_OFF | MI_ARB_ENABLE);
+       wa_ctx_emit(batch, index, MI_ARB_ON_OFF | MI_ARB_ENABLE);
 
-       wa_ctx_emit(batch, MI_BATCH_BUFFER_END);
+       wa_ctx_emit(batch, index, MI_BATCH_BUFFER_END);
 
        return wa_ctx_end(wa_ctx, *offset = index, 1);
 }