drm/i915: Prefer memset64() when filling the iomap
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 19 Mar 2018 12:35:28 +0000 (12:35 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 19 Mar 2018 14:42:40 +0000 (14:42 +0000)
As the ringbuffer may exist inside stolen memory, our access to it may
be via the GTT iomap. This implies we may only have WC access for which
the conventional memset() substitution of rep stos performs very badly,
so switch to the rep mov[dq] variants when available.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@intel.com>
Cc: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180319123528.28249-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/intel_ringbuffer.c

index 72d6167c519a660b5dd31a25e73b17e7bebeb1c6..04d9d9a946a77d31fb7c185ed809bcdb39cdd566 100644 (file)
@@ -1693,17 +1693,18 @@ u32 *intel_ring_begin(struct i915_request *rq, unsigned int num_dwords)
                need_wrap &= ~1;
                GEM_BUG_ON(need_wrap > ring->space);
                GEM_BUG_ON(ring->emit + need_wrap > ring->size);
+               GEM_BUG_ON(!IS_ALIGNED(need_wrap, sizeof(u64)));
 
                /* Fill the tail with MI_NOOP */
-               memset(ring->vaddr + ring->emit, 0, need_wrap);
-               ring->emit = 0;
+               memset64(ring->vaddr + ring->emit, 0, need_wrap / sizeof(u64));
                ring->space -= need_wrap;
+               ring->emit = 0;
        }
 
        GEM_BUG_ON(ring->emit > ring->size - bytes);
        GEM_BUG_ON(ring->space < bytes);
        cs = ring->vaddr + ring->emit;
-       GEM_DEBUG_EXEC(memset(cs, POISON_INUSE, bytes));
+       GEM_DEBUG_EXEC(memset32(cs, POISON_INUSE, bytes / sizeof(*cs)));
        ring->emit += bytes;
        ring->space -= bytes;