• Chris Wilson's avatar
    drm/i915: Only free the oldest stale object before a fresh allocation · 87701b4b
    Chris Wilson authored
    Inspired by Tvrtko's critique of the reaping of the stale contexts
    before allocating a new one, also limit the freed object reaping to the
    oldest stale object before allocating a fresh object. Unlike contexts,
    objects may have radically different sizes of backing storage, but
    similar to contexts, while we want to prevent starvation due to
    excessive freed lists, we also do not want to delay fresh allocations
    for too long. Only freeing the oldest on the freed object list before
    each allocation is a reasonable compromise.
    
    v2: Only a single consumer of llist_del_first() is allowed (although
    multiple llist_add are still allowed in parallel). Unlike
    i915_gem_context, i915_gem_flush_free_objects() is itself not serialized
    and so we need to add our own spinlock. Otherwise KASAN eventually spots
    a use-after-free for the race on *first->next.
    Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
    Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
    Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> #v1
    Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20171013202621.7276-8-chris@chris-wilson.co.uk
    87701b4b
i915_gem.c 148 KB