diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2010-07-02 10:02:15 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2010-07-06 22:28:35 -0400 |
commit | 7a6b2896f261894dde287d3faefa4b432cddca53 (patch) | |
tree | 3d3cef52a85a26f59d23a40e7317cdd2585126d0 | |
parent | d1024ce91ff4c2c4ccbf692d204c71cbf215157a (diff) |
drm_mm: extract check_free_mm_node
There are already two copies of this logic. And the new scanning
stuff will add some more. So extract it into a small helper
function.
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Acked-by: Thomas Hellstrom <thellstrom@vmwgfx.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r-- | drivers/gpu/drm/drm_mm.c | 71 |
1 files changed, 34 insertions, 37 deletions
diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c index d2267ffd2b7a..fd86a6c13aac 100644 --- a/drivers/gpu/drm/drm_mm.c +++ b/drivers/gpu/drm/drm_mm.c | |||
@@ -283,6 +283,27 @@ void drm_mm_put_block(struct drm_mm_node *cur) | |||
283 | 283 | ||
284 | EXPORT_SYMBOL(drm_mm_put_block); | 284 | EXPORT_SYMBOL(drm_mm_put_block); |
285 | 285 | ||
286 | static int check_free_mm_node(struct drm_mm_node *entry, unsigned long size, | ||
287 | unsigned alignment) | ||
288 | { | ||
289 | unsigned wasted = 0; | ||
290 | |||
291 | if (entry->size < size) | ||
292 | return 0; | ||
293 | |||
294 | if (alignment) { | ||
295 | register unsigned tmp = entry->start % alignment; | ||
296 | if (tmp) | ||
297 | wasted = alignment - tmp; | ||
298 | } | ||
299 | |||
300 | if (entry->size >= size + wasted) { | ||
301 | return 1; | ||
302 | } | ||
303 | |||
304 | return 0; | ||
305 | } | ||
306 | |||
286 | struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm, | 307 | struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm, |
287 | unsigned long size, | 308 | unsigned long size, |
288 | unsigned alignment, int best_match) | 309 | unsigned alignment, int best_match) |
@@ -290,30 +311,20 @@ struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm, | |||
290 | struct drm_mm_node *entry; | 311 | struct drm_mm_node *entry; |
291 | struct drm_mm_node *best; | 312 | struct drm_mm_node *best; |
292 | unsigned long best_size; | 313 | unsigned long best_size; |
293 | unsigned wasted; | ||
294 | 314 | ||
295 | best = NULL; | 315 | best = NULL; |
296 | best_size = ~0UL; | 316 | best_size = ~0UL; |
297 | 317 | ||
298 | list_for_each_entry(entry, &mm->free_stack, free_stack) { | 318 | list_for_each_entry(entry, &mm->free_stack, free_stack) { |
299 | wasted = 0; | 319 | if (!check_free_mm_node(entry, size, alignment)) |
300 | |||
301 | if (entry->size < size) | ||
302 | continue; | 320 | continue; |
303 | 321 | ||
304 | if (alignment) { | 322 | if (!best_match) |
305 | register unsigned tmp = entry->start % alignment; | 323 | return entry; |
306 | if (tmp) | ||
307 | wasted += alignment - tmp; | ||
308 | } | ||
309 | 324 | ||
310 | if (entry->size >= size + wasted) { | 325 | if (entry->size < best_size) { |
311 | if (!best_match) | 326 | best = entry; |
312 | return entry; | 327 | best_size = entry->size; |
313 | if (entry->size < best_size) { | ||
314 | best = entry; | ||
315 | best_size = entry->size; | ||
316 | } | ||
317 | } | 328 | } |
318 | } | 329 | } |
319 | 330 | ||
@@ -331,37 +342,23 @@ struct drm_mm_node *drm_mm_search_free_in_range(const struct drm_mm *mm, | |||
331 | struct drm_mm_node *entry; | 342 | struct drm_mm_node *entry; |
332 | struct drm_mm_node *best; | 343 | struct drm_mm_node *best; |
333 | unsigned long best_size; | 344 | unsigned long best_size; |
334 | unsigned wasted; | ||
335 | 345 | ||
336 | best = NULL; | 346 | best = NULL; |
337 | best_size = ~0UL; | 347 | best_size = ~0UL; |
338 | 348 | ||
339 | list_for_each_entry(entry, &mm->free_stack, free_stack) { | 349 | list_for_each_entry(entry, &mm->free_stack, free_stack) { |
340 | wasted = 0; | 350 | if (entry->start > end || (entry->start+entry->size) < start) |
341 | |||
342 | if (entry->size < size) | ||
343 | continue; | 351 | continue; |
344 | 352 | ||
345 | if (entry->start > end || (entry->start+entry->size) < start) | 353 | if (!check_free_mm_node(entry, size, alignment)) |
346 | continue; | 354 | continue; |
347 | 355 | ||
348 | if (entry->start < start) | 356 | if (!best_match) |
349 | wasted += start - entry->start; | 357 | return entry; |
350 | 358 | ||
351 | if (alignment) { | 359 | if (entry->size < best_size) { |
352 | register unsigned tmp = (entry->start + wasted) % alignment; | 360 | best = entry; |
353 | if (tmp) | 361 | best_size = entry->size; |
354 | wasted += alignment - tmp; | ||
355 | } | ||
356 | |||
357 | if (entry->size >= size + wasted && | ||
358 | (entry->start + wasted + size) <= end) { | ||
359 | if (!best_match) | ||
360 | return entry; | ||
361 | if (entry->size < best_size) { | ||
362 | best = entry; | ||
363 | best_size = entry->size; | ||
364 | } | ||
365 | } | 362 | } |
366 | } | 363 | } |
367 | 364 | ||