diff options
author | Eric Anholt <eric@anholt.net> | 2016-07-19 14:32:44 -0400 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2016-08-19 22:16:40 -0400 |
commit | ece7267dccf0e9e08cb6e8dc6b7ad2be9c4eb444 (patch) | |
tree | 62578e11c87a125a6a11c96a10e3b6df7db74f13 | |
parent | d5fb46e0e3b7e49ee83ba92efc3ab4e1a545ecc1 (diff) |
drm/vc4: Use drm_malloc_ab to fix large rendering jobs.
If you exceeded the size that kmalloc would return, you'd get a dmesg
warning and a return from the job submit. We can handle much
allocations with vmalloc, and drm_malloc_ab makes that decision.
Fixes failure in piglit's scissor-many.
Signed-off-by: Eric Anholt <eric@anholt.net>
-rw-r--r-- | drivers/gpu/drm/vc4/vc4_gem.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c index 62df61f9ac24..bfd1b5280ff3 100644 --- a/drivers/gpu/drm/vc4/vc4_gem.c +++ b/drivers/gpu/drm/vc4/vc4_gem.c | |||
@@ -534,8 +534,8 @@ vc4_cl_lookup_bos(struct drm_device *dev, | |||
534 | return -EINVAL; | 534 | return -EINVAL; |
535 | } | 535 | } |
536 | 536 | ||
537 | exec->bo = kcalloc(exec->bo_count, sizeof(struct drm_gem_cma_object *), | 537 | exec->bo = drm_calloc_large(exec->bo_count, |
538 | GFP_KERNEL); | 538 | sizeof(struct drm_gem_cma_object *)); |
539 | if (!exec->bo) { | 539 | if (!exec->bo) { |
540 | DRM_ERROR("Failed to allocate validated BO pointers\n"); | 540 | DRM_ERROR("Failed to allocate validated BO pointers\n"); |
541 | return -ENOMEM; | 541 | return -ENOMEM; |
@@ -608,7 +608,7 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec) | |||
608 | * read the contents back for validation, and I think the | 608 | * read the contents back for validation, and I think the |
609 | * bo->vaddr is uncached access. | 609 | * bo->vaddr is uncached access. |
610 | */ | 610 | */ |
611 | temp = kmalloc(temp_size, GFP_KERNEL); | 611 | temp = drm_malloc_ab(temp_size, 1); |
612 | if (!temp) { | 612 | if (!temp) { |
613 | DRM_ERROR("Failed to allocate storage for copying " | 613 | DRM_ERROR("Failed to allocate storage for copying " |
614 | "in bin/render CLs.\n"); | 614 | "in bin/render CLs.\n"); |
@@ -675,7 +675,7 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec) | |||
675 | ret = vc4_validate_shader_recs(dev, exec); | 675 | ret = vc4_validate_shader_recs(dev, exec); |
676 | 676 | ||
677 | fail: | 677 | fail: |
678 | kfree(temp); | 678 | drm_free_large(temp); |
679 | return ret; | 679 | return ret; |
680 | } | 680 | } |
681 | 681 | ||
@@ -688,7 +688,7 @@ vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec) | |||
688 | if (exec->bo) { | 688 | if (exec->bo) { |
689 | for (i = 0; i < exec->bo_count; i++) | 689 | for (i = 0; i < exec->bo_count; i++) |
690 | drm_gem_object_unreference_unlocked(&exec->bo[i]->base); | 690 | drm_gem_object_unreference_unlocked(&exec->bo[i]->base); |
691 | kfree(exec->bo); | 691 | drm_free_large(exec->bo); |
692 | } | 692 | } |
693 | 693 | ||
694 | while (!list_empty(&exec->unref_list)) { | 694 | while (!list_empty(&exec->unref_list)) { |