|
@@ -1020,29 +1020,17 @@ out_unlock:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-bool ttm_bo_mem_compat(struct ttm_placement *placement,
|
|
|
- struct ttm_mem_reg *mem,
|
|
|
- uint32_t *new_flags)
|
|
|
+static bool ttm_bo_places_compat(const struct ttm_place *places,
|
|
|
+ unsigned num_placement,
|
|
|
+ struct ttm_mem_reg *mem,
|
|
|
+ uint32_t *new_flags)
|
|
|
{
|
|
|
- int i;
|
|
|
+ unsigned i;
|
|
|
|
|
|
- for (i = 0; i < placement->num_placement; i++) {
|
|
|
- const struct ttm_place *heap = &placement->placement[i];
|
|
|
- if (mem->mm_node &&
|
|
|
- (mem->start < heap->fpfn ||
|
|
|
- (heap->lpfn != 0 && (mem->start + mem->num_pages) > heap->lpfn)))
|
|
|
- continue;
|
|
|
+ for (i = 0; i < num_placement; i++) {
|
|
|
+ const struct ttm_place *heap = &places[i];
|
|
|
|
|
|
- *new_flags = heap->flags;
|
|
|
- if ((*new_flags & mem->placement & TTM_PL_MASK_CACHING) &&
|
|
|
- (*new_flags & mem->placement & TTM_PL_MASK_MEM))
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- for (i = 0; i < placement->num_busy_placement; i++) {
|
|
|
- const struct ttm_place *heap = &placement->busy_placement[i];
|
|
|
- if (mem->mm_node &&
|
|
|
- (mem->start < heap->fpfn ||
|
|
|
+ if (mem->mm_node && (mem->start < heap->fpfn ||
|
|
|
(heap->lpfn != 0 && (mem->start + mem->num_pages) > heap->lpfn)))
|
|
|
continue;
|
|
|
|
|
@@ -1051,6 +1039,23 @@ bool ttm_bo_mem_compat(struct ttm_placement *placement,
|
|
|
(*new_flags & mem->placement & TTM_PL_MASK_MEM))
|
|
|
return true;
|
|
|
}
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
+bool ttm_bo_mem_compat(struct ttm_placement *placement,
|
|
|
+ struct ttm_mem_reg *mem,
|
|
|
+ uint32_t *new_flags)
|
|
|
+{
|
|
|
+ if (ttm_bo_places_compat(placement->placement, placement->num_placement,
|
|
|
+ mem, new_flags))
|
|
|
+ return true;
|
|
|
+
|
|
|
+ if ((placement->busy_placement != placement->placement ||
|
|
|
+ placement->num_busy_placement > placement->num_placement) &&
|
|
|
+ ttm_bo_places_compat(placement->busy_placement,
|
|
|
+ placement->num_busy_placement,
|
|
|
+ mem, new_flags))
|
|
|
+ return true;
|
|
|
|
|
|
return false;
|
|
|
}
|