diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2016-12-22 03:36:39 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2016-12-28 07:51:20 -0500 |
commit | adb040b86bc290d3d8a339ad8e91c96a9f506095 (patch) | |
tree | df38764a3551e292f85f521bb363cceabad11e8e | |
parent | 3db93756b501e5f0a3951c79cfa9ed43c26d3455 (diff) |
drm: Use drm_mm_insert_node_in_range_generic() for everyone
Remove a superfluous helper as drm_mm_insert_node is equivalent to
insert_node_in_range with a range of [0, U64_MAX].
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/20161222083641.2691-37-chris@chris-wilson.co.uk
-rw-r--r-- | drivers/gpu/drm/drm_mm.c | 166 | ||||
-rw-r--r-- | include/drm/drm_mm.h | 90 |
2 files changed, 67 insertions, 189 deletions
diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c index e279ac7c7aaf..58a7e3bbe130 100644 --- a/drivers/gpu/drm/drm_mm.c +++ b/drivers/gpu/drm/drm_mm.c | |||
@@ -92,11 +92,6 @@ | |||
92 | * some basic allocator dumpers for debugging. | 92 | * some basic allocator dumpers for debugging. |
93 | */ | 93 | */ |
94 | 94 | ||
95 | static struct drm_mm_node *drm_mm_search_free_generic(const struct drm_mm *mm, | ||
96 | u64 size, | ||
97 | u64 alignment, | ||
98 | unsigned long color, | ||
99 | enum drm_mm_search_flags flags); | ||
100 | static struct drm_mm_node *drm_mm_search_free_in_range_generic(const struct drm_mm *mm, | 95 | static struct drm_mm_node *drm_mm_search_free_in_range_generic(const struct drm_mm *mm, |
101 | u64 size, | 96 | u64 size, |
102 | u64 alignment, | 97 | u64 alignment, |
@@ -230,6 +225,7 @@ static void drm_mm_insert_helper(struct drm_mm_node *hole_node, | |||
230 | struct drm_mm_node *node, | 225 | struct drm_mm_node *node, |
231 | u64 size, u64 alignment, | 226 | u64 size, u64 alignment, |
232 | unsigned long color, | 227 | unsigned long color, |
228 | u64 range_start, u64 range_end, | ||
233 | enum drm_mm_allocator_flags flags) | 229 | enum drm_mm_allocator_flags flags) |
234 | { | 230 | { |
235 | struct drm_mm *mm = hole_node->mm; | 231 | struct drm_mm *mm = hole_node->mm; |
@@ -238,11 +234,14 @@ static void drm_mm_insert_helper(struct drm_mm_node *hole_node, | |||
238 | u64 adj_start = hole_start; | 234 | u64 adj_start = hole_start; |
239 | u64 adj_end = hole_end; | 235 | u64 adj_end = hole_end; |
240 | 236 | ||
241 | DRM_MM_BUG_ON(node->allocated); | 237 | DRM_MM_BUG_ON(!drm_mm_hole_follows(hole_node) || node->allocated); |
242 | 238 | ||
243 | if (mm->color_adjust) | 239 | if (mm->color_adjust) |
244 | mm->color_adjust(hole_node, color, &adj_start, &adj_end); | 240 | mm->color_adjust(hole_node, color, &adj_start, &adj_end); |
245 | 241 | ||
242 | adj_start = max(adj_start, range_start); | ||
243 | adj_end = min(adj_end, range_end); | ||
244 | |||
246 | if (flags & DRM_MM_CREATE_TOP) | 245 | if (flags & DRM_MM_CREATE_TOP) |
247 | adj_start = adj_end - size; | 246 | adj_start = adj_end - size; |
248 | 247 | ||
@@ -258,9 +257,6 @@ static void drm_mm_insert_helper(struct drm_mm_node *hole_node, | |||
258 | } | 257 | } |
259 | } | 258 | } |
260 | 259 | ||
261 | DRM_MM_BUG_ON(adj_start < hole_start); | ||
262 | DRM_MM_BUG_ON(adj_end > hole_end); | ||
263 | |||
264 | if (adj_start == hole_start) { | 260 | if (adj_start == hole_start) { |
265 | hole_node->hole_follows = 0; | 261 | hole_node->hole_follows = 0; |
266 | list_del(&hole_node->hole_stack); | 262 | list_del(&hole_node->hole_stack); |
@@ -276,7 +272,10 @@ static void drm_mm_insert_helper(struct drm_mm_node *hole_node, | |||
276 | 272 | ||
277 | drm_mm_interval_tree_add_node(hole_node, node); | 273 | drm_mm_interval_tree_add_node(hole_node, node); |
278 | 274 | ||
275 | DRM_MM_BUG_ON(node->start < range_start); | ||
276 | DRM_MM_BUG_ON(node->start < adj_start); | ||
279 | DRM_MM_BUG_ON(node->start + node->size > adj_end); | 277 | DRM_MM_BUG_ON(node->start + node->size > adj_end); |
278 | DRM_MM_BUG_ON(node->start + node->size > range_end); | ||
280 | 279 | ||
281 | node->hole_follows = 0; | 280 | node->hole_follows = 0; |
282 | if (__drm_mm_hole_node_start(node) < hole_end) { | 281 | if (__drm_mm_hole_node_start(node) < hole_end) { |
@@ -360,107 +359,6 @@ int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node) | |||
360 | EXPORT_SYMBOL(drm_mm_reserve_node); | 359 | EXPORT_SYMBOL(drm_mm_reserve_node); |
361 | 360 | ||
362 | /** | 361 | /** |
363 | * drm_mm_insert_node_generic - search for space and insert @node | ||
364 | * @mm: drm_mm to allocate from | ||
365 | * @node: preallocate node to insert | ||
366 | * @size: size of the allocation | ||
367 | * @alignment: alignment of the allocation | ||
368 | * @color: opaque tag value to use for this node | ||
369 | * @sflags: flags to fine-tune the allocation search | ||
370 | * @aflags: flags to fine-tune the allocation behavior | ||
371 | * | ||
372 | * The preallocated node must be cleared to 0. | ||
373 | * | ||
374 | * Returns: | ||
375 | * 0 on success, -ENOSPC if there's no suitable hole. | ||
376 | */ | ||
377 | int drm_mm_insert_node_generic(struct drm_mm *mm, struct drm_mm_node *node, | ||
378 | u64 size, u64 alignment, | ||
379 | unsigned long color, | ||
380 | enum drm_mm_search_flags sflags, | ||
381 | enum drm_mm_allocator_flags aflags) | ||
382 | { | ||
383 | struct drm_mm_node *hole_node; | ||
384 | |||
385 | if (WARN_ON(size == 0)) | ||
386 | return -EINVAL; | ||
387 | |||
388 | hole_node = drm_mm_search_free_generic(mm, size, alignment, | ||
389 | color, sflags); | ||
390 | if (!hole_node) | ||
391 | return -ENOSPC; | ||
392 | |||
393 | drm_mm_insert_helper(hole_node, node, size, alignment, color, aflags); | ||
394 | return 0; | ||
395 | } | ||
396 | EXPORT_SYMBOL(drm_mm_insert_node_generic); | ||
397 | |||
398 | static void drm_mm_insert_helper_range(struct drm_mm_node *hole_node, | ||
399 | struct drm_mm_node *node, | ||
400 | u64 size, u64 alignment, | ||
401 | unsigned long color, | ||
402 | u64 start, u64 end, | ||
403 | enum drm_mm_allocator_flags flags) | ||
404 | { | ||
405 | struct drm_mm *mm = hole_node->mm; | ||
406 | u64 hole_start = drm_mm_hole_node_start(hole_node); | ||
407 | u64 hole_end = drm_mm_hole_node_end(hole_node); | ||
408 | u64 adj_start = hole_start; | ||
409 | u64 adj_end = hole_end; | ||
410 | |||
411 | DRM_MM_BUG_ON(!drm_mm_hole_follows(hole_node) || node->allocated); | ||
412 | |||
413 | if (mm->color_adjust) | ||
414 | mm->color_adjust(hole_node, color, &adj_start, &adj_end); | ||
415 | |||
416 | adj_start = max(adj_start, start); | ||
417 | adj_end = min(adj_end, end); | ||
418 | |||
419 | if (flags & DRM_MM_CREATE_TOP) | ||
420 | adj_start = adj_end - size; | ||
421 | |||
422 | if (alignment) { | ||
423 | u64 rem; | ||
424 | |||
425 | div64_u64_rem(adj_start, alignment, &rem); | ||
426 | if (rem) { | ||
427 | if (flags & DRM_MM_CREATE_TOP) | ||
428 | adj_start -= rem; | ||
429 | else | ||
430 | adj_start += alignment - rem; | ||
431 | } | ||
432 | } | ||
433 | |||
434 | if (adj_start == hole_start) { | ||
435 | hole_node->hole_follows = 0; | ||
436 | list_del(&hole_node->hole_stack); | ||
437 | } | ||
438 | |||
439 | node->start = adj_start; | ||
440 | node->size = size; | ||
441 | node->mm = mm; | ||
442 | node->color = color; | ||
443 | node->allocated = 1; | ||
444 | |||
445 | list_add(&node->node_list, &hole_node->node_list); | ||
446 | |||
447 | drm_mm_interval_tree_add_node(hole_node, node); | ||
448 | |||
449 | DRM_MM_BUG_ON(node->start < start); | ||
450 | DRM_MM_BUG_ON(node->start < adj_start); | ||
451 | DRM_MM_BUG_ON(node->start + node->size > adj_end); | ||
452 | DRM_MM_BUG_ON(node->start + node->size > end); | ||
453 | |||
454 | node->hole_follows = 0; | ||
455 | if (__drm_mm_hole_node_start(node) < hole_end) { | ||
456 | list_add(&node->hole_stack, &mm->hole_stack); | ||
457 | node->hole_follows = 1; | ||
458 | } | ||
459 | |||
460 | save_stack(node); | ||
461 | } | ||
462 | |||
463 | /** | ||
464 | * drm_mm_insert_node_in_range_generic - ranged search for space and insert @node | 362 | * drm_mm_insert_node_in_range_generic - ranged search for space and insert @node |
465 | * @mm: drm_mm to allocate from | 363 | * @mm: drm_mm to allocate from |
466 | * @node: preallocate node to insert | 364 | * @node: preallocate node to insert |
@@ -495,9 +393,9 @@ int drm_mm_insert_node_in_range_generic(struct drm_mm *mm, struct drm_mm_node *n | |||
495 | if (!hole_node) | 393 | if (!hole_node) |
496 | return -ENOSPC; | 394 | return -ENOSPC; |
497 | 395 | ||
498 | drm_mm_insert_helper_range(hole_node, node, | 396 | drm_mm_insert_helper(hole_node, node, |
499 | size, alignment, color, | 397 | size, alignment, color, |
500 | start, end, aflags); | 398 | start, end, aflags); |
501 | return 0; | 399 | return 0; |
502 | } | 400 | } |
503 | EXPORT_SYMBOL(drm_mm_insert_node_in_range_generic); | 401 | EXPORT_SYMBOL(drm_mm_insert_node_in_range_generic); |
@@ -558,48 +456,6 @@ static int check_free_hole(u64 start, u64 end, u64 size, u64 alignment) | |||
558 | return end >= start + size; | 456 | return end >= start + size; |
559 | } | 457 | } |
560 | 458 | ||
561 | static struct drm_mm_node *drm_mm_search_free_generic(const struct drm_mm *mm, | ||
562 | u64 size, | ||
563 | u64 alignment, | ||
564 | unsigned long color, | ||
565 | enum drm_mm_search_flags flags) | ||
566 | { | ||
567 | struct drm_mm_node *entry; | ||
568 | struct drm_mm_node *best; | ||
569 | u64 adj_start; | ||
570 | u64 adj_end; | ||
571 | u64 best_size; | ||
572 | |||
573 | DRM_MM_BUG_ON(mm->scan_active); | ||
574 | |||
575 | best = NULL; | ||
576 | best_size = ~0UL; | ||
577 | |||
578 | __drm_mm_for_each_hole(entry, mm, adj_start, adj_end, | ||
579 | flags & DRM_MM_SEARCH_BELOW) { | ||
580 | u64 hole_size = adj_end - adj_start; | ||
581 | |||
582 | if (mm->color_adjust) { | ||
583 | mm->color_adjust(entry, color, &adj_start, &adj_end); | ||
584 | if (adj_end <= adj_start) | ||
585 | continue; | ||
586 | } | ||
587 | |||
588 | if (!check_free_hole(adj_start, adj_end, size, alignment)) | ||
589 | continue; | ||
590 | |||
591 | if (!(flags & DRM_MM_SEARCH_BEST)) | ||
592 | return entry; | ||
593 | |||
594 | if (hole_size < best_size) { | ||
595 | best = entry; | ||
596 | best_size = hole_size; | ||
597 | } | ||
598 | } | ||
599 | |||
600 | return best; | ||
601 | } | ||
602 | |||
603 | static struct drm_mm_node *drm_mm_search_free_in_range_generic(const struct drm_mm *mm, | 459 | static struct drm_mm_node *drm_mm_search_free_in_range_generic(const struct drm_mm *mm, |
604 | u64 size, | 460 | u64 size, |
605 | u64 alignment, | 461 | u64 alignment, |
diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h index 7da7a171d6d5..92ec5759caae 100644 --- a/include/drm/drm_mm.h +++ b/include/drm/drm_mm.h | |||
@@ -285,40 +285,6 @@ static inline u64 drm_mm_hole_node_end(const struct drm_mm_node *hole_node) | |||
285 | * Basic range manager support (drm_mm.c) | 285 | * Basic range manager support (drm_mm.c) |
286 | */ | 286 | */ |
287 | int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node); | 287 | int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node); |
288 | |||
289 | int drm_mm_insert_node_generic(struct drm_mm *mm, | ||
290 | struct drm_mm_node *node, | ||
291 | u64 size, | ||
292 | u64 alignment, | ||
293 | unsigned long color, | ||
294 | enum drm_mm_search_flags sflags, | ||
295 | enum drm_mm_allocator_flags aflags); | ||
296 | /** | ||
297 | * drm_mm_insert_node - search for space and insert @node | ||
298 | * @mm: drm_mm to allocate from | ||
299 | * @node: preallocate node to insert | ||
300 | * @size: size of the allocation | ||
301 | * @alignment: alignment of the allocation | ||
302 | * @flags: flags to fine-tune the allocation | ||
303 | * | ||
304 | * This is a simplified version of drm_mm_insert_node_generic() with @color set | ||
305 | * to 0. | ||
306 | * | ||
307 | * The preallocated node must be cleared to 0. | ||
308 | * | ||
309 | * Returns: | ||
310 | * 0 on success, -ENOSPC if there's no suitable hole. | ||
311 | */ | ||
312 | static inline int drm_mm_insert_node(struct drm_mm *mm, | ||
313 | struct drm_mm_node *node, | ||
314 | u64 size, | ||
315 | u64 alignment, | ||
316 | enum drm_mm_search_flags flags) | ||
317 | { | ||
318 | return drm_mm_insert_node_generic(mm, node, size, alignment, 0, flags, | ||
319 | DRM_MM_CREATE_DEFAULT); | ||
320 | } | ||
321 | |||
322 | int drm_mm_insert_node_in_range_generic(struct drm_mm *mm, | 288 | int drm_mm_insert_node_in_range_generic(struct drm_mm *mm, |
323 | struct drm_mm_node *node, | 289 | struct drm_mm_node *node, |
324 | u64 size, | 290 | u64 size, |
@@ -328,6 +294,7 @@ int drm_mm_insert_node_in_range_generic(struct drm_mm *mm, | |||
328 | u64 end, | 294 | u64 end, |
329 | enum drm_mm_search_flags sflags, | 295 | enum drm_mm_search_flags sflags, |
330 | enum drm_mm_allocator_flags aflags); | 296 | enum drm_mm_allocator_flags aflags); |
297 | |||
331 | /** | 298 | /** |
332 | * drm_mm_insert_node_in_range - ranged search for space and insert @node | 299 | * drm_mm_insert_node_in_range - ranged search for space and insert @node |
333 | * @mm: drm_mm to allocate from | 300 | * @mm: drm_mm to allocate from |
@@ -359,6 +326,61 @@ static inline int drm_mm_insert_node_in_range(struct drm_mm *mm, | |||
359 | DRM_MM_CREATE_DEFAULT); | 326 | DRM_MM_CREATE_DEFAULT); |
360 | } | 327 | } |
361 | 328 | ||
329 | /** | ||
330 | * drm_mm_insert_node_generic - search for space and insert @node | ||
331 | * @mm: drm_mm to allocate from | ||
332 | * @node: preallocate node to insert | ||
333 | * @size: size of the allocation | ||
334 | * @alignment: alignment of the allocation | ||
335 | * @color: opaque tag value to use for this node | ||
336 | * @sflags: flags to fine-tune the allocation search | ||
337 | * @aflags: flags to fine-tune the allocation behavior | ||
338 | * | ||
339 | * The preallocated node must be cleared to 0. | ||
340 | * | ||
341 | * Returns: | ||
342 | * 0 on success, -ENOSPC if there's no suitable hole. | ||
343 | */ | ||
344 | static inline int | ||
345 | drm_mm_insert_node_generic(struct drm_mm *mm, struct drm_mm_node *node, | ||
346 | u64 size, u64 alignment, | ||
347 | unsigned long color, | ||
348 | enum drm_mm_search_flags sflags, | ||
349 | enum drm_mm_allocator_flags aflags) | ||
350 | { | ||
351 | return drm_mm_insert_node_in_range_generic(mm, node, | ||
352 | size, alignment, 0, | ||
353 | 0, U64_MAX, | ||
354 | sflags, aflags); | ||
355 | } | ||
356 | |||
357 | /** | ||
358 | * drm_mm_insert_node - search for space and insert @node | ||
359 | * @mm: drm_mm to allocate from | ||
360 | * @node: preallocate node to insert | ||
361 | * @size: size of the allocation | ||
362 | * @alignment: alignment of the allocation | ||
363 | * @flags: flags to fine-tune the allocation | ||
364 | * | ||
365 | * This is a simplified version of drm_mm_insert_node_generic() with @color set | ||
366 | * to 0. | ||
367 | * | ||
368 | * The preallocated node must be cleared to 0. | ||
369 | * | ||
370 | * Returns: | ||
371 | * 0 on success, -ENOSPC if there's no suitable hole. | ||
372 | */ | ||
373 | static inline int drm_mm_insert_node(struct drm_mm *mm, | ||
374 | struct drm_mm_node *node, | ||
375 | u64 size, | ||
376 | u64 alignment, | ||
377 | enum drm_mm_search_flags flags) | ||
378 | { | ||
379 | return drm_mm_insert_node_generic(mm, node, | ||
380 | size, alignment, 0, | ||
381 | flags, DRM_MM_CREATE_DEFAULT); | ||
382 | } | ||
383 | |||
362 | void drm_mm_remove_node(struct drm_mm_node *node); | 384 | void drm_mm_remove_node(struct drm_mm_node *node); |
363 | void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new); | 385 | void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new); |
364 | void drm_mm_init(struct drm_mm *mm, u64 start, u64 size); | 386 | void drm_mm_init(struct drm_mm *mm, u64 start, u64 size); |