On Sun, Aug 04, 2013 at 10:20:54PM -0400, Rob Clark wrote:
On Sun, Aug 4, 2013 at 1:34 PM, Daniel Vetter daniel@ffwll.ch wrote:
On Thu, Aug 1, 2013 at 1:23 AM, Rob Clark robdclark@gmail.com wrote:
A small helper to queue up work to do, from workqueue context, after a flip. Typically useful to defer unreffing buffers that may be read by the display controller until vblank.
Signed-off-by: Rob Clark robdclark@gmail.com
I've re-inventing the same wheel three times in as many drivers (omapdrm, tilcdc, and in upcoming msm driver I need two of 'em). I guess it is time to helper-up.
I'll update omapdrm and tilcdc to use this as well, but I figured I'd send an RFC first in case anyone wants to get their bikeshed on. If there are other drivers that could use this, and are straightforward to convert over, let me know and I can update them as well.
One thing drm/i915 needs is to be able to flush the workqueue (to make sure we don't pile up giant amounts of buffers waiting to be unpinned and so temporarily leak a bit of memory). So some way to synchronously flush out flip functions would be required (and make sure all that have been queued up to that point are really completed). But at that point a separate workqueue sounds simpler, so I wonder a bit what this gains us? At roughly 50Hz flip work functions aren't really that performance critical imo ...
you could of course do separate or same workqueue from your main render-complete workqueue, or flush the workqueue at whatever point you want.. I suppose if you are queuing from a context that is safe to sleep you could have a blocking-queue function. I haven't really needed anything like that so far, but feel free to extend the flip-work helper however you need to be useful for i915. (Or point me at the bits in i915 that do something similar and I'll have a think about how to convert that)
queue_work in do_intel_finish_page_flip and flush_work in intel_crtc_page_flip is the relevant code. The former is called from irq context. -Daniel