lkml.org 
[lkml]   [2013]   [Dec]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.10 094/173] drm/ttm: Fix memory type compatibility check
    Date
    3.10-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Thomas Hellstrom <thellstrom@vmware.com>

    commit 59c8e66378fb78adbcd05f0d09783dde6fef282b upstream.

    Also check the busy placements before deciding to move a buffer object.
    Failing to do this may result in a completely unneccessary move within a
    single memory type.

    Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
    Reviewed-by: Jakob Bornecrantz <jakob@vmware.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/gpu/drm/ttm/ttm_bo.c | 32 ++++++++++++++++++++------------
    1 file changed, 20 insertions(+), 12 deletions(-)

    --- a/drivers/gpu/drm/ttm/ttm_bo.c
    +++ b/drivers/gpu/drm/ttm/ttm_bo.c
    @@ -1153,24 +1153,32 @@ out_unlock:
    return ret;
    }

    -static int ttm_bo_mem_compat(struct ttm_placement *placement,
    - struct ttm_mem_reg *mem)
    +static bool ttm_bo_mem_compat(struct ttm_placement *placement,
    + struct ttm_mem_reg *mem,
    + uint32_t *new_flags)
    {
    int i;

    if (mem->mm_node && placement->lpfn != 0 &&
    (mem->start < placement->fpfn ||
    mem->start + mem->num_pages > placement->lpfn))
    - return -1;
    + return false;

    for (i = 0; i < placement->num_placement; i++) {
    - if ((placement->placement[i] & mem->placement &
    - TTM_PL_MASK_CACHING) &&
    - (placement->placement[i] & mem->placement &
    - TTM_PL_MASK_MEM))
    - return i;
    + *new_flags = placement->placement[i];
    + if ((*new_flags & mem->placement & TTM_PL_MASK_CACHING) &&
    + (*new_flags & mem->placement & TTM_PL_MASK_MEM))
    + return true;
    }
    - return -1;
    +
    + for (i = 0; i < placement->num_busy_placement; i++) {
    + *new_flags = placement->busy_placement[i];
    + if ((*new_flags & mem->placement & TTM_PL_MASK_CACHING) &&
    + (*new_flags & mem->placement & TTM_PL_MASK_MEM))
    + return true;
    + }
    +
    + return false;
    }

    int ttm_bo_validate(struct ttm_buffer_object *bo,
    @@ -1179,6 +1187,7 @@ int ttm_bo_validate(struct ttm_buffer_ob
    bool no_wait_gpu)
    {
    int ret;
    + uint32_t new_flags;

    BUG_ON(!ttm_bo_is_reserved(bo));
    /* Check that range is valid */
    @@ -1189,8 +1198,7 @@ int ttm_bo_validate(struct ttm_buffer_ob
    /*
    * Check whether we need to move buffer.
    */
    - ret = ttm_bo_mem_compat(placement, &bo->mem);
    - if (ret < 0) {
    + if (!ttm_bo_mem_compat(placement, &bo->mem, &new_flags)) {
    ret = ttm_bo_move_buffer(bo, placement, interruptible,
    no_wait_gpu);
    if (ret)
    @@ -1200,7 +1208,7 @@ int ttm_bo_validate(struct ttm_buffer_ob
    * Use the access and other non-mapping-related flag bits from
    * the compatible memory placement flags to the active flags
    */
    - ttm_flag_masked(&bo->mem.placement, placement->placement[ret],
    + ttm_flag_masked(&bo->mem.placement, new_flags,
    ~TTM_PL_MASK_MEMTYPE);
    }
    /*



    \
     
     \ /
      Last update: 2013-12-03 08:01    [W:4.062 / U:0.964 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site