• Chris Wilson's avatar
    drm/i915/userptr: Flush cancellations before mmu-notifier invalidate returns · 393afc2c
    Chris Wilson authored
    In order to ensure that all invalidations are completed before the
    operation returns to userspace (i.e. before the munmap() syscall returns)
    we need to wait upon the outstanding operations.
    
    We are allowed to block inside the invalidate_range_start callback, and
    as struct_mutex is the inner lock with mmap_sem we can wait upon the
    struct_mutex without provoking lockdep into warning about a deadlock.
    However, we don't actually want to wait upon outstanding rendering
    whilst holding the struct_mutex if we can help it otherwise we also
    block other processes from submitting work to the GPU. So first we do a
    wait without the lock and then when we reacquire the lock, we double
    check that everything is ready for removing the invalidated pages.
    
    Finally to wait upon the outstanding unpinning tasks, we create a
    private workqueue as a means to conveniently wait upon all at once. The
    drawback is that this workqueue is per-mm, so any threads concurrently
    invalidating objects will wait upon each other. The advantage of using
    the workqueue is that we can wait in parallel for completion of
    rendering and unpinning of several objects (of particular importance if
    the process terminates with a whole mm full of objects).
    
    v2: Apply a cup of tea to the changelog.
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94699
    Testcase: igt/gem_userptr_blits/sync-unmap-cycles
    Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
    Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
    Cc: Michał Winiarski <michal.winiarski@intel.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/1459864801-28606-1-git-send-email-chris@chris-wilson.co.ukReviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
    393afc2c
i915_gem_userptr.c 22.5 KB