• Chris Wilson's avatar
    drm/i915/gem: Unpin idle contexts from kswapd reclaim · 09137e94
    Chris Wilson authored
    We removed retiring requests from the shrinker in order to decouple the
    mutexes from reclaim in preparation for unravelling the struct_mutex.
    The impact of not retiring is that we are much less agressive in making
    global objects available for shrinking, as such objects remain pinned
    until they are flushed by a heartbeat pulse following the last retired
    request along their timeline. In order to ensure that pulse occurs in
    time for memory reclamation, we should kick it from kswapd.
    
    The catch is that we have added some flush_work() into the retirement
    phase (to ensure that we reach a global idle in a timely manner), but
    these flush_work() are not eligible (i.e do not belong to WQ_MEM_RELCAIM)
    for use from inside kswapd. To avoid flushing those workqueues, we teach
    the retirer not to do so unless we are actually waiting, and only do the
    plain retire from inside the shrinker.
    
    Note that for execlists, we already retire completed contexts as they
    are scheduled out, so it should not be keeping global state
    unnecessarily pinned. The legacy ringbuffer however...
    
    References: 9e953980 ("drm/i915: Remove waiting & retiring from shrinker paths")
    Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
    Reviewed-by: default avatarMatthew Auld <matthew.auld@intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20200708173748.32734-1-chris@chris-wilson.co.uk
    09137e94
intel_gt_requests.c 6.06 KB