• Oscar Mateo's avatar
    drm/i915/bdw: Pin the context backing objects to GGTT on-demand · dcb4c12a
    Oscar Mateo authored
    Up until now, we have pinned every logical ring context backing object
    during creation, and left it pinned until destruction. This made my life
    easier, but it's a harmful thing to do, because we cause fragmentation
    of the GGTT (and, eventually, we would run out of space).
    
    This patch makes the pinning on-demand: the backing objects of the two
    contexts that are written to the ELSP are pinned right before submission
    and unpinned once the hardware is done with them. The only context that
    is still pinned regardless is the global default one, so that the HWS can
    still be accessed in the same way (ring->status_page).
    
    v2: In the early version of this patch, we were pinning the context as
    we put it into the ELSP: on the one hand, this is very efficient because
    only a maximum two contexts are pinned at any given time, but on the other
    hand, we cannot really pin in interrupt time :(
    
    v3: Use a mutex rather than atomic_t to protect pin count to avoid races.
    Do not unpin default context in free_request.
    
    v4: Break out pin and unpin into functions.  Fix style problems reported
    by checkpatch
    
    v5: Remove unpin_lock as all pinning and unpinning is done with the struct
    mutex already locked.  Add WARN_ONs to make sure this is the case in future.
    
    Issue: VIZ-4277
    Signed-off-by: default avatarOscar Mateo <oscar.mateo@intel.com>
    Signed-off-by: default avatarThomas Daniel <thomas.daniel@intel.com>
    Reviewed-by: default avatarAkash Goel <akash.goels@gmail.com>
    Reviewed-by: Deepak S<deepak.s@linux.intel.com>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    dcb4c12a
intel_lrc.c 55.5 KB