static int ttm_bo_man_get_node(struct ttm_buffer_object *bo, struct ttm_mem_type_manager *man, struct ttm_placement *placement, struct ttm_mem_reg *mem, struct drm_mm_node **node) { struct ttm_bo_global *glob = bo->glob; unsigned long lpfn; int ret; lpfn = placement->lpfn; if (!lpfn) lpfn = man->size; *node = NULL; do { ret = drm_mm_pre_get(&man->manager); if (unlikely(ret)) return ret; spin_lock(&glob->lru_lock); *node = drm_mm_search_free_in_range(&man->manager, mem->num_pages, mem->page_alignment, placement->fpfn, lpfn, 1); if (unlikely(*node == NULL)) { spin_unlock(&glob->lru_lock); return 0; } *node = drm_mm_get_block_atomic_range(*node, mem->num_pages, mem->page_alignment, placement->fpfn, lpfn); spin_unlock(&glob->lru_lock); } while (*node == NULL); return 0; }
static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man, struct ttm_buffer_object *bo, struct ttm_placement *placement, struct ttm_mem_reg *mem) { struct ttm_range_manager *rman = (struct ttm_range_manager *) man->priv; struct drm_mm *mm = &rman->mm; struct drm_mm_node *node = NULL; unsigned long lpfn; int ret; lpfn = placement->lpfn; if (!lpfn) lpfn = man->size; do { ret = drm_mm_pre_get(mm); if (unlikely(ret)) return ret; spin_lock(&rman->lock); node = drm_mm_search_free_in_range(mm, mem->num_pages, mem->page_alignment, placement->fpfn, lpfn, DRM_MM_SEARCH_BEST); if (unlikely(node == NULL)) { spin_unlock(&rman->lock); return 0; } node = drm_mm_get_block_atomic_range(node, mem->num_pages, mem->page_alignment, placement->fpfn, lpfn); spin_unlock(&rman->lock); } while (node == NULL); mem->mm_node = node; mem->start = node->start; return 0; }