• Paulo Zanoni's avatar
    drm/i915: use a single intel_fbc_work struct · 128d7356
    Paulo Zanoni authored
    This was already on my TODO list, and was requested both by Chris and
    Ville, for different reasons. The advantages are avoiding a frequent
    malloc/free pair, and the locality of having the work structure
    embedded in dev_priv. The maximum used memory is also smaller since
    previously we could have multiple allocated intel_fbc_work structs at
    the same time, and now we'll always have a single one - the one
    embedded on dev_priv. Of course, we're now using a little more memory
    on the cases where there's nothing scheduled.
    
    The biggest challenge here is to keep everything synchronized the way
    it was before.
    
    Currently, when we try to activate FBC, we allocate a new
    intel_fbc_work structure. Then later when we conclude we must delay
    the FBC activation a little more, we allocate a new intel_fbc_work
    struct, and then adjust dev_priv->fbc.fbc_work to point to the new
    struct. So when the old work runs - at intel_fbc_work_fn() - it will
    check that dev_priv->fbc.fbc_work points to something else, so it does
    nothing. Everything is also protected by fbc.lock.
    
    Just cancelling the old delayed work doesn't work because we might
    just cancel it after the work function already started to run, but
    while it is still waiting to grab fbc.lock. That's why we use the
    "dev_priv->fbc.fbc_work == work" check described in the paragraph
    above.
    
    So now that we have a single work struct we have to introduce a new
    way to synchronize everything. So we're making the work function a
    normal work instead of a delayed work, and it will be responsible for
    sleeping the appropriate amount of time itself. This way, after it
    wakes up it can grab the lock, ask "were we delayed or cancelled?" and
    then go back to sleep, enable FBC or give up.
    
    v2:
      - Spelling fixes.
      - Rebase after changing the patch order.
      - Fix ms/jiffies confusion.
    
    Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> (v1)
    Signed-off-by: default avatarPaulo Zanoni <paulo.r.zanoni@intel.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/
    128d7356
i915_drv.h 107 KB