• Christian König's avatar
    drm/radeon: multiple ring allocator v3 · c3b7fe8b
    Christian König authored
    A startover with a new idea for a multiple ring allocator.
    Should perform as well as a normal ring allocator as long
    as only one ring does somthing, but falls back to a more
    complex algorithm if more complex things start to happen.
    
    We store the last allocated bo in last, we always try to allocate
    after the last allocated bo. Principle is that in a linear GPU ring
    progression was is after last is the oldest bo we allocated and thus
    the first one that should no longer be in use by the GPU.
    
    If it's not the case we skip over the bo after last to the closest
    done bo if such one exist. If none exist and we are not asked to
    block we report failure to allocate.
    
    If we are asked to block we wait on all the oldest fence of all
    rings. We just wait for any of those fence to complete.
    
    v2: We need to be able to let hole point to the list_head, otherwise
        try free will never free the first allocation of the list. Also
        stop calling radeon_fence_signalled more than necessary.
    
    v3: Don't free allocations without considering them as a hole,
        otherwise we might lose holes. Also return ENOMEM instead of ENOENT
        when running out of fences to wait for. Limit the number of holes
        we try for each ring to 3.
    Signed-off-by: default avatarChristian König <deathsimple@vodafone.de>
    Signed-off-by: default avatarJerome Glisse <jglisse@redhat.com>
    Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
    c3b7fe8b
radeon_sa.c 10.2 KB