aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2016-12-22 03:36:39 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2016-12-28 07:51:20 -0500
commitadb040b86bc290d3d8a339ad8e91c96a9f506095 (patch)
treedf38764a3551e292f85f521bb363cceabad11e8e
parent3db93756b501e5f0a3951c79cfa9ed43c26d3455 (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.c166
-rw-r--r--include/drm/drm_mm.h90
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
95static 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);
100static struct drm_mm_node *drm_mm_search_free_in_range_generic(const struct drm_mm *mm, 95static 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)
360EXPORT_SYMBOL(drm_mm_reserve_node); 359EXPORT_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 */
377int 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}
396EXPORT_SYMBOL(drm_mm_insert_node_generic);
397
398static 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}
503EXPORT_SYMBOL(drm_mm_insert_node_in_range_generic); 401EXPORT_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
561static 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
603static struct drm_mm_node *drm_mm_search_free_in_range_generic(const struct drm_mm *mm, 459static 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 */
287int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node); 287int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node);
288
289int 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 */
312static 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
322int drm_mm_insert_node_in_range_generic(struct drm_mm *mm, 288int 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 */
344static inline int
345drm_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 */
373static 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
362void drm_mm_remove_node(struct drm_mm_node *node); 384void drm_mm_remove_node(struct drm_mm_node *node);
363void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new); 385void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new);
364void drm_mm_init(struct drm_mm *mm, u64 start, u64 size); 386void drm_mm_init(struct drm_mm *mm, u64 start, u64 size);