On Fri, Dec 12, 2014 at 04:13:03PM +0000, Dave Gordon wrote: > static inline void intel_ring_advance(struct intel_engine_cs *ring) > { > struct intel_ringbuffer *ringbuf = ring->buffer; > - ringbuf->tail &= ringbuf->size - 1; > + > + __intel_ringbuffer_check(ringbuf); > + > + /* > + * Tail == effecive_size is legitimate (buffer exactly full). > + * Tail > effective_size is not, and should give a warning, > + * but we'll reset tail in both cases to prevent further chaos > + */ > + if (ringbuf->tail >= ringbuf->effective_size) > + ringbuf->tail -= ringbuf->effective_size; Urm. No. If you never write into the reserved pair of cachelines at the end of the ringbuffer but the hw reads garbage from it, you lose. tail &= size - 1; is a nice description of how the hw works that is suitable for inlining, with all the magic in begin(). The goal is to remove the duplicated logic from intel_lrc.c, use requests completely, and remove the dri1 hangover. To repeat what I said last time: http://cgit.freedesktop.org/~ickle/linux-2.6/tree/drivers/gpu/drm/i915/intel_ringbuffer.c?h=requests#n2447 is where I want us to go, a single piece of logic for ring management. -Chris -- Chris Wilson, Intel Open Source Technology Centre _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx