Skip to content

Commit

Permalink
drm/ttm: add unlocked variant of new manager put node.
Browse files Browse the repository at this point in the history
We need the unlocked variant for the new codepath introduced to fix the
race condition in master recently.

Signed-off-by: Dave Airlie <airlied@redhat.com>
  • Loading branch information
Dave Airlie committed Oct 18, 2010
1 parent b7ae505 commit c9220b0
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 3 deletions.
13 changes: 10 additions & 3 deletions drivers/gpu/drm/ttm/ttm_bo.c
Original file line number Diff line number Diff line change
Expand Up @@ -464,9 +464,7 @@ static void ttm_bo_cleanup_memtype_use(struct ttm_buffer_object *bo)
spin_lock(&glob->lru_lock);
}

if (bo->mem.mm_node) {
ttm_bo_mem_put(bo, &bo->mem);
}
ttm_bo_mem_put_locked(bo, &bo->mem);

atomic_set(&bo->reserved, 0);
wake_up_all(&bo->event_queue);
Expand Down Expand Up @@ -791,6 +789,15 @@ void ttm_bo_mem_put(struct ttm_buffer_object *bo, struct ttm_mem_reg *mem)
}
EXPORT_SYMBOL(ttm_bo_mem_put);

void ttm_bo_mem_put_locked(struct ttm_buffer_object *bo, struct ttm_mem_reg *mem)
{
struct ttm_mem_type_manager *man = &bo->bdev->man[mem->mem_type];

if (mem->mm_node)
(*man->func->put_node_locked)(man, mem);
}
EXPORT_SYMBOL(ttm_bo_mem_put_locked);

/**
* Repeatedly evict memory from the LRU for @mem_type until we create enough
* space, or we've evicted everything and there isn't enough space.
Expand Down
10 changes: 10 additions & 0 deletions drivers/gpu/drm/ttm/ttm_bo_manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,15 @@ static void ttm_bo_man_put_node(struct ttm_mem_type_manager *man,
}
}

static void ttm_bo_man_put_node_locked(struct ttm_mem_type_manager *man,
struct ttm_mem_reg *mem)
{
if (mem->mm_node) {
drm_mm_put_block(mem->mm_node);
mem->mm_node = NULL;
}
}

static int ttm_bo_man_init(struct ttm_mem_type_manager *man,
unsigned long p_size)
{
Expand Down Expand Up @@ -143,6 +152,7 @@ const struct ttm_mem_type_manager_func ttm_bo_manager_func = {
ttm_bo_man_takedown,
ttm_bo_man_get_node,
ttm_bo_man_put_node,
ttm_bo_man_put_node_locked,
ttm_bo_man_debug
};
EXPORT_SYMBOL(ttm_bo_manager_func);
4 changes: 4 additions & 0 deletions include/drm/ttm/ttm_bo_driver.h
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,8 @@ struct ttm_mem_type_manager_func {
struct ttm_mem_reg *mem);
void (*put_node)(struct ttm_mem_type_manager *man,
struct ttm_mem_reg *mem);
void (*put_node_locked)(struct ttm_mem_type_manager *man,
struct ttm_mem_reg *mem);
void (*debug)(struct ttm_mem_type_manager *man, const char *prefix);
};

Expand Down Expand Up @@ -667,6 +669,8 @@ extern int ttm_bo_mem_space(struct ttm_buffer_object *bo,

extern void ttm_bo_mem_put(struct ttm_buffer_object *bo,
struct ttm_mem_reg *mem);
extern void ttm_bo_mem_put_locked(struct ttm_buffer_object *bo,
struct ttm_mem_reg *mem);

/**
* ttm_bo_wait_for_cpu
Expand Down

0 comments on commit c9220b0

Please sign in to comment.