drm: replace drm_[cm]alloc* by kvmalloc alternatives
Subsystems (15)
PATCH 1/2 drm: replace drm_[cm]alloc* by kvmalloc alternatives
From: Michal Hocko <[email protected]>
drm_[cm]alloc* has grown their own kvmalloc with vmalloc fallback implementations. MM has grown kvmalloc* helpers in the meantime. Let's use those because it a) reduces the code and b) MM has a better idea how to implement fallbacks (e.g. do not vmalloc before kmalloc is tried with __GFP_NORETRY).
drm_calloc_large needs to get __GFP_ZERO explicitly but it is the same thing as kvmalloc_array in principle.
---
Hi,
I didn't add Reviewed-by from Chris because the original patch [1] didn't change drm_calloc_large which I have missed in that posting. This patch is the same otherwwise.
[1] http://lkml.kernel.org/r/[email protected]
include/drm/drm_mem_util.h | 31 +++---------------------------- 1 file changed, 3 insertions(+), 28 deletions(-)
include/drm/drm_mem_util.h +3 -28
@@ -31,43 +31,18 @@static __inline__void *drm_calloc_large (size_t nmemb,size_t size) { -if (size !=0 && nmemb >SIZE_MAX / size) -return NULL ; - -if (size * nmemb <=PAGE_SIZE ) -return kcalloc (nmemb, size,GFP_KERNEL ); - -return vzalloc (size * nmemb); +return kvmalloc_array (nmemb, size,GFP_KERNEL | __GFP_ZERO); }/* Modeled after cairo's malloc_ab, it's like calloc but without the zeroing. */ static __inline__void *drm_malloc_ab (size_t nmemb,size_t size) { -if (size !=0 && nmemb >SIZE_MAX / size) -return NULL ; - -if (size * nmemb <=PAGE_SIZE ) -return kmalloc (nmemb * size,GFP_KERNEL ); - -return vmalloc (size * nmemb); +return kvmalloc_array (nmemb, size,GFP_KERNEL ); }static __inline__void *drm_malloc_gfp (size_t nmemb,size_t size,gfp_t gfp) { -if (size !=0 && nmemb >SIZE_MAX / size) -return NULL ; - -if (size * nmemb <=PAGE_SIZE ) -return kmalloc (nmemb * size, gfp); - -if (gfp & __GFP_RECLAIMABLE) { -void *ptr =kmalloc (nmemb * size, - gfp | __GFP_NOWARN | __GFP_NORETRY); -if (ptr) -return ptr; - } - -return __vmalloc (size * nmemb, gfp,PAGE_KERNEL ); +return kvmalloc_array (nmemb, size, gfp); }static __inlinevoid drm_free_large (void *ptr)
Signature · 7 lines
2.11.0 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 2/2 drm: drop drm_[cm]alloc* helpers
From: Michal Hocko <[email protected]>
Now that drm_[cm]alloc* helpers are simple one line wrappers around kvmalloc_array and drm_free_large is just kvfree alias we can drop them and replace by their native forms.
This shouldn't introduce any functional change.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | 16 +++---- drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 19 ++++---- drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 7 +-- drivers/gpu/drm/drm_gem.c | 6 +-- drivers/gpu/drm/etnaviv/etnaviv_gem.c | 12 ++--- drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c | 4 +- drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 12 ++--- drivers/gpu/drm/exynos/exynos_drm_gem.c | 11 +++-- drivers/gpu/drm/i915/i915_debugfs.c | 4 +- drivers/gpu/drm/i915/i915_gem.c | 4 +- drivers/gpu/drm/i915/i915_gem_execbuffer.c | 34 +++++++------- drivers/gpu/drm/i915/i915_gem_gtt.c | 6 +-- drivers/gpu/drm/i915/i915_gem_userptr.c | 8 ++-- drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c | 12 ++--- drivers/gpu/drm/msm/msm_gem.c | 10 ++-- drivers/gpu/drm/radeon/radeon_cs.c | 11 +++-- drivers/gpu/drm/radeon/radeon_gem.c | 2 +- drivers/gpu/drm/radeon/radeon_ring.c | 4 +- drivers/gpu/drm/radeon/radeon_vm.c | 4 +- drivers/gpu/drm/ttm/ttm_tt.c | 13 +++--- drivers/gpu/drm/udl/udl_dmabuf.c | 2 +- drivers/gpu/drm/udl/udl_gem.c | 2 +- drivers/gpu/drm/vc4/vc4_gem.c | 15 +++--- drivers/gpu/drm/virtio/virtgpu_ioctl.c | 27 +++++------ include/drm/drmP.h | 1 - include/drm/drm_mem_util.h | 53 ---------------------- 26 files changed, 126 insertions(+), 173 deletions(-) delete mode 100644 include/drm/drm_mem_util.h
drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c +8 -8
@@ -96,7 +96,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,int r;unsigned long total_size =0 ; - array =drm_malloc_ab (num_entries,sizeof (struct amdgpu_bo_list_entry )); + array =kvmalloc_array (num_entries,sizeof (struct amdgpu_bo_list_entry ),GFP_KERNEL );if (!array)return -ENOMEM ;memset (array,0 , num_entries *sizeof (struct amdgpu_bo_list_entry ));
@@ -148,7 +148,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,for (i =0 ; i < list->num_entries; ++i)amdgpu_bo_unref (&list->array[i].robj); -drm_free_large (list->array); +kvfree (list->array); list->gds_obj = gds_obj; list->gws_obj = gws_obj;
@@ -163,7 +163,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev, error_free:while (i--)amdgpu_bo_unref (&array[i].robj); -drm_free_large (array); +kvfree (array);return r; }
@@ -224,7 +224,7 @@ void amdgpu_bo_list_free(struct amdgpu_bo_list *list)amdgpu_bo_unref (&list->array[i].robj);mutex_destroy (&list->lock); -drm_free_large (list->array); +kvfree (list->array);kfree (list); }
@@ -244,8 +244,8 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,int r; - info =drm_malloc_ab (args->in.bo_number, -sizeof (struct drm_amdgpu_bo_list_entry )); + info =kvmalloc_array (args->in.bo_number, +sizeof (struct drm_amdgpu_bo_list_entry ),GFP_KERNEL );if (!info)return -ENOMEM ;
@@ -311,11 +311,11 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,memset (args,0 ,sizeof (*args)); args->out.list_handle = handle; -drm_free_large (info); +kvfree (info);return 0 ; error_free: -drm_free_large (info); +kvfree (info);return r; }
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +10 -9
@@ -194,7 +194,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) size = p->chunks[i].length_dw; cdata = (void __user *)(uintptr_t )user_chunk.chunk_data; - p->chunks[i].kdata =drm_malloc_ab (size,sizeof (uint32_t )); + p->chunks[i].kdata =kvmalloc_array (size,sizeof (uint32_t ),GFP_KERNEL );if (p->chunks[i].kdata ==NULL ) { ret = -ENOMEM ; i--;
@@ -247,7 +247,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) i = p->nchunks -1 ; free_partial_kdata:for (; i >=0 ; i--) -drm_free_large (p->chunks[i].kdata); +kvfree (p->chunks[i].kdata);kfree (p->chunks); p->chunks =NULL ; p->nchunks =0 ;
@@ -505,7 +505,7 @@ static int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p,return r;if (binding_userptr) { -drm_free_large (lobj->user_pages); +kvfree (lobj->user_pages); lobj->user_pages =NULL ; } }
@@ -571,7 +571,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,release_pages (e->user_pages, e->robj->tbo.ttm->num_pages, false); -drm_free_large (e->user_pages); +kvfree (e->user_pages); e->user_pages =NULL ; }
@@ -601,8 +601,9 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,list_for_each_entry (e, &need_pages, tv.head) {struct ttm_tt *ttm = e->robj->tbo.ttm; - e->user_pages =drm_calloc_large (ttm->num_pages, -sizeof (struct page *)); + e->user_pages =kvmalloc_array (ttm->num_pages, +sizeof (struct page *), +GFP_KERNEL | __GFP_ZERO);if (!e->user_pages) { r = -ENOMEM ;DRM_ERROR ("calloc failure in %s\n" , __func__);
@@ -612,7 +613,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p, r =amdgpu_ttm_tt_get_user_pages (ttm, e->user_pages);if (r) {DRM_ERROR ("amdgpu_ttm_tt_get_user_pages failed.\n" ); -drm_free_large (e->user_pages); +kvfree (e->user_pages); e->user_pages =NULL ; goto error_free_pages; }
@@ -708,7 +709,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,release_pages (e->user_pages, e->robj->tbo.ttm->num_pages, false); -drm_free_large (e->user_pages); +kvfree (e->user_pages); } }
@@ -761,7 +762,7 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser, int error, boamdgpu_bo_list_put (parser->bo_list);for (i =0 ; i < parser->nchunks; i++) -drm_free_large (parser->chunks[i].kdata); +kvfree (parser->chunks[i].kdata);kfree (parser->chunks);if (parser->job)amdgpu_job_free (parser->job);
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +4 -3
@@ -279,8 +279,9 @@ static int amdgpu_vm_alloc_levels(struct amdgpu_device *adev,if (!parent->entries) {unsigned num_entries =amdgpu_vm_num_entries (adev, level); - parent->entries =drm_calloc_large (num_entries, -sizeof (struct amdgpu_vm_pt )); + parent->entries =kvmalloc_array (num_entries, +sizeof (struct amdgpu_vm_pt ), +GFP_KERNEL | __GFP_ZERO);if (!parent->entries)return -ENOMEM ;memset (parent->entries,0 ,sizeof (struct amdgpu_vm_pt ));
@@ -2198,7 +2199,7 @@ static void amdgpu_vm_free_levels(struct amdgpu_vm_pt *level)for (i =0 ; i <= level->last_entry_used; i++)amdgpu_vm_free_levels (&level->entries[i]); -drm_free_large (level->entries); +kvfree (level->entries); }/**
drivers/gpu/drm/drm_gem.c +3 -3
@@ -521,7 +521,7 @@ struct page **drm_gem_get_pages(struct drm_gem_object *obj) npages = obj->size >>PAGE_SHIFT ; - pages =drm_malloc_ab (npages,sizeof (struct page *)); + pages =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (pages ==NULL )return ERR_PTR (-ENOMEM );
@@ -546,7 +546,7 @@ struct page **drm_gem_get_pages(struct drm_gem_object *obj)while (i--)put_page (pages[i]); -drm_free_large (pages); +kvfree (pages);return ERR_CAST (p); }EXPORT_SYMBOL (drm_gem_get_pages);
@@ -582,7 +582,7 @@ void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages,put_page (pages[i]); } -drm_free_large (pages); +kvfree (pages); }EXPORT_SYMBOL (drm_gem_put_pages);
drivers/gpu/drm/etnaviv/etnaviv_gem.c +6 -6
@@ -748,7 +748,7 @@ static struct page **etnaviv_gem_userptr_do_get_pages(uintptr_t ptr;unsigned int flags =0 ; - pvec =drm_malloc_ab (npages,sizeof (struct page *)); + pvec =kvmallo_array (npages,sizeof (struct page *),GFP_KERNEL );if (!pvec)return ERR_PTR (-ENOMEM );
@@ -772,7 +772,7 @@ static struct page **etnaviv_gem_userptr_do_get_pages(if (ret <0 ) {release_pages (pvec, pinned,0 ); -drm_free_large (pvec); +kvfree (pvec);return ERR_PTR (ret); }
@@ -823,7 +823,7 @@ static int etnaviv_gem_userptr_get_pages(struct etnaviv_gem_object *etnaviv_obj) mm =get_task_mm (etnaviv_obj->userptr.task); pinned =0 ;if (mm == current->mm) { - pvec =drm_malloc_ab (npages,sizeof (struct page *)); + pvec =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!pvec) {mmput (mm);return -ENOMEM ;
@@ -832,7 +832,7 @@ static int etnaviv_gem_userptr_get_pages(struct etnaviv_gem_object *etnaviv_obj) pinned =__get_user_pages_fast (etnaviv_obj->userptr.ptr, npages, !etnaviv_obj->userptr.ro, pvec);if (pinned <0 ) { -drm_free_large (pvec); +kvfree (pvec);mmput (mm);return pinned; }
@@ -845,7 +845,7 @@ static int etnaviv_gem_userptr_get_pages(struct etnaviv_gem_object *etnaviv_obj) }release_pages (pvec, pinned,0 ); -drm_free_large (pvec); +kvfree (pvec); work =kmalloc (sizeof (*work),GFP_KERNEL );if (!work) {
@@ -879,7 +879,7 @@ static void etnaviv_gem_userptr_release(struct etnaviv_gem_object *etnaviv_obj)int npages = etnaviv_obj->base.size >>PAGE_SHIFT ;release_pages (etnaviv_obj->pages, npages,0 ); -drm_free_large (etnaviv_obj->pages); +kvfree (etnaviv_obj->pages); }put_task_struct (etnaviv_obj->userptr.task); }
drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c +2 -2
@@ -87,7 +87,7 @@ static void etnaviv_gem_prime_release(struct etnaviv_gem_object *etnaviv_obj)* ours, just free the array we allocated: */ if (etnaviv_obj->pages) -drm_free_large (etnaviv_obj->pages); +kvfree (etnaviv_obj->pages);drm_prime_gem_destroy (&etnaviv_obj->base, etnaviv_obj->sgt); }
@@ -128,7 +128,7 @@ struct drm_gem_object *etnaviv_gem_prime_import_sg_table(struct drm_device *dev, npages = size /PAGE_SIZE ; etnaviv_obj->sgt = sgt; - etnaviv_obj->pages =drm_malloc_ab (npages,sizeof (struct page *)); + etnaviv_obj->pages =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!etnaviv_obj->pages) { ret = -ENOMEM ; goto fail;
drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c +6 -6
@@ -345,9 +345,9 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,* Copy the command submission and bo array to kernel space in * one go, and do this outside of any locks. */ - bos =drm_malloc_ab (args->nr_bos,sizeof (*bos)); - relocs =drm_malloc_ab (args->nr_relocs,sizeof (*relocs)); - stream =drm_malloc_ab (1 , args->stream_size); + bos =kvmalloc_array (args->nr_bos,sizeof (*bos),GFP_KERNEL ); + relocs =kvmalloc_array (args->nr_relocs,sizeof (*relocs),GFP_KERNEL ); + stream =kvmalloc_array (1 , args->stream_size,GFP_KERNEL ); cmdbuf =etnaviv_cmdbuf_new (gpu->cmdbuf_suballoc,ALIGN (args->stream_size,8 ) +8 , args->nr_bos);
@@ -489,11 +489,11 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,if (cmdbuf)etnaviv_cmdbuf_free (cmdbuf);if (stream) -drm_free_large (stream); +kvfree (stream);if (bos) -drm_free_large (bos); +kvfree (bos);if (relocs) -drm_free_large (relocs); +kvfree (relocs);return ret; }
drivers/gpu/drm/exynos/exynos_drm_gem.c +6 -5
@@ -59,7 +59,8 @@ static int exynos_drm_alloc_buf(struct exynos_drm_gem *exynos_gem) nr_pages = exynos_gem->size >>PAGE_SHIFT ; - exynos_gem->pages =drm_calloc_large (nr_pages,sizeof (struct page *)); + exynos_gem->pages =kvmalloc_array (nr_pages,sizeof (struct page *), +GFP_KERNEL | __GFP_ZERO);if (!exynos_gem->pages) {DRM_ERROR ("failed to allocate pages.\n" );return -ENOMEM ;
@@ -101,7 +102,7 @@ static int exynos_drm_alloc_buf(struct exynos_drm_gem *exynos_gem)dma_free_attrs (to_dma_dev (dev), exynos_gem->size, exynos_gem->cookie, exynos_gem->dma_addr, exynos_gem->dma_attrs); err_free: -drm_free_large (exynos_gem->pages); +kvfree (exynos_gem->pages);return ret; }
@@ -122,7 +123,7 @@ static void exynos_drm_free_buf(struct exynos_drm_gem *exynos_gem) (dma_addr_t )exynos_gem->dma_addr, exynos_gem->dma_attrs); -drm_free_large (exynos_gem->pages); +kvfree (exynos_gem->pages); } static int exynos_drm_gem_handle_create(struct drm_gem_object *obj,
@@ -559,7 +560,7 @@ exynos_drm_gem_prime_import_sg_table(struct drm_device *dev, exynos_gem->dma_addr =sg_dma_address (sgt->sgl); npages = exynos_gem->size >>PAGE_SHIFT ; - exynos_gem->pages =drm_malloc_ab (npages,sizeof (struct page *)); + exynos_gem->pages =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!exynos_gem->pages) { ret = -ENOMEM ; goto err;
@@ -588,7 +589,7 @@ exynos_drm_gem_prime_import_sg_table(struct drm_device *dev,return &exynos_gem->base; err_free_large: -drm_free_large (exynos_gem->pages); +kvfree (exynos_gem->pages); err:drm_gem_object_release (&exynos_gem->base);kfree (exynos_gem);
drivers/gpu/drm/i915/i915_debugfs.c +2 -2
@@ -229,7 +229,7 @@ static int i915_gem_stolen_list_info(struct seq_file *m, void *data)int ret; total =READ_ONCE (dev_priv->mm.object_count); - objects =drm_malloc_ab (total,sizeof (*objects)); + objects =kvmalloc_array (total,sizeof (*objects),GFP_KERNEL );if (!objects)return -ENOMEM ;
@@ -274,7 +274,7 @@ static int i915_gem_stolen_list_info(struct seq_file *m, void *data)mutex_unlock (&dev->struct_mutex); out: -drm_free_large (objects); +kvfree (objects);return ret; }
drivers/gpu/drm/i915/i915_gem.c +2 -2
@@ -2556,7 +2556,7 @@ static void *i915_gem_object_map(const struct drm_i915_gem_object *obj,if (n_pages >ARRAY_SIZE (stack_pages)) {/* Too big for stack -- allocate temporary array instead */ - pages =drm_malloc_gfp (n_pages,sizeof (*pages),GFP_TEMPORARY ); + pages =kvmalloc_array (n_pages,sizeof (*pages),GFP_TEMPORARY );if (!pages)return NULL ; }
@@ -2578,7 +2578,7 @@ static void *i915_gem_object_map(const struct drm_i915_gem_object *obj, addr =vmap (pages, n_pages,0 , pgprot);if (pages != stack_pages) -drm_free_large (pages); +kvfree (pages);return addr; }
drivers/gpu/drm/i915/i915_gem_execbuffer.c +17 -17
@@ -1019,11 +1019,11 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,for (i =0 ; i < count; i++) total += exec[i].relocation_count; - reloc_offset =drm_malloc_ab (count,sizeof (*reloc_offset)); - reloc =drm_malloc_ab (total,sizeof (*reloc)); + reloc_offset =kvmalloc_array (count,sizeof (*reloc_offset),GFP_KERNEL ); + reloc =kvmalloc_array (total,sizeof (*reloc),GFP_KERNEL );if (reloc ==NULL || reloc_offset ==NULL ) { -drm_free_large (reloc); -drm_free_large (reloc_offset); +kvfree (reloc); +kvfree (reloc_offset);mutex_lock (&dev->struct_mutex);return -ENOMEM ; }
@@ -1099,8 +1099,8 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,*/ err: -drm_free_large (reloc); -drm_free_large (reloc_offset); +kvfree (reloc); +kvfree (reloc_offset);return ret; }
@@ -1871,13 +1871,13 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, }/* Copy in the exec list from userland */ - exec_list =drm_malloc_ab (sizeof (*exec_list), args->buffer_count); - exec2_list =drm_malloc_ab (sizeof (*exec2_list), args->buffer_count); + exec_list =kvmalloc_array (sizeof (*exec_list), args->buffer_count,GFP_KERNEL ); + exec2_list =kvmalloc_array (sizeof (*exec2_list), args->buffer_count,GFP_KERNEL );if (exec_list ==NULL || exec2_list ==NULL ) {DRM_DEBUG ("Failed to allocate exec list for %d buffers\n" , args->buffer_count); -drm_free_large (exec_list); -drm_free_large (exec2_list); +kvfree (exec_list); +kvfree (exec2_list);return -ENOMEM ; } ret = copy_from_user(exec_list,
@@ -1886,8 +1886,8 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,if (ret !=0 ) {DRM_DEBUG ("copy %d exec entries failed %d\n" , args->buffer_count, ret); -drm_free_large (exec_list); -drm_free_large (exec2_list); +kvfree (exec_list); +kvfree (exec2_list);return -EFAULT ; }
@@ -1936,8 +1936,8 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, } } -drm_free_large (exec_list); -drm_free_large (exec2_list); +kvfree (exec_list); +kvfree (exec2_list);return ret; }
@@ -1955,7 +1955,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,return -EINVAL ; } - exec2_list =drm_malloc_gfp (args->buffer_count, + exec2_list =kvmalloc_array (args->buffer_count,sizeof (*exec2_list),GFP_TEMPORARY );if (exec2_list ==NULL ) {
@@ -1969,7 +1969,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,if (ret !=0 ) {DRM_DEBUG ("copy %d exec entries failed %d\n" , args->buffer_count, ret); -drm_free_large (exec2_list); +kvfree (exec2_list);return -EFAULT ; }
@@ -1996,6 +1996,6 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data, } } -drm_free_large (exec2_list); +kvfree (exec2_list);return ret; }
drivers/gpu/drm/i915/i915_gem_gtt.c +3 -3
@@ -3114,7 +3114,7 @@ intel_rotate_pages(struct intel_rotation_info *rot_info,int ret = -ENOMEM ;/* Allocate a temporary list of source pages for random access. */ - page_addr_list =drm_malloc_gfp (n_pages, + page_addr_list =kvmalloc_array (n_pages,sizeof (dma_addr_t),GFP_TEMPORARY );if (!page_addr_list)
@@ -3147,14 +3147,14 @@ intel_rotate_pages(struct intel_rotation_info *rot_info,DRM_DEBUG_KMS ("Created rotated page mapping for object size %zu (%ux%u tiles, %u pages)\n" , obj->base.size, rot_info->plane[0 ].width, rot_info->plane[0 ].height, size); -drm_free_large (page_addr_list); +kvfree (page_addr_list);return st; err_sg_alloc:kfree (st); err_st_alloc: -drm_free_large (page_addr_list); +kvfree (page_addr_list);DRM_DEBUG_KMS ("Failed to create rotated mapping for object size %zu! (%ux%u tiles, %u pages)\n" , obj->base.size, rot_info->plane[0 ].width, rot_info->plane[0 ].height, size);
drivers/gpu/drm/i915/i915_gem_userptr.c +4 -4
@@ -507,7 +507,7 @@ __i915_gem_userptr_get_pages_worker(struct work_struct *_work) ret = -ENOMEM ; pinned =0 ; - pvec =drm_malloc_gfp (npages,sizeof (struct page *),GFP_TEMPORARY ); + pvec =kvmalloc_array (npages,sizeof (struct page *),GFP_TEMPORARY );if (pvec !=NULL ) {struct mm_struct *mm = obj->userptr.mm->mm;unsigned int flags =0 ;
@@ -555,7 +555,7 @@ __i915_gem_userptr_get_pages_worker(struct work_struct *_work)mutex_unlock (&obj->mm.lock);release_pages (pvec, pinned,0 ); -drm_free_large (pvec); +kvfree (pvec);i915_gem_object_put (obj);put_task_struct (work->task);
@@ -642,7 +642,7 @@ i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj) pinned =0 ;if (mm == current->mm) { - pvec =drm_malloc_gfp (num_pages,sizeof (struct page *), + pvec =kvmalloc_array (num_pages,sizeof (struct page *),GFP_TEMPORARY | __GFP_NORETRY | __GFP_NOWARN);
@@ -669,7 +669,7 @@ i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj)if (IS_ERR (pages))release_pages (pvec, pinned,0 ); -drm_free_large (pvec); +kvfree (pvec);return pages; }
drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c +6 -6
@@ -117,7 +117,7 @@ static int igt_random_insert_remove(void *arg)mock_engine_reset (engine); - waiters =drm_malloc_gfp (count,sizeof (*waiters),GFP_TEMPORARY ); + waiters =kvmalloc_array (count,sizeof (*waiters),GFP_TEMPORARY );if (!waiters) goto out_engines;
@@ -169,7 +169,7 @@ static int igt_random_insert_remove(void *arg) out_bitmap:kfree (bitmap); out_waiters: -drm_free_large (waiters); +kvfree (waiters); out_engines:mock_engine_flush (engine);return err;
@@ -187,7 +187,7 @@ static int igt_insert_complete(void *arg)mock_engine_reset (engine); - waiters =drm_malloc_gfp (count,sizeof (*waiters),GFP_TEMPORARY ); + waiters =kvmalloc_array (count,sizeof (*waiters),GFP_TEMPORARY );if (!waiters) goto out_engines;
@@ -254,7 +254,7 @@ static int igt_insert_complete(void *arg) out_bitmap:kfree (bitmap); out_waiters: -drm_free_large (waiters); +kvfree (waiters); out_engines:mock_engine_flush (engine);return err;
@@ -368,7 +368,7 @@ static int igt_wakeup(void *arg)mock_engine_reset (engine); - waiters =drm_malloc_gfp (count,sizeof (*waiters),GFP_TEMPORARY ); + waiters =kvmalloc_array (count,sizeof (*waiters),GFP_TEMPORARY );if (!waiters) goto out_engines;
@@ -454,7 +454,7 @@ static int igt_wakeup(void *arg)put_task_struct (waiters[n].tsk); } -drm_free_large (waiters); +kvfree (waiters); out_engines:mock_engine_flush (engine);return err;
drivers/gpu/drm/msm/msm_gem.c +5 -5
@@ -50,13 +50,13 @@ static struct page **get_pages_vram(struct drm_gem_object *obj,struct page **p;int ret, i; - p =drm_malloc_ab (npages,sizeof (struct page *)); + p =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!p)return ERR_PTR (-ENOMEM ); ret =drm_mm_insert_node (&priv->vram.mm, msm_obj->vram_node, npages);if (ret) { -drm_free_large (p); +kvfree (p);return ERR_PTR (ret); }
@@ -127,7 +127,7 @@ static void put_pages(struct drm_gem_object *obj)drm_gem_put_pages (obj, msm_obj->pages, true, false); else {drm_mm_remove_node (msm_obj->vram_node); -drm_free_large (msm_obj->pages); +kvfree (msm_obj->pages); } msm_obj->pages =NULL ;
@@ -707,7 +707,7 @@ void msm_gem_free_object(struct drm_gem_object *obj)* ours, just free the array we allocated: */ if (msm_obj->pages) -drm_free_large (msm_obj->pages); +kvfree (msm_obj->pages);drm_prime_gem_destroy (obj, msm_obj->sgt); }else {
@@ -863,7 +863,7 @@ struct drm_gem_object *msm_gem_import(struct drm_device *dev, msm_obj =to_msm_bo (obj); msm_obj->sgt = sgt; - msm_obj->pages =drm_malloc_ab (npages,sizeof (struct page *)); + msm_obj->pages =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!msm_obj->pages) { ret = -ENOMEM ; goto fail;
drivers/gpu/drm/radeon/radeon_cs.c +6 -5
@@ -87,7 +87,8 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p) p->dma_reloc_idx =0 ;/* FIXME: we assume that each relocs use 4 dwords */ p->nrelocs = chunk->length_dw /4 ; - p->relocs =drm_calloc_large (p->nrelocs,sizeof (struct radeon_bo_list )); + p->relocs =kvmalloc_array (p->nrelocs,sizeof (struct radeon_bo_list ), +GFP_KERNEL | __GFP_ZERO);if (p->relocs ==NULL ) {return -ENOMEM ; }
@@ -341,7 +342,7 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)continue ; } - p->chunks[i].kdata =drm_malloc_ab (size,sizeof (uint32_t )); + p->chunks[i].kdata =kvmalloc_array (size,sizeof (uint32_t ),GFP_KERNEL ); size *=sizeof (uint32_t );if (p->chunks[i].kdata ==NULL ) {return -ENOMEM ;
@@ -440,10 +441,10 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error, bo } }kfree (parser->track); -drm_free_large (parser->relocs); -drm_free_large (parser->vm_bos); +kvfree (parser->relocs); +kvfree (parser->vm_bos);for (i =0 ; i < parser->nchunks; i++) -drm_free_large (parser->chunks[i].kdata); +kvfree (parser->chunks[i].kdata);kfree (parser->chunks);kfree (parser->chunks_array);radeon_ib_free (parser->rdev, &parser->ib);
drivers/gpu/drm/radeon/radeon_gem.c +1 -1
@@ -587,7 +587,7 @@ static void radeon_gem_va_update_vm(struct radeon_device *rdev,ttm_eu_backoff_reservation (&ticket, &list); error_free: -drm_free_large (vm_bos); +kvfree (vm_bos);if (r && r != -ERESTARTSYS )DRM_ERROR ("Couldn't update BO_VA (%d)\n" , r);
drivers/gpu/drm/radeon/radeon_ring.c +2 -2
@@ -314,7 +314,7 @@ unsigned radeon_ring_backup(struct radeon_device *rdev, struct radeon_ring *ring }/* and then save the content of the ring */ - *data =drm_malloc_ab (size,sizeof (uint32_t )); + *data =kvmalloc_array (size,sizeof (uint32_t ),GFP_KERNEL );if (!*data) {mutex_unlock (&rdev->ring_lock);return 0 ;
@@ -356,7 +356,7 @@ int radeon_ring_restore(struct radeon_device *rdev, struct radeon_ring *ring, }radeon_ring_unlock_commit (rdev, ring, false); -drm_free_large (data); +kvfree (data);return 0 ; }
drivers/gpu/drm/radeon/radeon_vm.c +2 -2
@@ -132,8 +132,8 @@ struct radeon_bo_list *radeon_vm_get_bos(struct radeon_device *rdev,struct radeon_bo_list *list;unsigned i, idx; - list =drm_malloc_ab (vm->max_pde_used +2 , -sizeof (struct radeon_bo_list )); + list =kvmalloc_array (vm->max_pde_used +2 , +sizeof (struct radeon_bo_list ),GFP_KERNEL );if (!list)return NULL ;
drivers/gpu/drm/ttm/ttm_tt.c +7 -6
@@ -39,7 +39,6 @@#include <linux/slab.h> #include <linux/export.h> #include <drm/drm_cache.h> -#include <drm/drm_mem_util.h> #include <drm/ttm/ttm_module.h> #include <drm/ttm/ttm_bo_driver.h> #include <drm/ttm/ttm_placement.h>
@@ -53,14 +52,16 @@*/ static void ttm_tt_alloc_page_directory (struct ttm_tt *ttm) { - ttm->pages =drm_calloc_large (ttm->num_pages,sizeof (void *)); + ttm->pages =kvmalloc_array (ttm->num_pages,sizeof (void *), +GFP_KERNEL | __GFP_ZERO); }static void ttm_dma_tt_alloc_page_directory (struct ttm_dma_tt *ttm) { - ttm->ttm.pages =drm_calloc_large (ttm->ttm.num_pages, + ttm->ttm.pages =kvmalloc_array (ttm->ttm.num_pages,sizeof (*ttm->ttm.pages) + -sizeof (*ttm->dma_address)); +sizeof (*ttm->dma_address), +GFP_KERNEL | __GFP_ZERO); ttm->dma_address = (void *) (ttm->ttm.pages + ttm->ttm.num_pages); }
@@ -208,7 +209,7 @@ EXPORT_SYMBOL(ttm_tt_init);void ttm_tt_fini (struct ttm_tt *ttm) { -drm_free_large (ttm->pages); +kvfree (ttm->pages); ttm->pages =NULL ; }EXPORT_SYMBOL (ttm_tt_fini);
@@ -243,7 +244,7 @@ void ttm_dma_tt_fini(struct ttm_dma_tt *ttm_dma) {struct ttm_tt *ttm = &ttm_dma->ttm; -drm_free_large (ttm->pages); +kvfree (ttm->pages); ttm->pages =NULL ; ttm_dma->dma_address =NULL ; }
drivers/gpu/drm/udl/udl_dmabuf.c +1 -1
@@ -228,7 +228,7 @@ static int udl_prime_create(struct drm_device *dev,return -ENOMEM ; obj->sg = sg; - obj->pages =drm_malloc_ab (npages,sizeof (struct page *)); + obj->pages =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (obj->pages ==NULL ) {DRM_ERROR ("obj pages is NULL %d\n" , npages);return -ENOMEM ;
drivers/gpu/drm/udl/udl_gem.c +1 -1
@@ -146,7 +146,7 @@ int udl_gem_get_pages(struct udl_gem_object *obj)void udl_gem_put_pages (struct udl_gem_object *obj) {if (obj->base.import_attach) { -drm_free_large (obj->pages); +kvfree (obj->pages); obj->pages =NULL ;return ; }
drivers/gpu/drm/vc4/vc4_gem.c +8 -7
@@ -545,14 +545,15 @@ vc4_cl_lookup_bos(struct drm_device *dev,return -EINVAL ; } - exec->bo =drm_calloc_large (exec->bo_count, -sizeof (struct drm_gem_cma_object *)); + exec->bo =kvmalloc_array (exec->bo_count, +sizeof (struct drm_gem_cma_object *), +GFP_KERNEL | __GFP_ZERO);if (!exec->bo) {DRM_ERROR ("Failed to allocate validated BO pointers\n" );return -ENOMEM ; } - handles =drm_malloc_ab (exec->bo_count,sizeof (uint32_t )); + handles =kvmalloc_array (exec->bo_count,sizeof (uint32_t ),GFP_KERNEL );if (!handles) { ret = -ENOMEM ;DRM_ERROR ("Failed to allocate incoming GEM handles\n" );
@@ -584,7 +585,7 @@ vc4_cl_lookup_bos(struct drm_device *dev,spin_unlock (&file_priv->table_lock); fail: -drm_free_large (handles); +kvfree (handles);return ret; }
@@ -622,7 +623,7 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec)* read the contents back for validation, and I think the * bo->vaddr is uncached access. */ - temp =drm_malloc_ab (temp_size,1 ); + temp =kvmalloc_array (temp_size,1 ,GFP_KERNEL );if (!temp) {DRM_ERROR ("Failed to allocate storage for copying " "in bin/render CLs.\n" );
@@ -697,7 +698,7 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec) ret =vc4_wait_for_seqno (dev, exec->bin_dep_seqno, ~0ull , true); fail: -drm_free_large (temp); +kvfree (temp);return ret; }
@@ -710,7 +711,7 @@ vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec)if (exec->bo) {for (i =0 ; i < exec->bo_count; i++)drm_gem_object_unreference_unlocked (&exec->bo[i]->base); -drm_free_large (exec->bo); +kvfree (exec->bo); }while (!list_empty (&exec->unref_list)) {
drivers/gpu/drm/virtio/virtgpu_ioctl.c +14 -13
@@ -119,13 +119,14 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,INIT_LIST_HEAD (&validate_list);if (exbuf->num_bo_handles) { - bo_handles =drm_malloc_ab (exbuf->num_bo_handles, -sizeof (uint32_t )); - buflist =drm_calloc_large (exbuf->num_bo_handles, -sizeof (struct ttm_validate_buffer )); + bo_handles =kvmalloc_array (exbuf->num_bo_handles, +sizeof (uint32_t ),GFP_KERNEL ); + buflist =kvmalloc_array (exbuf->num_bo_handles, +sizeof (struct ttm_validate_buffer ), +GFP_KERNEL | __GFP_ZERO);if (!bo_handles || !buflist) { -drm_free_large (bo_handles); -drm_free_large (buflist); +kvfree (bo_handles); +kvfree (buflist);return -ENOMEM ; }
@@ -133,16 +134,16 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,if (copy_from_user (bo_handles, user_bo_handles, exbuf->num_bo_handles *sizeof (uint32_t ))) { ret = -EFAULT ; -drm_free_large (bo_handles); -drm_free_large (buflist); +kvfree (bo_handles); +kvfree (buflist);return ret; }for (i =0 ; i < exbuf->num_bo_handles; i++) { gobj =drm_gem_object_lookup (drm_file, bo_handles[i]);if (!gobj) { -drm_free_large (bo_handles); -drm_free_large (buflist); +kvfree (bo_handles); +kvfree (buflist);return -ENOENT ; }
@@ -151,7 +152,7 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,list_add (&buflist[i].head, &validate_list); } -drm_free_large (bo_handles); +kvfree (bo_handles); } ret =virtio_gpu_object_list_validate (&ticket, &validate_list);
@@ -171,7 +172,7 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,/* fence the command bo */ virtio_gpu_unref_list (&validate_list); -drm_free_large (buflist); +kvfree (buflist);dma_fence_put (&fence->f);return 0 ;
@@ -179,7 +180,7 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,ttm_eu_backoff_reservation (&ticket, &validate_list); out_free:virtio_gpu_unref_list (&validate_list); -drm_free_large (buflist); +kvfree (buflist);return ret; }
include/drm/drmP.h +0 -1
@@ -70,7 +70,6 @@#include <drm/drm_fourcc.h> #include <drm/drm_global.h> #include <drm/drm_hashtab.h> -#include <drm/drm_mem_util.h> #include <drm/drm_mm.h> #include <drm/drm_os_linux.h> #include <drm/drm_sarea.h>
include/drm/drm_mem_util.h deleted +0 -53
53 lines not on this page · raw message
Signature · 7 lines
2.11.0 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
kbuild test robot
build botRe: [PATCH 2/2] drm: drop drm_[cm]alloc* helpers
reproduce: wget https://raw.githubusercontent.com/01org/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross…
Hi Michal,
[auto build test ERROR on drm/drm-next]
[also build test ERROR on v4.12-rc1 next-20170517]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Michal-Hocko/drm-replace-drm_-cm-alloc-by-kvmalloc-alternatives/20170517-150333 base: git://people.freedesktop.org/~airlied/linux.git drm-next config: arm-allmodconfig (attached as .config) compiler: arm-linux-gnueabi-gcc (Debian 6.1.1-9) 6.1.1 20160705
reproduce:
wget https://raw.githubusercontent.com/01org/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=arm
All error/warnings (new ones prefixed by >>):
drivers/gpu//drm/etnaviv/etnaviv_gem.c: In function 'etnaviv_gem_userptr_do_get_pages':
>> drivers/gpu//drm/etnaviv/etnaviv_gem.c:751:9: error: implicit declaration of function 'kvmallo_array' [-Werror=implicit-function-declaration]
pvec = kvmallo_array(npages, sizeof(struct page *), GFP_KERNEL);
^~~~~~~~~~~~~
>> drivers/gpu//drm/etnaviv/etnaviv_gem.c:751:7: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
pvec = kvmallo_array(npages, sizeof(struct page *), GFP_KERNEL);
^cc1: some warnings being treated as errors
vim +/kvmallo_array +751 drivers/gpu//drm/etnaviv/etnaviv_gem.c
745 {
746 int ret = 0, pinned, npages = etnaviv_obj->base.size >> PAGE_SHIFT;
747 struct page **pvec;
748 uintptr_t ptr;
749 unsigned int flags = 0;
750
> 751 pvec = kvmallo_array(npages, sizeof(struct page *), GFP_KERNEL);
752 if (!pvec)
753 return ERR_PTR(-ENOMEM);
754
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
PATCH 2/2 drm: drop drm_[cm]alloc* helpers
In reply to Michal HockoAs it turned out my allyesconfig on x86_64 wasn't sufficient and 0day build machinery found a failure on arm architecture. It was clearly a typo. Now I have pushed this to my build battery with cross arch compilers and it passes so there shouldn't more surprises hopefully. Here is the v2.
---
Quoted 1 line
From
4a00b3ade5ca4514f7affd8de6f7119c8d5c5a86Mon Sep 17 00:00:00 2001
From: Michal Hocko <[email protected]>
Date: Tue, 16 May 2017 11:00:47 +0200
Subject: [PATCH -v2] drm: drop drm_[cm]alloc* helpers
Now that drm_[cm]alloc* helpers are simple one line wrappers around kvmalloc_array and drm_free_large is just kvfree alias we can drop them and replace by their native forms.
This shouldn't introduce any functional change.
Changes since v1
- fix typo in drivers/gpu//drm/etnaviv/etnaviv_gem.c - noticed by 0day build robot
--- drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | 16 +++---- drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 19 ++++---- drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 7 +-- drivers/gpu/drm/drm_gem.c | 6 +-- drivers/gpu/drm/etnaviv/etnaviv_gem.c | 12 ++--- drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c | 4 +- drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 12 ++--- drivers/gpu/drm/exynos/exynos_drm_gem.c | 11 +++-- drivers/gpu/drm/i915/i915_debugfs.c | 4 +- drivers/gpu/drm/i915/i915_gem.c | 4 +- drivers/gpu/drm/i915/i915_gem_execbuffer.c | 34 +++++++------- drivers/gpu/drm/i915/i915_gem_gtt.c | 6 +-- drivers/gpu/drm/i915/i915_gem_userptr.c | 8 ++-- drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c | 12 ++--- drivers/gpu/drm/msm/msm_gem.c | 10 ++-- drivers/gpu/drm/radeon/radeon_cs.c | 11 +++-- drivers/gpu/drm/radeon/radeon_gem.c | 2 +- drivers/gpu/drm/radeon/radeon_ring.c | 4 +- drivers/gpu/drm/radeon/radeon_vm.c | 4 +- drivers/gpu/drm/ttm/ttm_tt.c | 13 +++--- drivers/gpu/drm/udl/udl_dmabuf.c | 2 +- drivers/gpu/drm/udl/udl_gem.c | 2 +- drivers/gpu/drm/vc4/vc4_gem.c | 15 +++--- drivers/gpu/drm/virtio/virtgpu_ioctl.c | 27 +++++------ include/drm/drmP.h | 1 - include/drm/drm_mem_util.h | 53 ---------------------- 26 files changed, 126 insertions(+), 173 deletions(-) delete mode 100644 include/drm/drm_mem_util.h
drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c +8 -8
@@ -96,7 +96,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,int r;unsigned long total_size =0 ; - array =drm_malloc_ab (num_entries,sizeof (struct amdgpu_bo_list_entry )); + array =kvmalloc_array (num_entries,sizeof (struct amdgpu_bo_list_entry ),GFP_KERNEL );if (!array)return -ENOMEM ;memset (array,0 , num_entries *sizeof (struct amdgpu_bo_list_entry ));
@@ -148,7 +148,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,for (i =0 ; i < list->num_entries; ++i)amdgpu_bo_unref (&list->array[i].robj); -drm_free_large (list->array); +kvfree (list->array); list->gds_obj = gds_obj; list->gws_obj = gws_obj;
@@ -163,7 +163,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev, error_free:while (i--)amdgpu_bo_unref (&array[i].robj); -drm_free_large (array); +kvfree (array);return r; }
@@ -224,7 +224,7 @@ void amdgpu_bo_list_free(struct amdgpu_bo_list *list)amdgpu_bo_unref (&list->array[i].robj);mutex_destroy (&list->lock); -drm_free_large (list->array); +kvfree (list->array);kfree (list); }
@@ -244,8 +244,8 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,int r; - info =drm_malloc_ab (args->in.bo_number, -sizeof (struct drm_amdgpu_bo_list_entry )); + info =kvmalloc_array (args->in.bo_number, +sizeof (struct drm_amdgpu_bo_list_entry ),GFP_KERNEL );if (!info)return -ENOMEM ;
@@ -311,11 +311,11 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,memset (args,0 ,sizeof (*args)); args->out.list_handle = handle; -drm_free_large (info); +kvfree (info);return 0 ; error_free: -drm_free_large (info); +kvfree (info);return r; }
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +10 -9
@@ -194,7 +194,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) size = p->chunks[i].length_dw; cdata = (void __user *)(uintptr_t )user_chunk.chunk_data; - p->chunks[i].kdata =drm_malloc_ab (size,sizeof (uint32_t )); + p->chunks[i].kdata =kvmalloc_array (size,sizeof (uint32_t ),GFP_KERNEL );if (p->chunks[i].kdata ==NULL ) { ret = -ENOMEM ; i--;
@@ -247,7 +247,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) i = p->nchunks -1 ; free_partial_kdata:for (; i >=0 ; i--) -drm_free_large (p->chunks[i].kdata); +kvfree (p->chunks[i].kdata);kfree (p->chunks); p->chunks =NULL ; p->nchunks =0 ;
@@ -505,7 +505,7 @@ static int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p,return r;if (binding_userptr) { -drm_free_large (lobj->user_pages); +kvfree (lobj->user_pages); lobj->user_pages =NULL ; } }
@@ -571,7 +571,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,release_pages (e->user_pages, e->robj->tbo.ttm->num_pages, false); -drm_free_large (e->user_pages); +kvfree (e->user_pages); e->user_pages =NULL ; }
@@ -601,8 +601,9 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,list_for_each_entry (e, &need_pages, tv.head) {struct ttm_tt *ttm = e->robj->tbo.ttm; - e->user_pages =drm_calloc_large (ttm->num_pages, -sizeof (struct page *)); + e->user_pages =kvmalloc_array (ttm->num_pages, +sizeof (struct page *), +GFP_KERNEL | __GFP_ZERO);if (!e->user_pages) { r = -ENOMEM ;DRM_ERROR ("calloc failure in %s\n" , __func__);
@@ -612,7 +613,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p, r =amdgpu_ttm_tt_get_user_pages (ttm, e->user_pages);if (r) {DRM_ERROR ("amdgpu_ttm_tt_get_user_pages failed.\n" ); -drm_free_large (e->user_pages); +kvfree (e->user_pages); e->user_pages =NULL ; goto error_free_pages; }
@@ -708,7 +709,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,release_pages (e->user_pages, e->robj->tbo.ttm->num_pages, false); -drm_free_large (e->user_pages); +kvfree (e->user_pages); } }
@@ -761,7 +762,7 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser, int error, boamdgpu_bo_list_put (parser->bo_list);for (i =0 ; i < parser->nchunks; i++) -drm_free_large (parser->chunks[i].kdata); +kvfree (parser->chunks[i].kdata);kfree (parser->chunks);if (parser->job)amdgpu_job_free (parser->job);
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +4 -3
@@ -279,8 +279,9 @@ static int amdgpu_vm_alloc_levels(struct amdgpu_device *adev,if (!parent->entries) {unsigned num_entries =amdgpu_vm_num_entries (adev, level); - parent->entries =drm_calloc_large (num_entries, -sizeof (struct amdgpu_vm_pt )); + parent->entries =kvmalloc_array (num_entries, +sizeof (struct amdgpu_vm_pt ), +GFP_KERNEL | __GFP_ZERO);if (!parent->entries)return -ENOMEM ;memset (parent->entries,0 ,sizeof (struct amdgpu_vm_pt ));
@@ -2198,7 +2199,7 @@ static void amdgpu_vm_free_levels(struct amdgpu_vm_pt *level)for (i =0 ; i <= level->last_entry_used; i++)amdgpu_vm_free_levels (&level->entries[i]); -drm_free_large (level->entries); +kvfree (level->entries); }/**
drivers/gpu/drm/drm_gem.c +3 -3
@@ -521,7 +521,7 @@ struct page **drm_gem_get_pages(struct drm_gem_object *obj) npages = obj->size >>PAGE_SHIFT ; - pages =drm_malloc_ab (npages,sizeof (struct page *)); + pages =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (pages ==NULL )return ERR_PTR (-ENOMEM );
@@ -546,7 +546,7 @@ struct page **drm_gem_get_pages(struct drm_gem_object *obj)while (i--)put_page (pages[i]); -drm_free_large (pages); +kvfree (pages);return ERR_CAST (p); }EXPORT_SYMBOL (drm_gem_get_pages);
@@ -582,7 +582,7 @@ void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages,put_page (pages[i]); } -drm_free_large (pages); +kvfree (pages); }EXPORT_SYMBOL (drm_gem_put_pages);
drivers/gpu/drm/etnaviv/etnaviv_gem.c +6 -6
@@ -748,7 +748,7 @@ static struct page **etnaviv_gem_userptr_do_get_pages(uintptr_t ptr;unsigned int flags =0 ; - pvec =drm_malloc_ab (npages,sizeof (struct page *)); + pvec =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!pvec)return ERR_PTR (-ENOMEM );
@@ -772,7 +772,7 @@ static struct page **etnaviv_gem_userptr_do_get_pages(if (ret <0 ) {release_pages (pvec, pinned,0 ); -drm_free_large (pvec); +kvfree (pvec);return ERR_PTR (ret); }
@@ -823,7 +823,7 @@ static int etnaviv_gem_userptr_get_pages(struct etnaviv_gem_object *etnaviv_obj) mm =get_task_mm (etnaviv_obj->userptr.task); pinned =0 ;if (mm == current->mm) { - pvec =drm_malloc_ab (npages,sizeof (struct page *)); + pvec =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!pvec) {mmput (mm);return -ENOMEM ;
@@ -832,7 +832,7 @@ static int etnaviv_gem_userptr_get_pages(struct etnaviv_gem_object *etnaviv_obj) pinned =__get_user_pages_fast (etnaviv_obj->userptr.ptr, npages, !etnaviv_obj->userptr.ro, pvec);if (pinned <0 ) { -drm_free_large (pvec); +kvfree (pvec);mmput (mm);return pinned; }
@@ -845,7 +845,7 @@ static int etnaviv_gem_userptr_get_pages(struct etnaviv_gem_object *etnaviv_obj) }release_pages (pvec, pinned,0 ); -drm_free_large (pvec); +kvfree (pvec); work =kmalloc (sizeof (*work),GFP_KERNEL );if (!work) {
@@ -879,7 +879,7 @@ static void etnaviv_gem_userptr_release(struct etnaviv_gem_object *etnaviv_obj)int npages = etnaviv_obj->base.size >>PAGE_SHIFT ;release_pages (etnaviv_obj->pages, npages,0 ); -drm_free_large (etnaviv_obj->pages); +kvfree (etnaviv_obj->pages); }put_task_struct (etnaviv_obj->userptr.task); }
drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c +2 -2
@@ -87,7 +87,7 @@ static void etnaviv_gem_prime_release(struct etnaviv_gem_object *etnaviv_obj)* ours, just free the array we allocated: */ if (etnaviv_obj->pages) -drm_free_large (etnaviv_obj->pages); +kvfree (etnaviv_obj->pages);drm_prime_gem_destroy (&etnaviv_obj->base, etnaviv_obj->sgt); }
@@ -128,7 +128,7 @@ struct drm_gem_object *etnaviv_gem_prime_import_sg_table(struct drm_device *dev, npages = size /PAGE_SIZE ; etnaviv_obj->sgt = sgt; - etnaviv_obj->pages =drm_malloc_ab (npages,sizeof (struct page *)); + etnaviv_obj->pages =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!etnaviv_obj->pages) { ret = -ENOMEM ; goto fail;
drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c +6 -6
@@ -345,9 +345,9 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,* Copy the command submission and bo array to kernel space in * one go, and do this outside of any locks. */ - bos =drm_malloc_ab (args->nr_bos,sizeof (*bos)); - relocs =drm_malloc_ab (args->nr_relocs,sizeof (*relocs)); - stream =drm_malloc_ab (1 , args->stream_size); + bos =kvmalloc_array (args->nr_bos,sizeof (*bos),GFP_KERNEL ); + relocs =kvmalloc_array (args->nr_relocs,sizeof (*relocs),GFP_KERNEL ); + stream =kvmalloc_array (1 , args->stream_size,GFP_KERNEL ); cmdbuf =etnaviv_cmdbuf_new (gpu->cmdbuf_suballoc,ALIGN (args->stream_size,8 ) +8 , args->nr_bos);
@@ -489,11 +489,11 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,if (cmdbuf)etnaviv_cmdbuf_free (cmdbuf);if (stream) -drm_free_large (stream); +kvfree (stream);if (bos) -drm_free_large (bos); +kvfree (bos);if (relocs) -drm_free_large (relocs); +kvfree (relocs);return ret; }
drivers/gpu/drm/exynos/exynos_drm_gem.c +6 -5
@@ -59,7 +59,8 @@ static int exynos_drm_alloc_buf(struct exynos_drm_gem *exynos_gem) nr_pages = exynos_gem->size >>PAGE_SHIFT ; - exynos_gem->pages =drm_calloc_large (nr_pages,sizeof (struct page *)); + exynos_gem->pages =kvmalloc_array (nr_pages,sizeof (struct page *), +GFP_KERNEL | __GFP_ZERO);if (!exynos_gem->pages) {DRM_ERROR ("failed to allocate pages.\n" );return -ENOMEM ;
@@ -101,7 +102,7 @@ static int exynos_drm_alloc_buf(struct exynos_drm_gem *exynos_gem)dma_free_attrs (to_dma_dev (dev), exynos_gem->size, exynos_gem->cookie, exynos_gem->dma_addr, exynos_gem->dma_attrs); err_free: -drm_free_large (exynos_gem->pages); +kvfree (exynos_gem->pages);return ret; }
@@ -122,7 +123,7 @@ static void exynos_drm_free_buf(struct exynos_drm_gem *exynos_gem) (dma_addr_t )exynos_gem->dma_addr, exynos_gem->dma_attrs); -drm_free_large (exynos_gem->pages); +kvfree (exynos_gem->pages); } static int exynos_drm_gem_handle_create(struct drm_gem_object *obj,
@@ -559,7 +560,7 @@ exynos_drm_gem_prime_import_sg_table(struct drm_device *dev, exynos_gem->dma_addr =sg_dma_address (sgt->sgl); npages = exynos_gem->size >>PAGE_SHIFT ; - exynos_gem->pages =drm_malloc_ab (npages,sizeof (struct page *)); + exynos_gem->pages =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!exynos_gem->pages) { ret = -ENOMEM ; goto err;
@@ -588,7 +589,7 @@ exynos_drm_gem_prime_import_sg_table(struct drm_device *dev,return &exynos_gem->base; err_free_large: -drm_free_large (exynos_gem->pages); +kvfree (exynos_gem->pages); err:drm_gem_object_release (&exynos_gem->base);kfree (exynos_gem);
drivers/gpu/drm/i915/i915_debugfs.c +2 -2
@@ -229,7 +229,7 @@ static int i915_gem_stolen_list_info(struct seq_file *m, void *data)int ret; total =READ_ONCE (dev_priv->mm.object_count); - objects =drm_malloc_ab (total,sizeof (*objects)); + objects =kvmalloc_array (total,sizeof (*objects),GFP_KERNEL );if (!objects)return -ENOMEM ;
@@ -274,7 +274,7 @@ static int i915_gem_stolen_list_info(struct seq_file *m, void *data)mutex_unlock (&dev->struct_mutex); out: -drm_free_large (objects); +kvfree (objects);return ret; }
drivers/gpu/drm/i915/i915_gem.c +2 -2
@@ -2556,7 +2556,7 @@ static void *i915_gem_object_map(const struct drm_i915_gem_object *obj,if (n_pages >ARRAY_SIZE (stack_pages)) {/* Too big for stack -- allocate temporary array instead */ - pages =drm_malloc_gfp (n_pages,sizeof (*pages),GFP_TEMPORARY ); + pages =kvmalloc_array (n_pages,sizeof (*pages),GFP_TEMPORARY );if (!pages)return NULL ; }
@@ -2578,7 +2578,7 @@ static void *i915_gem_object_map(const struct drm_i915_gem_object *obj, addr =vmap (pages, n_pages,0 , pgprot);if (pages != stack_pages) -drm_free_large (pages); +kvfree (pages);return addr; }
drivers/gpu/drm/i915/i915_gem_execbuffer.c +17 -17
@@ -1019,11 +1019,11 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,for (i =0 ; i < count; i++) total += exec[i].relocation_count; - reloc_offset =drm_malloc_ab (count,sizeof (*reloc_offset)); - reloc =drm_malloc_ab (total,sizeof (*reloc)); + reloc_offset =kvmalloc_array (count,sizeof (*reloc_offset),GFP_KERNEL ); + reloc =kvmalloc_array (total,sizeof (*reloc),GFP_KERNEL );if (reloc ==NULL || reloc_offset ==NULL ) { -drm_free_large (reloc); -drm_free_large (reloc_offset); +kvfree (reloc); +kvfree (reloc_offset);mutex_lock (&dev->struct_mutex);return -ENOMEM ; }
@@ -1099,8 +1099,8 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,*/ err: -drm_free_large (reloc); -drm_free_large (reloc_offset); +kvfree (reloc); +kvfree (reloc_offset);return ret; }
@@ -1871,13 +1871,13 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, }/* Copy in the exec list from userland */ - exec_list =drm_malloc_ab (sizeof (*exec_list), args->buffer_count); - exec2_list =drm_malloc_ab (sizeof (*exec2_list), args->buffer_count); + exec_list =kvmalloc_array (sizeof (*exec_list), args->buffer_count,GFP_KERNEL ); + exec2_list =kvmalloc_array (sizeof (*exec2_list), args->buffer_count,GFP_KERNEL );if (exec_list ==NULL || exec2_list ==NULL ) {DRM_DEBUG ("Failed to allocate exec list for %d buffers\n" , args->buffer_count); -drm_free_large (exec_list); -drm_free_large (exec2_list); +kvfree (exec_list); +kvfree (exec2_list);return -ENOMEM ; } ret = copy_from_user(exec_list,
@@ -1886,8 +1886,8 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,if (ret !=0 ) {DRM_DEBUG ("copy %d exec entries failed %d\n" , args->buffer_count, ret); -drm_free_large (exec_list); -drm_free_large (exec2_list); +kvfree (exec_list); +kvfree (exec2_list);return -EFAULT ; }
@@ -1936,8 +1936,8 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, } } -drm_free_large (exec_list); -drm_free_large (exec2_list); +kvfree (exec_list); +kvfree (exec2_list);return ret; }
@@ -1955,7 +1955,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,return -EINVAL ; } - exec2_list =drm_malloc_gfp (args->buffer_count, + exec2_list =kvmalloc_array (args->buffer_count,sizeof (*exec2_list),GFP_TEMPORARY );if (exec2_list ==NULL ) {
@@ -1969,7 +1969,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,if (ret !=0 ) {DRM_DEBUG ("copy %d exec entries failed %d\n" , args->buffer_count, ret); -drm_free_large (exec2_list); +kvfree (exec2_list);return -EFAULT ; }
@@ -1996,6 +1996,6 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data, } } -drm_free_large (exec2_list); +kvfree (exec2_list);return ret; }
drivers/gpu/drm/i915/i915_gem_gtt.c +3 -3
@@ -3114,7 +3114,7 @@ intel_rotate_pages(struct intel_rotation_info *rot_info,int ret = -ENOMEM ;/* Allocate a temporary list of source pages for random access. */ - page_addr_list =drm_malloc_gfp (n_pages, + page_addr_list =kvmalloc_array (n_pages,sizeof (dma_addr_t),GFP_TEMPORARY );if (!page_addr_list)
@@ -3147,14 +3147,14 @@ intel_rotate_pages(struct intel_rotation_info *rot_info,DRM_DEBUG_KMS ("Created rotated page mapping for object size %zu (%ux%u tiles, %u pages)\n" , obj->base.size, rot_info->plane[0 ].width, rot_info->plane[0 ].height, size); -drm_free_large (page_addr_list); +kvfree (page_addr_list);return st; err_sg_alloc:kfree (st); err_st_alloc: -drm_free_large (page_addr_list); +kvfree (page_addr_list);DRM_DEBUG_KMS ("Failed to create rotated mapping for object size %zu! (%ux%u tiles, %u pages)\n" , obj->base.size, rot_info->plane[0 ].width, rot_info->plane[0 ].height, size);
drivers/gpu/drm/i915/i915_gem_userptr.c +4 -4
@@ -507,7 +507,7 @@ __i915_gem_userptr_get_pages_worker(struct work_struct *_work) ret = -ENOMEM ; pinned =0 ; - pvec =drm_malloc_gfp (npages,sizeof (struct page *),GFP_TEMPORARY ); + pvec =kvmalloc_array (npages,sizeof (struct page *),GFP_TEMPORARY );if (pvec !=NULL ) {struct mm_struct *mm = obj->userptr.mm->mm;unsigned int flags =0 ;
@@ -555,7 +555,7 @@ __i915_gem_userptr_get_pages_worker(struct work_struct *_work)mutex_unlock (&obj->mm.lock);release_pages (pvec, pinned,0 ); -drm_free_large (pvec); +kvfree (pvec);i915_gem_object_put (obj);put_task_struct (work->task);
@@ -642,7 +642,7 @@ i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj) pinned =0 ;if (mm == current->mm) { - pvec =drm_malloc_gfp (num_pages,sizeof (struct page *), + pvec =kvmalloc_array (num_pages,sizeof (struct page *),GFP_TEMPORARY | __GFP_NORETRY | __GFP_NOWARN);
@@ -669,7 +669,7 @@ i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj)if (IS_ERR (pages))release_pages (pvec, pinned,0 ); -drm_free_large (pvec); +kvfree (pvec);return pages; }
drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c +6 -6
@@ -117,7 +117,7 @@ static int igt_random_insert_remove(void *arg)mock_engine_reset (engine); - waiters =drm_malloc_gfp (count,sizeof (*waiters),GFP_TEMPORARY ); + waiters =kvmalloc_array (count,sizeof (*waiters),GFP_TEMPORARY );if (!waiters) goto out_engines;
@@ -169,7 +169,7 @@ static int igt_random_insert_remove(void *arg) out_bitmap:kfree (bitmap); out_waiters: -drm_free_large (waiters); +kvfree (waiters); out_engines:mock_engine_flush (engine);return err;
@@ -187,7 +187,7 @@ static int igt_insert_complete(void *arg)mock_engine_reset (engine); - waiters =drm_malloc_gfp (count,sizeof (*waiters),GFP_TEMPORARY ); + waiters =kvmalloc_array (count,sizeof (*waiters),GFP_TEMPORARY );if (!waiters) goto out_engines;
@@ -254,7 +254,7 @@ static int igt_insert_complete(void *arg) out_bitmap:kfree (bitmap); out_waiters: -drm_free_large (waiters); +kvfree (waiters); out_engines:mock_engine_flush (engine);return err;
@@ -368,7 +368,7 @@ static int igt_wakeup(void *arg)mock_engine_reset (engine); - waiters =drm_malloc_gfp (count,sizeof (*waiters),GFP_TEMPORARY ); + waiters =kvmalloc_array (count,sizeof (*waiters),GFP_TEMPORARY );if (!waiters) goto out_engines;
@@ -454,7 +454,7 @@ static int igt_wakeup(void *arg)put_task_struct (waiters[n].tsk); } -drm_free_large (waiters); +kvfree (waiters); out_engines:mock_engine_flush (engine);return err;
drivers/gpu/drm/msm/msm_gem.c +5 -5
@@ -50,13 +50,13 @@ static struct page **get_pages_vram(struct drm_gem_object *obj,struct page **p;int ret, i; - p =drm_malloc_ab (npages,sizeof (struct page *)); + p =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!p)return ERR_PTR (-ENOMEM ); ret =drm_mm_insert_node (&priv->vram.mm, msm_obj->vram_node, npages);if (ret) { -drm_free_large (p); +kvfree (p);return ERR_PTR (ret); }
@@ -127,7 +127,7 @@ static void put_pages(struct drm_gem_object *obj)drm_gem_put_pages (obj, msm_obj->pages, true, false); else {drm_mm_remove_node (msm_obj->vram_node); -drm_free_large (msm_obj->pages); +kvfree (msm_obj->pages); } msm_obj->pages =NULL ;
@@ -707,7 +707,7 @@ void msm_gem_free_object(struct drm_gem_object *obj)* ours, just free the array we allocated: */ if (msm_obj->pages) -drm_free_large (msm_obj->pages); +kvfree (msm_obj->pages);drm_prime_gem_destroy (obj, msm_obj->sgt); }else {
@@ -863,7 +863,7 @@ struct drm_gem_object *msm_gem_import(struct drm_device *dev, msm_obj =to_msm_bo (obj); msm_obj->sgt = sgt; - msm_obj->pages =drm_malloc_ab (npages,sizeof (struct page *)); + msm_obj->pages =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!msm_obj->pages) { ret = -ENOMEM ; goto fail;
drivers/gpu/drm/radeon/radeon_cs.c +6 -5
@@ -87,7 +87,8 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p) p->dma_reloc_idx =0 ;/* FIXME: we assume that each relocs use 4 dwords */ p->nrelocs = chunk->length_dw /4 ; - p->relocs =drm_calloc_large (p->nrelocs,sizeof (struct radeon_bo_list )); + p->relocs =kvmalloc_array (p->nrelocs,sizeof (struct radeon_bo_list ), +GFP_KERNEL | __GFP_ZERO);if (p->relocs ==NULL ) {return -ENOMEM ; }
@@ -341,7 +342,7 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)continue ; } - p->chunks[i].kdata =drm_malloc_ab (size,sizeof (uint32_t )); + p->chunks[i].kdata =kvmalloc_array (size,sizeof (uint32_t ),GFP_KERNEL ); size *=sizeof (uint32_t );if (p->chunks[i].kdata ==NULL ) {return -ENOMEM ;
@@ -440,10 +441,10 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error, bo } }kfree (parser->track); -drm_free_large (parser->relocs); -drm_free_large (parser->vm_bos); +kvfree (parser->relocs); +kvfree (parser->vm_bos);for (i =0 ; i < parser->nchunks; i++) -drm_free_large (parser->chunks[i].kdata); +kvfree (parser->chunks[i].kdata);kfree (parser->chunks);kfree (parser->chunks_array);radeon_ib_free (parser->rdev, &parser->ib);
drivers/gpu/drm/radeon/radeon_gem.c +1 -1
@@ -587,7 +587,7 @@ static void radeon_gem_va_update_vm(struct radeon_device *rdev,ttm_eu_backoff_reservation (&ticket, &list); error_free: -drm_free_large (vm_bos); +kvfree (vm_bos);if (r && r != -ERESTARTSYS )DRM_ERROR ("Couldn't update BO_VA (%d)\n" , r);
drivers/gpu/drm/radeon/radeon_ring.c +2 -2
@@ -314,7 +314,7 @@ unsigned radeon_ring_backup(struct radeon_device *rdev, struct radeon_ring *ring }/* and then save the content of the ring */ - *data =drm_malloc_ab (size,sizeof (uint32_t )); + *data =kvmalloc_array (size,sizeof (uint32_t ),GFP_KERNEL );if (!*data) {mutex_unlock (&rdev->ring_lock);return 0 ;
@@ -356,7 +356,7 @@ int radeon_ring_restore(struct radeon_device *rdev, struct radeon_ring *ring, }radeon_ring_unlock_commit (rdev, ring, false); -drm_free_large (data); +kvfree (data);return 0 ; }
drivers/gpu/drm/radeon/radeon_vm.c +2 -2
@@ -132,8 +132,8 @@ struct radeon_bo_list *radeon_vm_get_bos(struct radeon_device *rdev,struct radeon_bo_list *list;unsigned i, idx; - list =drm_malloc_ab (vm->max_pde_used +2 , -sizeof (struct radeon_bo_list )); + list =kvmalloc_array (vm->max_pde_used +2 , +sizeof (struct radeon_bo_list ),GFP_KERNEL );if (!list)return NULL ;
drivers/gpu/drm/ttm/ttm_tt.c +7 -6
@@ -39,7 +39,6 @@#include <linux/slab.h> #include <linux/export.h> #include <drm/drm_cache.h> -#include <drm/drm_mem_util.h> #include <drm/ttm/ttm_module.h> #include <drm/ttm/ttm_bo_driver.h> #include <drm/ttm/ttm_placement.h>
@@ -53,14 +52,16 @@*/ static void ttm_tt_alloc_page_directory (struct ttm_tt *ttm) { - ttm->pages =drm_calloc_large (ttm->num_pages,sizeof (void *)); + ttm->pages =kvmalloc_array (ttm->num_pages,sizeof (void *), +GFP_KERNEL | __GFP_ZERO); }static void ttm_dma_tt_alloc_page_directory (struct ttm_dma_tt *ttm) { - ttm->ttm.pages =drm_calloc_large (ttm->ttm.num_pages, + ttm->ttm.pages =kvmalloc_array (ttm->ttm.num_pages,sizeof (*ttm->ttm.pages) + -sizeof (*ttm->dma_address)); +sizeof (*ttm->dma_address), +GFP_KERNEL | __GFP_ZERO); ttm->dma_address = (void *) (ttm->ttm.pages + ttm->ttm.num_pages); }
@@ -208,7 +209,7 @@ EXPORT_SYMBOL(ttm_tt_init);void ttm_tt_fini (struct ttm_tt *ttm) { -drm_free_large (ttm->pages); +kvfree (ttm->pages); ttm->pages =NULL ; }EXPORT_SYMBOL (ttm_tt_fini);
@@ -243,7 +244,7 @@ void ttm_dma_tt_fini(struct ttm_dma_tt *ttm_dma) {struct ttm_tt *ttm = &ttm_dma->ttm; -drm_free_large (ttm->pages); +kvfree (ttm->pages); ttm->pages =NULL ; ttm_dma->dma_address =NULL ; }
drivers/gpu/drm/udl/udl_dmabuf.c +1 -1
@@ -228,7 +228,7 @@ static int udl_prime_create(struct drm_device *dev,return -ENOMEM ; obj->sg = sg; - obj->pages =drm_malloc_ab (npages,sizeof (struct page *)); + obj->pages =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (obj->pages ==NULL ) {DRM_ERROR ("obj pages is NULL %d\n" , npages);return -ENOMEM ;
drivers/gpu/drm/udl/udl_gem.c +1 -1
@@ -146,7 +146,7 @@ int udl_gem_get_pages(struct udl_gem_object *obj)void udl_gem_put_pages (struct udl_gem_object *obj) {if (obj->base.import_attach) { -drm_free_large (obj->pages); +kvfree (obj->pages); obj->pages =NULL ;return ; }
drivers/gpu/drm/vc4/vc4_gem.c +8 -7
@@ -545,14 +545,15 @@ vc4_cl_lookup_bos(struct drm_device *dev,return -EINVAL ; } - exec->bo =drm_calloc_large (exec->bo_count, -sizeof (struct drm_gem_cma_object *)); + exec->bo =kvmalloc_array (exec->bo_count, +sizeof (struct drm_gem_cma_object *), +GFP_KERNEL | __GFP_ZERO);if (!exec->bo) {DRM_ERROR ("Failed to allocate validated BO pointers\n" );return -ENOMEM ; } - handles =drm_malloc_ab (exec->bo_count,sizeof (uint32_t )); + handles =kvmalloc_array (exec->bo_count,sizeof (uint32_t ),GFP_KERNEL );if (!handles) { ret = -ENOMEM ;DRM_ERROR ("Failed to allocate incoming GEM handles\n" );
@@ -584,7 +585,7 @@ vc4_cl_lookup_bos(struct drm_device *dev,spin_unlock (&file_priv->table_lock); fail: -drm_free_large (handles); +kvfree (handles);return ret; }
@@ -622,7 +623,7 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec)* read the contents back for validation, and I think the * bo->vaddr is uncached access. */ - temp =drm_malloc_ab (temp_size,1 ); + temp =kvmalloc_array (temp_size,1 ,GFP_KERNEL );if (!temp) {DRM_ERROR ("Failed to allocate storage for copying " "in bin/render CLs.\n" );
@@ -697,7 +698,7 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec) ret =vc4_wait_for_seqno (dev, exec->bin_dep_seqno, ~0ull , true); fail: -drm_free_large (temp); +kvfree (temp);return ret; }
@@ -710,7 +711,7 @@ vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec)if (exec->bo) {for (i =0 ; i < exec->bo_count; i++)drm_gem_object_unreference_unlocked (&exec->bo[i]->base); -drm_free_large (exec->bo); +kvfree (exec->bo); }while (!list_empty (&exec->unref_list)) {
drivers/gpu/drm/virtio/virtgpu_ioctl.c +14 -13
@@ -119,13 +119,14 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,INIT_LIST_HEAD (&validate_list);if (exbuf->num_bo_handles) { - bo_handles =drm_malloc_ab (exbuf->num_bo_handles, -sizeof (uint32_t )); - buflist =drm_calloc_large (exbuf->num_bo_handles, -sizeof (struct ttm_validate_buffer )); + bo_handles =kvmalloc_array (exbuf->num_bo_handles, +sizeof (uint32_t ),GFP_KERNEL ); + buflist =kvmalloc_array (exbuf->num_bo_handles, +sizeof (struct ttm_validate_buffer ), +GFP_KERNEL | __GFP_ZERO);if (!bo_handles || !buflist) { -drm_free_large (bo_handles); -drm_free_large (buflist); +kvfree (bo_handles); +kvfree (buflist);return -ENOMEM ; }
@@ -133,16 +134,16 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,if (copy_from_user (bo_handles, user_bo_handles, exbuf->num_bo_handles *sizeof (uint32_t ))) { ret = -EFAULT ; -drm_free_large (bo_handles); -drm_free_large (buflist); +kvfree (bo_handles); +kvfree (buflist);return ret; }for (i =0 ; i < exbuf->num_bo_handles; i++) { gobj =drm_gem_object_lookup (drm_file, bo_handles[i]);if (!gobj) { -drm_free_large (bo_handles); -drm_free_large (buflist); +kvfree (bo_handles); +kvfree (buflist);return -ENOENT ; }
@@ -151,7 +152,7 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,list_add (&buflist[i].head, &validate_list); } -drm_free_large (bo_handles); +kvfree (bo_handles); } ret =virtio_gpu_object_list_validate (&ticket, &validate_list);
@@ -171,7 +172,7 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,/* fence the command bo */ virtio_gpu_unref_list (&validate_list); -drm_free_large (buflist); +kvfree (buflist);dma_fence_put (&fence->f);return 0 ;
@@ -179,7 +180,7 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,ttm_eu_backoff_reservation (&ticket, &validate_list); out_free:virtio_gpu_unref_list (&validate_list); -drm_free_large (buflist); +kvfree (buflist);return ret; }
include/drm/drmP.h +0 -1
@@ -70,7 +70,6 @@#include <drm/drm_fourcc.h> #include <drm/drm_global.h> #include <drm/drm_hashtab.h> -#include <drm/drm_mem_util.h> #include <drm/drm_mm.h> #include <drm/drm_os_linux.h> #include <drm/drm_sarea.h>
include/drm/drm_mem_util.h deleted +0 -53
53 lines not on this page · raw message
Signature · 11 lines
2.11.0 -- Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 2/2 -v2] drm: drop drm_[cm]alloc* helpers
Am 17.05.2017 um 14:23 schrieb Michal Hocko:
Quoted 15 lines
As it turned out my allyesconfig on
x86_64wasn't sufficient and 0day build machinery found a failure on arm architecture. It was clearly a typo. Now I have pushed this to my build battery with cross arch compilers and it passes so there shouldn't more surprises hopefully. Here is the v2.
---
From4a00b3ade5ca4514f7affd8de6f7119c8d5c5a86Mon Sep 17 00:00:00 2001
From: Michal Hocko <[email protected]>
Date: Tue, 16 May 2017 11:00:47 +0200
Subject: [PATCH -v2] drm: drop drm_[cm]alloc* helpersNow that drm_[cm]alloc* helpers are simple one line wrappers around
kvmalloc_arrayanddrm_free_largeis just kvfree alias we can drop them and replace by their native forms.
Quoted 8 lines
This shouldn't introduce any functional change.
Changes since v1
- fix typo in drivers/gpu//drm/etnaviv/etnaviv_gem.c - noticed by 0day build robotSuggested-by Daniel Vetter <[email protected]>Signed-off-by Michal Hocko <[email protected]>
Quoted 1,064 lines
--- drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | 16 +++---- drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 19 ++++---- drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 7 +-- drivers/gpu/drm/drm_gem.c | 6 +-- drivers/gpu/drm/etnaviv/etnaviv_gem.c | 12 ++--- drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c | 4 +- drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 12 ++--- drivers/gpu/drm/exynos/exynos_drm_gem.c | 11 +++-- drivers/gpu/drm/i915/i915_debugfs.c | 4 +- drivers/gpu/drm/i915/i915_gem.c | 4 +- drivers/gpu/drm/i915/i915_gem_execbuffer.c | 34 +++++++------- drivers/gpu/drm/i915/i915_gem_gtt.c | 6 +-- drivers/gpu/drm/i915/i915_gem_userptr.c | 8 ++-- drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c | 12 ++--- drivers/gpu/drm/msm/msm_gem.c | 10 ++-- drivers/gpu/drm/radeon/radeon_cs.c | 11 +++-- drivers/gpu/drm/radeon/radeon_gem.c | 2 +- drivers/gpu/drm/radeon/radeon_ring.c | 4 +- drivers/gpu/drm/radeon/radeon_vm.c | 4 +- drivers/gpu/drm/ttm/ttm_tt.c | 13 +++--- drivers/gpu/drm/udl/udl_dmabuf.c | 2 +- drivers/gpu/drm/udl/udl_gem.c | 2 +- drivers/gpu/drm/vc4/vc4_gem.c | 15 +++--- drivers/gpu/drm/virtio/virtgpu_ioctl.c | 27 +++++------ include/drm/drmP.h | 1 - include/drm/drm_mem_util.h | 53 ---------------------- 26 files changed, 126 insertions(+), 173 deletions(-)delete mode 100644
include/drm/drm_mem_util.hdrivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c +8
-8@@ -96,7 +96,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,int r;unsigned long total_size =0 ; - array =drm_malloc_ab (num_entries,sizeof (struct amdgpu_bo_list_entry )); + array =kvmalloc_array (num_entries,sizeof (struct amdgpu_bo_list_entry ),GFP_KERNEL );if (!array)return -ENOMEM ;memset (array,0 , num_entries *sizeof (struct amdgpu_bo_list_entry ));@@ -148,7 +148,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,for (i =0 ; i < list->num_entries; ++i)amdgpu_bo_unref (&list->array[i].robj); -drm_free_large (list->array); +kvfree (list->array); list->gds_obj = gds_obj; list->gws_obj = gws_obj;@@ -163,7 +163,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev, error_free:while (i--)amdgpu_bo_unref (&array[i].robj); -drm_free_large (array); +kvfree (array);return r; }@@ -224,7 +224,7 @@ void amdgpu_bo_list_free(struct amdgpu_bo_list *list)amdgpu_bo_unref (&list->array[i].robj);mutex_destroy (&list->lock); -drm_free_large (list->array); +kvfree (list->array);kfree (list); }@@ -244,8 +244,8 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,int r; - info =drm_malloc_ab (args->in.bo_number, -sizeof (struct drm_amdgpu_bo_list_entry )); + info =kvmalloc_array (args->in.bo_number, +sizeof (struct drm_amdgpu_bo_list_entry ),GFP_KERNEL );if (!info)return -ENOMEM ;@@ -311,11 +311,11 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,memset (args,0 ,sizeof (*args)); args->out.list_handle = handle; -drm_free_large (info); +kvfree (info);return 0 ; error_free: -drm_free_large (info); +kvfree (info);return r; }drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +10
-9@@ -194,7 +194,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) size = p->chunks[i].length_dw; cdata = (void __user *)(uintptr_t )user_chunk.chunk_data; - p->chunks[i].kdata =drm_malloc_ab (size,sizeof (uint32_t )); + p->chunks[i].kdata =kvmalloc_array (size,sizeof (uint32_t ),GFP_KERNEL );if (p->chunks[i].kdata ==NULL ) { ret = -ENOMEM ; i--;@@ -247,7 +247,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) i = p->nchunks -1 ; free_partial_kdata:for (; i >=0 ; i--) -drm_free_large (p->chunks[i].kdata); +kvfree (p->chunks[i].kdata);kfree (p->chunks); p->chunks =NULL ; p->nchunks =0 ;@@ -505,7 +505,7 @@ static int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p,return r;if (binding_userptr) { -drm_free_large (lobj->user_pages); +kvfree (lobj->user_pages); lobj->user_pages =NULL ; } }@@ -571,7 +571,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,release_pages (e->user_pages, e->robj->tbo.ttm->num_pages, false); -drm_free_large (e->user_pages); +kvfree (e->user_pages); e->user_pages =NULL ; }@@ -601,8 +601,9 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,list_for_each_entry (e, &need_pages, tv.head) {struct ttm_tt *ttm = e->robj->tbo.ttm; - e->user_pages =drm_calloc_large (ttm->num_pages, -sizeof (struct page *)); + e->user_pages =kvmalloc_array (ttm->num_pages, +sizeof (struct page *), +GFP_KERNEL | __GFP_ZERO);if (!e->user_pages) { r = -ENOMEM ;DRM_ERROR ("calloc failure in %s\n" , __func__);@@ -612,7 +613,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p, r =amdgpu_ttm_tt_get_user_pages (ttm, e->user_pages);if (r) {DRM_ERROR ("amdgpu_ttm_tt_get_user_pages failed.\n" ); -drm_free_large (e->user_pages); +kvfree (e->user_pages); e->user_pages =NULL ; goto error_free_pages; }@@ -708,7 +709,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,release_pages (e->user_pages, e->robj->tbo.ttm->num_pages, false); -drm_free_large (e->user_pages); +kvfree (e->user_pages); } }@@ -761,7 +762,7 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser, int error, boamdgpu_bo_list_put (parser->bo_list);for (i =0 ; i < parser->nchunks; i++) -drm_free_large (parser->chunks[i].kdata); +kvfree (parser->chunks[i].kdata);kfree (parser->chunks);if (parser->job)amdgpu_job_free (parser->job);drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +4
-3@@ -279,8 +279,9 @@ static int amdgpu_vm_alloc_levels(struct amdgpu_device *adev,if (!parent->entries) {unsigned num_entries =amdgpu_vm_num_entries (adev, level); - parent->entries =drm_calloc_large (num_entries, -sizeof (struct amdgpu_vm_pt )); + parent->entries =kvmalloc_array (num_entries, +sizeof (struct amdgpu_vm_pt ), +GFP_KERNEL | __GFP_ZERO);if (!parent->entries)return -ENOMEM ;memset (parent->entries,0 ,sizeof (struct amdgpu_vm_pt ));@@ -2198,7 +2199,7 @@ static void amdgpu_vm_free_levels(struct amdgpu_vm_pt *level)for (i =0 ; i <= level->last_entry_used; i++)amdgpu_vm_free_levels (&level->entries[i]); -drm_free_large (level->entries); +kvfree (level->entries); }/** drivers/gpu/drm/drm_gem.c +3
-3@@ -521,7 +521,7 @@ struct page **drm_gem_get_pages(struct drm_gem_object *obj) npages = obj->size >>PAGE_SHIFT ; - pages =drm_malloc_ab (npages,sizeof (struct page *)); + pages =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (pages ==NULL )return ERR_PTR (-ENOMEM );@@ -546,7 +546,7 @@ struct page **drm_gem_get_pages(struct drm_gem_object *obj)while (i--)put_page (pages[i]); -drm_free_large (pages); +kvfree (pages);return ERR_CAST (p); }EXPORT_SYMBOL (drm_gem_get_pages);@@ -582,7 +582,7 @@ void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages,put_page (pages[i]); } -drm_free_large (pages); +kvfree (pages); }EXPORT_SYMBOL (drm_gem_put_pages);drivers/gpu/drm/etnaviv/etnaviv_gem.c +6
-6@@ -748,7 +748,7 @@ static struct page **etnaviv_gem_userptr_do_get_pages(uintptr_t ptr;unsigned int flags =0 ; - pvec =drm_malloc_ab (npages,sizeof (struct page *)); + pvec =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!pvec)return ERR_PTR (-ENOMEM );@@ -772,7 +772,7 @@ static struct page **etnaviv_gem_userptr_do_get_pages(if (ret <0 ) {release_pages (pvec, pinned,0 ); -drm_free_large (pvec); +kvfree (pvec);return ERR_PTR (ret); }@@ -823,7 +823,7 @@ static int etnaviv_gem_userptr_get_pages(struct etnaviv_gem_object *etnaviv_obj) mm =get_task_mm (etnaviv_obj->userptr.task); pinned =0 ;if (mm == current->mm) { - pvec =drm_malloc_ab (npages,sizeof (struct page *)); + pvec =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!pvec) {mmput (mm);return -ENOMEM ;@@ -832,7 +832,7 @@ static int etnaviv_gem_userptr_get_pages(struct etnaviv_gem_object *etnaviv_obj) pinned =__get_user_pages_fast (etnaviv_obj->userptr.ptr, npages, !etnaviv_obj->userptr.ro, pvec);if (pinned <0 ) { -drm_free_large (pvec); +kvfree (pvec);mmput (mm);return pinned; }@@ -845,7 +845,7 @@ static int etnaviv_gem_userptr_get_pages(struct etnaviv_gem_object *etnaviv_obj) }release_pages (pvec, pinned,0 ); -drm_free_large (pvec); +kvfree (pvec); work =kmalloc (sizeof (*work),GFP_KERNEL );if (!work) {@@ -879,7 +879,7 @@ static void etnaviv_gem_userptr_release(struct etnaviv_gem_object *etnaviv_obj)int npages = etnaviv_obj->base.size >>PAGE_SHIFT ;release_pages (etnaviv_obj->pages, npages,0 ); -drm_free_large (etnaviv_obj->pages); +kvfree (etnaviv_obj->pages); }put_task_struct (etnaviv_obj->userptr.task); }drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c +2
-2@@ -87,7 +87,7 @@ static void etnaviv_gem_prime_release(struct etnaviv_gem_object *etnaviv_obj)* ours, just free the array we allocated: */ if (etnaviv_obj->pages) -drm_free_large (etnaviv_obj->pages); +kvfree (etnaviv_obj->pages);drm_prime_gem_destroy (&etnaviv_obj->base, etnaviv_obj->sgt); }@@ -128,7 +128,7 @@ struct drm_gem_object *etnaviv_gem_prime_import_sg_table(struct drm_device *dev, npages = size /PAGE_SIZE ; etnaviv_obj->sgt = sgt; - etnaviv_obj->pages =drm_malloc_ab (npages,sizeof (struct page *)); + etnaviv_obj->pages =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!etnaviv_obj->pages) { ret = -ENOMEM ; goto fail;drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c +6
-6@@ -345,9 +345,9 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,* Copy the command submission and bo array to kernel space in * one go, and do this outside of any locks. */ - bos =drm_malloc_ab (args->nr_bos,sizeof (*bos)); - relocs =drm_malloc_ab (args->nr_relocs,sizeof (*relocs)); - stream =drm_malloc_ab (1 , args->stream_size); + bos =kvmalloc_array (args->nr_bos,sizeof (*bos),GFP_KERNEL ); + relocs =kvmalloc_array (args->nr_relocs,sizeof (*relocs),GFP_KERNEL ); + stream =kvmalloc_array (1 , args->stream_size,GFP_KERNEL ); cmdbuf =etnaviv_cmdbuf_new (gpu->cmdbuf_suballoc,ALIGN (args->stream_size,8 ) +8 , args->nr_bos);@@ -489,11 +489,11 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,if (cmdbuf)etnaviv_cmdbuf_free (cmdbuf);if (stream) -drm_free_large (stream); +kvfree (stream);if (bos) -drm_free_large (bos); +kvfree (bos);if (relocs) -drm_free_large (relocs); +kvfree (relocs);return ret; }drivers/gpu/drm/exynos/exynos_drm_gem.c +6
-5@@ -59,7 +59,8 @@ static int exynos_drm_alloc_buf(struct exynos_drm_gem *exynos_gem) nr_pages = exynos_gem->size >>PAGE_SHIFT ; - exynos_gem->pages =drm_calloc_large (nr_pages,sizeof (struct page *)); + exynos_gem->pages =kvmalloc_array (nr_pages,sizeof (struct page *), +GFP_KERNEL | __GFP_ZERO);if (!exynos_gem->pages) {DRM_ERROR ("failed to allocate pages.\n" );return -ENOMEM ;@@ -101,7 +102,7 @@ static int exynos_drm_alloc_buf(struct exynos_drm_gem *exynos_gem)dma_free_attrs (to_dma_dev (dev), exynos_gem->size, exynos_gem->cookie, exynos_gem->dma_addr, exynos_gem->dma_attrs); err_free: -drm_free_large (exynos_gem->pages); +kvfree (exynos_gem->pages);return ret; }@@ -122,7 +123,7 @@ static void exynos_drm_free_buf(struct exynos_drm_gem *exynos_gem) (dma_addr_t )exynos_gem->dma_addr, exynos_gem->dma_attrs); -drm_free_large (exynos_gem->pages); +kvfree (exynos_gem->pages); } static int exynos_drm_gem_handle_create(struct drm_gem_object *obj,@@ -559,7 +560,7 @@ exynos_drm_gem_prime_import_sg_table(struct drm_device *dev, exynos_gem->dma_addr =sg_dma_address (sgt->sgl); npages = exynos_gem->size >>PAGE_SHIFT ; - exynos_gem->pages =drm_malloc_ab (npages,sizeof (struct page *)); + exynos_gem->pages =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!exynos_gem->pages) { ret = -ENOMEM ; goto err;@@ -588,7 +589,7 @@ exynos_drm_gem_prime_import_sg_table(struct drm_device *dev,return &exynos_gem->base; err_free_large: -drm_free_large (exynos_gem->pages); +kvfree (exynos_gem->pages); err:drm_gem_object_release (&exynos_gem->base);kfree (exynos_gem);drivers/gpu/drm/i915/i915_debugfs.c +2
-2@@ -229,7 +229,7 @@ static int i915_gem_stolen_list_info(struct seq_file *m, void *data)int ret; total =READ_ONCE (dev_priv->mm.object_count); - objects =drm_malloc_ab (total,sizeof (*objects)); + objects =kvmalloc_array (total,sizeof (*objects),GFP_KERNEL );if (!objects)return -ENOMEM ;@@ -274,7 +274,7 @@ static int i915_gem_stolen_list_info(struct seq_file *m, void *data)mutex_unlock (&dev->struct_mutex); out: -drm_free_large (objects); +kvfree (objects);return ret; }drivers/gpu/drm/i915/i915_gem.c +2
-2@@ -2556,7 +2556,7 @@ static void *i915_gem_object_map(const struct drm_i915_gem_object *obj,if (n_pages >ARRAY_SIZE (stack_pages)) {/* Too big for stack -- allocate temporary array instead */ - pages =drm_malloc_gfp (n_pages,sizeof (*pages),GFP_TEMPORARY ); + pages =kvmalloc_array (n_pages,sizeof (*pages),GFP_TEMPORARY );if (!pages)return NULL ; }@@ -2578,7 +2578,7 @@ static void *i915_gem_object_map(const struct drm_i915_gem_object *obj, addr =vmap (pages, n_pages,0 , pgprot);if (pages != stack_pages) -drm_free_large (pages); +kvfree (pages);return addr; }drivers/gpu/drm/i915/i915_gem_execbuffer.c +17
-17@@ -1019,11 +1019,11 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,for (i =0 ; i < count; i++) total += exec[i].relocation_count; - reloc_offset =drm_malloc_ab (count,sizeof (*reloc_offset)); - reloc =drm_malloc_ab (total,sizeof (*reloc)); + reloc_offset =kvmalloc_array (count,sizeof (*reloc_offset),GFP_KERNEL ); + reloc =kvmalloc_array (total,sizeof (*reloc),GFP_KERNEL );if (reloc ==NULL || reloc_offset ==NULL ) { -drm_free_large (reloc); -drm_free_large (reloc_offset); +kvfree (reloc); +kvfree (reloc_offset);mutex_lock (&dev->struct_mutex);return -ENOMEM ; }@@ -1099,8 +1099,8 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,*/ err: -drm_free_large (reloc); -drm_free_large (reloc_offset); +kvfree (reloc); +kvfree (reloc_offset);return ret; }@@ -1871,13 +1871,13 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, }/* Copy in the exec list from userland */ - exec_list =drm_malloc_ab (sizeof (*exec_list), args->buffer_count); - exec2_list =drm_malloc_ab (sizeof (*exec2_list), args->buffer_count); + exec_list =kvmalloc_array (sizeof (*exec_list), args->buffer_count,GFP_KERNEL ); + exec2_list =kvmalloc_array (sizeof (*exec2_list), args->buffer_count,GFP_KERNEL );if (exec_list ==NULL || exec2_list ==NULL ) {DRM_DEBUG ("Failed to allocate exec list for %d buffers\n" , args->buffer_count); -drm_free_large (exec_list); -drm_free_large (exec2_list); +kvfree (exec_list); +kvfree (exec2_list);return -ENOMEM ; } ret = copy_from_user(exec_list,@@ -1886,8 +1886,8 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,if (ret !=0 ) {DRM_DEBUG ("copy %d exec entries failed %d\n" , args->buffer_count, ret); -drm_free_large (exec_list); -drm_free_large (exec2_list); +kvfree (exec_list); +kvfree (exec2_list);return -EFAULT ; }@@ -1936,8 +1936,8 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, } } -drm_free_large (exec_list); -drm_free_large (exec2_list); +kvfree (exec_list); +kvfree (exec2_list);return ret; }@@ -1955,7 +1955,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,return -EINVAL ; } - exec2_list =drm_malloc_gfp (args->buffer_count, + exec2_list =kvmalloc_array (args->buffer_count,sizeof (*exec2_list),GFP_TEMPORARY );if (exec2_list ==NULL ) {@@ -1969,7 +1969,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,if (ret !=0 ) {DRM_DEBUG ("copy %d exec entries failed %d\n" , args->buffer_count, ret); -drm_free_large (exec2_list); +kvfree (exec2_list);return -EFAULT ; }@@ -1996,6 +1996,6 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data, } } -drm_free_large (exec2_list); +kvfree (exec2_list);return ret; }drivers/gpu/drm/i915/i915_gem_gtt.c +3
-3@@ -3114,7 +3114,7 @@ intel_rotate_pages(struct intel_rotation_info *rot_info,int ret = -ENOMEM ;/* Allocate a temporary list of source pages for random access. */ - page_addr_list =drm_malloc_gfp (n_pages, + page_addr_list =kvmalloc_array (n_pages,sizeof (dma_addr_t),GFP_TEMPORARY );if (!page_addr_list)@@ -3147,14 +3147,14 @@ intel_rotate_pages(struct intel_rotation_info *rot_info,DRM_DEBUG_KMS ("Created rotated page mapping for object size %zu (%ux%u tiles, %u pages)\n" , obj->base.size, rot_info->plane[0 ].width, rot_info->plane[0 ].height, size); -drm_free_large (page_addr_list); +kvfree (page_addr_list);return st; err_sg_alloc:kfree (st); err_st_alloc: -drm_free_large (page_addr_list); +kvfree (page_addr_list);DRM_DEBUG_KMS ("Failed to create rotated mapping for object size %zu! (%ux%u tiles, %u pages)\n" , obj->base.size, rot_info->plane[0 ].width, rot_info->plane[0 ].height, size);drivers/gpu/drm/i915/i915_gem_userptr.c +4
-4@@ -507,7 +507,7 @@ __i915_gem_userptr_get_pages_worker(struct work_struct *_work) ret = -ENOMEM ; pinned =0 ; - pvec =drm_malloc_gfp (npages,sizeof (struct page *),GFP_TEMPORARY ); + pvec =kvmalloc_array (npages,sizeof (struct page *),GFP_TEMPORARY );if (pvec !=NULL ) {struct mm_struct *mm = obj->userptr.mm->mm;unsigned int flags =0 ;@@ -555,7 +555,7 @@ __i915_gem_userptr_get_pages_worker(struct work_struct *_work)mutex_unlock (&obj->mm.lock);release_pages (pvec, pinned,0 ); -drm_free_large (pvec); +kvfree (pvec);i915_gem_object_put (obj);put_task_struct (work->task);@@ -642,7 +642,7 @@ i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj) pinned =0 ;if (mm == current->mm) { - pvec =drm_malloc_gfp (num_pages,sizeof (struct page *), + pvec =kvmalloc_array (num_pages,sizeof (struct page *),GFP_TEMPORARY | __GFP_NORETRY | __GFP_NOWARN);@@ -669,7 +669,7 @@ i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj)if (IS_ERR (pages))release_pages (pvec, pinned,0 ); -drm_free_large (pvec); +kvfree (pvec);return pages; }drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c +6
-6@@ -117,7 +117,7 @@ static int igt_random_insert_remove(void *arg)mock_engine_reset (engine); - waiters =drm_malloc_gfp (count,sizeof (*waiters),GFP_TEMPORARY ); + waiters =kvmalloc_array (count,sizeof (*waiters),GFP_TEMPORARY );if (!waiters) goto out_engines;@@ -169,7 +169,7 @@ static int igt_random_insert_remove(void *arg) out_bitmap:kfree (bitmap); out_waiters: -drm_free_large (waiters); +kvfree (waiters); out_engines:mock_engine_flush (engine);return err;@@ -187,7 +187,7 @@ static int igt_insert_complete(void *arg)mock_engine_reset (engine); - waiters =drm_malloc_gfp (count,sizeof (*waiters),GFP_TEMPORARY ); + waiters =kvmalloc_array (count,sizeof (*waiters),GFP_TEMPORARY );if (!waiters) goto out_engines;@@ -254,7 +254,7 @@ static int igt_insert_complete(void *arg) out_bitmap:kfree (bitmap); out_waiters: -drm_free_large (waiters); +kvfree (waiters); out_engines:mock_engine_flush (engine);return err;@@ -368,7 +368,7 @@ static int igt_wakeup(void *arg)mock_engine_reset (engine); - waiters =drm_malloc_gfp (count,sizeof (*waiters),GFP_TEMPORARY ); + waiters =kvmalloc_array (count,sizeof (*waiters),GFP_TEMPORARY );if (!waiters) goto out_engines;@@ -454,7 +454,7 @@ static int igt_wakeup(void *arg)put_task_struct (waiters[n].tsk); } -drm_free_large (waiters); +kvfree (waiters); out_engines:mock_engine_flush (engine);return err;drivers/gpu/drm/msm/msm_gem.c +5
-5@@ -50,13 +50,13 @@ static struct page **get_pages_vram(struct drm_gem_object *obj,struct page **p;int ret, i; - p =drm_malloc_ab (npages,sizeof (struct page *)); + p =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!p)return ERR_PTR (-ENOMEM ); ret =drm_mm_insert_node (&priv->vram.mm, msm_obj->vram_node, npages);if (ret) { -drm_free_large (p); +kvfree (p);return ERR_PTR (ret); }@@ -127,7 +127,7 @@ static void put_pages(struct drm_gem_object *obj)drm_gem_put_pages (obj, msm_obj->pages, true, false); else {drm_mm_remove_node (msm_obj->vram_node); -drm_free_large (msm_obj->pages); +kvfree (msm_obj->pages); } msm_obj->pages =NULL ;@@ -707,7 +707,7 @@ void msm_gem_free_object(struct drm_gem_object *obj)* ours, just free the array we allocated: */ if (msm_obj->pages) -drm_free_large (msm_obj->pages); +kvfree (msm_obj->pages);drm_prime_gem_destroy (obj, msm_obj->sgt); }else {@@ -863,7 +863,7 @@ struct drm_gem_object *msm_gem_import(struct drm_device *dev, msm_obj =to_msm_bo (obj); msm_obj->sgt = sgt; - msm_obj->pages =drm_malloc_ab (npages,sizeof (struct page *)); + msm_obj->pages =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!msm_obj->pages) { ret = -ENOMEM ; goto fail;drivers/gpu/drm/radeon/radeon_cs.c +6
-5@@ -87,7 +87,8 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p) p->dma_reloc_idx =0 ;/* FIXME: we assume that each relocs use 4 dwords */ p->nrelocs = chunk->length_dw /4 ; - p->relocs =drm_calloc_large (p->nrelocs,sizeof (struct radeon_bo_list )); + p->relocs =kvmalloc_array (p->nrelocs,sizeof (struct radeon_bo_list ), +GFP_KERNEL | __GFP_ZERO);if (p->relocs ==NULL ) {return -ENOMEM ; }@@ -341,7 +342,7 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)continue ; } - p->chunks[i].kdata =drm_malloc_ab (size,sizeof (uint32_t )); + p->chunks[i].kdata =kvmalloc_array (size,sizeof (uint32_t ),GFP_KERNEL ); size *=sizeof (uint32_t );if (p->chunks[i].kdata ==NULL ) {return -ENOMEM ;@@ -440,10 +441,10 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error, bo } }kfree (parser->track); -drm_free_large (parser->relocs); -drm_free_large (parser->vm_bos); +kvfree (parser->relocs); +kvfree (parser->vm_bos);for (i =0 ; i < parser->nchunks; i++) -drm_free_large (parser->chunks[i].kdata); +kvfree (parser->chunks[i].kdata);kfree (parser->chunks);kfree (parser->chunks_array);radeon_ib_free (parser->rdev, &parser->ib);drivers/gpu/drm/radeon/radeon_gem.c +1
-1@@ -587,7 +587,7 @@ static void radeon_gem_va_update_vm(struct radeon_device *rdev,ttm_eu_backoff_reservation (&ticket, &list); error_free: -drm_free_large (vm_bos); +kvfree (vm_bos);if (r && r != -ERESTARTSYS )DRM_ERROR ("Couldn't update BO_VA (%d)\n" , r);drivers/gpu/drm/radeon/radeon_ring.c +2
-2@@ -314,7 +314,7 @@ unsigned radeon_ring_backup(struct radeon_device *rdev, struct radeon_ring *ring }/* and then save the content of the ring */ - *data =drm_malloc_ab (size,sizeof (uint32_t )); + *data =kvmalloc_array (size,sizeof (uint32_t ),GFP_KERNEL );if (!*data) {mutex_unlock (&rdev->ring_lock);return 0 ;@@ -356,7 +356,7 @@ int radeon_ring_restore(struct radeon_device *rdev, struct radeon_ring *ring, }radeon_ring_unlock_commit (rdev, ring, false); -drm_free_large (data); +kvfree (data);return 0 ; }drivers/gpu/drm/radeon/radeon_vm.c +2
-2@@ -132,8 +132,8 @@ struct radeon_bo_list *radeon_vm_get_bos(struct radeon_device *rdev,struct radeon_bo_list *list;unsigned i, idx; - list =drm_malloc_ab (vm->max_pde_used +2 , -sizeof (struct radeon_bo_list )); + list =kvmalloc_array (vm->max_pde_used +2 , +sizeof (struct radeon_bo_list ),GFP_KERNEL );if (!list)return NULL ;drivers/gpu/drm/ttm/ttm_tt.c +7
-6@@ -39,7 +39,6 @@#include <linux/slab.h> #include <linux/export.h> #include <drm/drm_cache.h> -#include <drm/drm_mem_util.h> #include <drm/ttm/ttm_module.h> #include <drm/ttm/ttm_bo_driver.h> #include <drm/ttm/ttm_placement.h> @@ -53,14 +52,16 @@*/ static void ttm_tt_alloc_page_directory (struct ttm_tt *ttm) { - ttm->pages =drm_calloc_large (ttm->num_pages,sizeof (void *)); + ttm->pages =kvmalloc_array (ttm->num_pages,sizeof (void *), +GFP_KERNEL | __GFP_ZERO); }static void ttm_dma_tt_alloc_page_directory (struct ttm_dma_tt *ttm) { - ttm->ttm.pages =drm_calloc_large (ttm->ttm.num_pages, + ttm->ttm.pages =kvmalloc_array (ttm->ttm.num_pages,sizeof (*ttm->ttm.pages) + -sizeof (*ttm->dma_address)); +sizeof (*ttm->dma_address), +GFP_KERNEL | __GFP_ZERO); ttm->dma_address = (void *) (ttm->ttm.pages + ttm->ttm.num_pages); }@@ -208,7 +209,7 @@ EXPORT_SYMBOL(ttm_tt_init);void ttm_tt_fini (struct ttm_tt *ttm) { -drm_free_large (ttm->pages); +kvfree (ttm->pages); ttm->pages =NULL ; }EXPORT_SYMBOL (ttm_tt_fini);@@ -243,7 +244,7 @@ void ttm_dma_tt_fini(struct ttm_dma_tt *ttm_dma) {struct ttm_tt *ttm = &ttm_dma->ttm; -drm_free_large (ttm->pages); +kvfree (ttm->pages); ttm->pages =NULL ; ttm_dma->dma_address =NULL ; }drivers/gpu/drm/udl/udl_dmabuf.c +1
-1@@ -228,7 +228,7 @@ static int udl_prime_create(struct drm_device *dev,return -ENOMEM ; obj->sg = sg; - obj->pages =drm_malloc_ab (npages,sizeof (struct page *)); + obj->pages =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (obj->pages ==NULL ) {DRM_ERROR ("obj pages is NULL %d\n" , npages);return -ENOMEM ;drivers/gpu/drm/udl/udl_gem.c +1
-1@@ -146,7 +146,7 @@ int udl_gem_get_pages(struct udl_gem_object *obj)void udl_gem_put_pages (struct udl_gem_object *obj) {if (obj->base.import_attach) { -drm_free_large (obj->pages); +kvfree (obj->pages); obj->pages =NULL ;return ; }drivers/gpu/drm/vc4/vc4_gem.c +8
-7@@ -545,14 +545,15 @@ vc4_cl_lookup_bos(struct drm_device *dev,return -EINVAL ; } - exec->bo =drm_calloc_large (exec->bo_count, -sizeof (struct drm_gem_cma_object *)); + exec->bo =kvmalloc_array (exec->bo_count, +sizeof (struct drm_gem_cma_object *), +GFP_KERNEL | __GFP_ZERO);if (!exec->bo) {DRM_ERROR ("Failed to allocate validated BO pointers\n" );return -ENOMEM ; } - handles =drm_malloc_ab (exec->bo_count,sizeof (uint32_t )); + handles =kvmalloc_array (exec->bo_count,sizeof (uint32_t ),GFP_KERNEL );if (!handles) { ret = -ENOMEM ;DRM_ERROR ("Failed to allocate incoming GEM handles\n" );@@ -584,7 +585,7 @@ vc4_cl_lookup_bos(struct drm_device *dev,spin_unlock (&file_priv->table_lock); fail: -drm_free_large (handles); +kvfree (handles);return ret; }@@ -622,7 +623,7 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec)* read the contents back for validation, and I think the * bo->vaddr is uncached access. */ - temp =drm_malloc_ab (temp_size,1 ); + temp =kvmalloc_array (temp_size,1 ,GFP_KERNEL );if (!temp) {DRM_ERROR ("Failed to allocate storage for copying " "in bin/render CLs.\n" );@@ -697,7 +698,7 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec) ret =vc4_wait_for_seqno (dev, exec->bin_dep_seqno, ~0ull , true); fail: -drm_free_large (temp); +kvfree (temp);return ret; }@@ -710,7 +711,7 @@ vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec)if (exec->bo) {for (i =0 ; i < exec->bo_count; i++)drm_gem_object_unreference_unlocked (&exec->bo[i]->base); -drm_free_large (exec->bo); +kvfree (exec->bo); }while (!list_empty (&exec->unref_list)) {drivers/gpu/drm/virtio/virtgpu_ioctl.c +14
-13@@ -119,13 +119,14 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,INIT_LIST_HEAD (&validate_list);if (exbuf->num_bo_handles) { - bo_handles =drm_malloc_ab (exbuf->num_bo_handles, -sizeof (uint32_t )); - buflist =drm_calloc_large (exbuf->num_bo_handles, -sizeof (struct ttm_validate_buffer )); + bo_handles =kvmalloc_array (exbuf->num_bo_handles, +sizeof (uint32_t ),GFP_KERNEL ); + buflist =kvmalloc_array (exbuf->num_bo_handles, +sizeof (struct ttm_validate_buffer ), +GFP_KERNEL | __GFP_ZERO);if (!bo_handles || !buflist) { -drm_free_large (bo_handles); -drm_free_large (buflist); +kvfree (bo_handles); +kvfree (buflist);return -ENOMEM ; }@@ -133,16 +134,16 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,if (copy_from_user (bo_handles, user_bo_handles, exbuf->num_bo_handles *sizeof (uint32_t ))) { ret = -EFAULT ; -drm_free_large (bo_handles); -drm_free_large (buflist); +kvfree (bo_handles); +kvfree (buflist);return ret; }for (i =0 ; i < exbuf->num_bo_handles; i++) { gobj =drm_gem_object_lookup (drm_file, bo_handles[i]);if (!gobj) { -drm_free_large (bo_handles); -drm_free_large (buflist); +kvfree (bo_handles); +kvfree (buflist);return -ENOENT ; }@@ -151,7 +152,7 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,list_add (&buflist[i].head, &validate_list); } -drm_free_large (bo_handles); +kvfree (bo_handles); } ret =virtio_gpu_object_list_validate (&ticket, &validate_list);@@ -171,7 +172,7 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,/* fence the command bo */ virtio_gpu_unref_list (&validate_list); -drm_free_large (buflist); +kvfree (buflist);dma_fence_put (&fence->f);return 0 ;@@ -179,7 +180,7 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,ttm_eu_backoff_reservation (&ticket, &validate_list); out_free:virtio_gpu_unref_list (&validate_list); -drm_free_large (buflist); +kvfree (buflist);return ret; }include/drm/drmP.h +0
-1@@ -70,7 +70,6 @@#include <drm/drm_fourcc.h> #include <drm/drm_global.h> #include <drm/drm_hashtab.h> -#include <drm/drm_mem_util.h> #include <drm/drm_mm.h> #include <drm/drm_os_linux.h> #include <drm/drm_sarea.h> include/drm/drm_mem_util.h deleted +0
-43@@ -1,53 +0,0 @@ -/* -* Copyright © 2008 Intel Corporation -* -* Permission is hereby granted, free of charge, to any person obtaining a -* copy of this software and associated documentation files (the "Software"), -* to deal in the Software without restriction, including without limitation -* the rights to use, copy, modify, merge, publish, distribute, sublicense, -* and/or sell copies of the Software, and to permit persons to whom the -* Software is furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice (including the next -* paragraph) shall be included in all copies or substantial portions of the -* Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -* IN THE SOFTWARE. -* -* Authors: -* Jesse Barnes <[email protected]> -* -*/ -#ifndef _DRM_MEM_UTIL_H_ -#define _DRM_MEM_UTIL_H_ - -#include <linux/vmalloc.h> - -static __inline__void *drm_calloc_large (size_t nmemb,size_t size) -{ -return kvmalloc_array (nmemb, size,GFP_KERNEL | __GFP_ZERO); -} - -/* Modeled after cairo's malloc_ab, it's like calloc but without the zeroing. */ -static __inline__void *drm_malloc_ab (size_t nmemb,size_t size) -{ -return kvmalloc_array (nmemb, size,GFP_KERNEL ); -} - -static __inline__void *drm_malloc_gfp (size_t nmemb,size_t size,gfp_t gfp)
include/drm/drm_mem_util.h line 53
Quoted 10 lines
include/drm/drm_mem_util.h deleted +0
-10-{ -return kvmalloc_array (nmemb, size, gfp); -} - -static __inlinevoid drm_free_large (void *ptr) -{ -kvfree (ptr); -} - -#endif
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 2/2 -v2] drm: drop drm_[cm]alloc* helpers
Quoted 18 lines · Christian König
Am 17.05.2017 um 14:23 schrieb Michal Hocko:
Quoted 17 lines
As it turned out my allyesconfig on
x86_64wasn't sufficient and 0day build machinery found a failure on arm architecture. It was clearly a typo. Now I have pushed this to my build battery with cross arch compilers and it passes so there shouldn't more surprises hopefully. Here is the v2.
---
From4a00b3ade5ca4514f7affd8de6f7119c8d5c5a86Mon Sep 17 00:00:00 2001
From: Michal Hocko <[email protected]>
Date: Tue, 16 May 2017 11:00:47 +0200
Subject: [PATCH -v2] drm: drop drm_[cm]alloc* helpersNow that drm_[cm]alloc* helpers are simple one line wrappers around
kvmalloc_arrayanddrm_free_largeis just kvfree alias we can drop them and replace by their native forms.This shouldn't introduce any functional change.
Quoted 8 lines
Quoted 6 lines
Changes since v1
- fix typo in drivers/gpu//drm/etnaviv/etnaviv_gem.c - noticed by 0day build robotSuggested-by Daniel Vetter <[email protected]>Signed-off-by Michal Hocko <[email protected]>Acked-by Christian König <[email protected]>
Found another conflict in vgem (grew another user there in-between), fixed that up and applied both patches to drm-misc-next.
Thanks, Daniel
Quoted 964 lines
Quoted 948 lines
--- drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | 16 +++---- drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 19 ++++---- drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 7 +-- drivers/gpu/drm/drm_gem.c | 6 +-- drivers/gpu/drm/etnaviv/etnaviv_gem.c | 12 ++--- drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c | 4 +- drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 12 ++--- drivers/gpu/drm/exynos/exynos_drm_gem.c | 11 +++-- drivers/gpu/drm/i915/i915_debugfs.c | 4 +- drivers/gpu/drm/i915/i915_gem.c | 4 +- drivers/gpu/drm/i915/i915_gem_execbuffer.c | 34 +++++++------- drivers/gpu/drm/i915/i915_gem_gtt.c | 6 +-- drivers/gpu/drm/i915/i915_gem_userptr.c | 8 ++-- drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c | 12 ++--- drivers/gpu/drm/msm/msm_gem.c | 10 ++-- drivers/gpu/drm/radeon/radeon_cs.c | 11 +++-- drivers/gpu/drm/radeon/radeon_gem.c | 2 +- drivers/gpu/drm/radeon/radeon_ring.c | 4 +- drivers/gpu/drm/radeon/radeon_vm.c | 4 +- drivers/gpu/drm/ttm/ttm_tt.c | 13 +++--- drivers/gpu/drm/udl/udl_dmabuf.c | 2 +- drivers/gpu/drm/udl/udl_gem.c | 2 +- drivers/gpu/drm/vc4/vc4_gem.c | 15 +++--- drivers/gpu/drm/virtio/virtgpu_ioctl.c | 27 +++++------ include/drm/drmP.h | 1 - include/drm/drm_mem_util.h | 53 ---------------------- 26 files changed, 126 insertions(+), 173 deletions(-)delete mode 100644
include/drm/drm_mem_util.hdrivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c +8
-8@@ -96,7 +96,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,int r;unsigned long total_size =0 ; - array =drm_malloc_ab (num_entries,sizeof (struct amdgpu_bo_list_entry )); + array =kvmalloc_array (num_entries,sizeof (struct amdgpu_bo_list_entry ),GFP_KERNEL );if (!array)return -ENOMEM ;memset (array,0 , num_entries *sizeof (struct amdgpu_bo_list_entry ));@@ -148,7 +148,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,for (i =0 ; i < list->num_entries; ++i)amdgpu_bo_unref (&list->array[i].robj); -drm_free_large (list->array); +kvfree (list->array); list->gds_obj = gds_obj; list->gws_obj = gws_obj;@@ -163,7 +163,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev, error_free:while (i--)amdgpu_bo_unref (&array[i].robj); -drm_free_large (array); +kvfree (array);return r; }@@ -224,7 +224,7 @@ void amdgpu_bo_list_free(struct amdgpu_bo_list *list)amdgpu_bo_unref (&list->array[i].robj);mutex_destroy (&list->lock); -drm_free_large (list->array); +kvfree (list->array);kfree (list); }@@ -244,8 +244,8 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,int r; - info =drm_malloc_ab (args->in.bo_number, -sizeof (struct drm_amdgpu_bo_list_entry )); + info =kvmalloc_array (args->in.bo_number, +sizeof (struct drm_amdgpu_bo_list_entry ),GFP_KERNEL );if (!info)return -ENOMEM ;@@ -311,11 +311,11 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,memset (args,0 ,sizeof (*args)); args->out.list_handle = handle; -drm_free_large (info); +kvfree (info);return 0 ; error_free: -drm_free_large (info); +kvfree (info);return r; }drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +10
-9@@ -194,7 +194,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) size = p->chunks[i].length_dw; cdata = (void __user *)(uintptr_t )user_chunk.chunk_data; - p->chunks[i].kdata =drm_malloc_ab (size,sizeof (uint32_t )); + p->chunks[i].kdata =kvmalloc_array (size,sizeof (uint32_t ),GFP_KERNEL );if (p->chunks[i].kdata ==NULL ) { ret = -ENOMEM ; i--;@@ -247,7 +247,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) i = p->nchunks -1 ; free_partial_kdata:for (; i >=0 ; i--) -drm_free_large (p->chunks[i].kdata); +kvfree (p->chunks[i].kdata);kfree (p->chunks); p->chunks =NULL ; p->nchunks =0 ;@@ -505,7 +505,7 @@ static int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p,return r;if (binding_userptr) { -drm_free_large (lobj->user_pages); +kvfree (lobj->user_pages); lobj->user_pages =NULL ; } }@@ -571,7 +571,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,release_pages (e->user_pages, e->robj->tbo.ttm->num_pages, false); -drm_free_large (e->user_pages); +kvfree (e->user_pages); e->user_pages =NULL ; }@@ -601,8 +601,9 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,list_for_each_entry (e, &need_pages, tv.head) {struct ttm_tt *ttm = e->robj->tbo.ttm; - e->user_pages =drm_calloc_large (ttm->num_pages, -sizeof (struct page *)); + e->user_pages =kvmalloc_array (ttm->num_pages, +sizeof (struct page *), +GFP_KERNEL | __GFP_ZERO);if (!e->user_pages) { r = -ENOMEM ;DRM_ERROR ("calloc failure in %s\n" , __func__);@@ -612,7 +613,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p, r =amdgpu_ttm_tt_get_user_pages (ttm, e->user_pages);if (r) {DRM_ERROR ("amdgpu_ttm_tt_get_user_pages failed.\n" ); -drm_free_large (e->user_pages); +kvfree (e->user_pages); e->user_pages =NULL ; goto error_free_pages; }@@ -708,7 +709,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,release_pages (e->user_pages, e->robj->tbo.ttm->num_pages, false); -drm_free_large (e->user_pages); +kvfree (e->user_pages); } }@@ -761,7 +762,7 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser, int error, boamdgpu_bo_list_put (parser->bo_list);for (i =0 ; i < parser->nchunks; i++) -drm_free_large (parser->chunks[i].kdata); +kvfree (parser->chunks[i].kdata);kfree (parser->chunks);if (parser->job)amdgpu_job_free (parser->job);drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +4
-3@@ -279,8 +279,9 @@ static int amdgpu_vm_alloc_levels(struct amdgpu_device *adev,if (!parent->entries) {unsigned num_entries =amdgpu_vm_num_entries (adev, level); - parent->entries =drm_calloc_large (num_entries, -sizeof (struct amdgpu_vm_pt )); + parent->entries =kvmalloc_array (num_entries, +sizeof (struct amdgpu_vm_pt ), +GFP_KERNEL | __GFP_ZERO);if (!parent->entries)return -ENOMEM ;memset (parent->entries,0 ,sizeof (struct amdgpu_vm_pt ));@@ -2198,7 +2199,7 @@ static void amdgpu_vm_free_levels(struct amdgpu_vm_pt *level)for (i =0 ; i <= level->last_entry_used; i++)amdgpu_vm_free_levels (&level->entries[i]); -drm_free_large (level->entries); +kvfree (level->entries); }/** drivers/gpu/drm/drm_gem.c +3
-3@@ -521,7 +521,7 @@ struct page **drm_gem_get_pages(struct drm_gem_object *obj) npages = obj->size >>PAGE_SHIFT ; - pages =drm_malloc_ab (npages,sizeof (struct page *)); + pages =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (pages ==NULL )return ERR_PTR (-ENOMEM );@@ -546,7 +546,7 @@ struct page **drm_gem_get_pages(struct drm_gem_object *obj)while (i--)put_page (pages[i]); -drm_free_large (pages); +kvfree (pages);return ERR_CAST (p); }EXPORT_SYMBOL (drm_gem_get_pages);@@ -582,7 +582,7 @@ void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages,put_page (pages[i]); } -drm_free_large (pages); +kvfree (pages); }EXPORT_SYMBOL (drm_gem_put_pages);drivers/gpu/drm/etnaviv/etnaviv_gem.c +6
-6@@ -748,7 +748,7 @@ static struct page **etnaviv_gem_userptr_do_get_pages(uintptr_t ptr;unsigned int flags =0 ; - pvec =drm_malloc_ab (npages,sizeof (struct page *)); + pvec =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!pvec)return ERR_PTR (-ENOMEM );@@ -772,7 +772,7 @@ static struct page **etnaviv_gem_userptr_do_get_pages(if (ret <0 ) {release_pages (pvec, pinned,0 ); -drm_free_large (pvec); +kvfree (pvec);return ERR_PTR (ret); }@@ -823,7 +823,7 @@ static int etnaviv_gem_userptr_get_pages(struct etnaviv_gem_object *etnaviv_obj) mm =get_task_mm (etnaviv_obj->userptr.task); pinned =0 ;if (mm == current->mm) { - pvec =drm_malloc_ab (npages,sizeof (struct page *)); + pvec =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!pvec) {mmput (mm);return -ENOMEM ;@@ -832,7 +832,7 @@ static int etnaviv_gem_userptr_get_pages(struct etnaviv_gem_object *etnaviv_obj) pinned =__get_user_pages_fast (etnaviv_obj->userptr.ptr, npages, !etnaviv_obj->userptr.ro, pvec);if (pinned <0 ) { -drm_free_large (pvec); +kvfree (pvec);mmput (mm);return pinned; }@@ -845,7 +845,7 @@ static int etnaviv_gem_userptr_get_pages(struct etnaviv_gem_object *etnaviv_obj) }release_pages (pvec, pinned,0 ); -drm_free_large (pvec); +kvfree (pvec); work =kmalloc (sizeof (*work),GFP_KERNEL );if (!work) {@@ -879,7 +879,7 @@ static void etnaviv_gem_userptr_release(struct etnaviv_gem_object *etnaviv_obj)int npages = etnaviv_obj->base.size >>PAGE_SHIFT ;release_pages (etnaviv_obj->pages, npages,0 ); -drm_free_large (etnaviv_obj->pages); +kvfree (etnaviv_obj->pages); }put_task_struct (etnaviv_obj->userptr.task); }drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c +2
-2@@ -87,7 +87,7 @@ static void etnaviv_gem_prime_release(struct etnaviv_gem_object *etnaviv_obj)* ours, just free the array we allocated: */ if (etnaviv_obj->pages) -drm_free_large (etnaviv_obj->pages); +kvfree (etnaviv_obj->pages);drm_prime_gem_destroy (&etnaviv_obj->base, etnaviv_obj->sgt); }@@ -128,7 +128,7 @@ struct drm_gem_object *etnaviv_gem_prime_import_sg_table(struct drm_device *dev, npages = size /PAGE_SIZE ; etnaviv_obj->sgt = sgt; - etnaviv_obj->pages =drm_malloc_ab (npages,sizeof (struct page *)); + etnaviv_obj->pages =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!etnaviv_obj->pages) { ret = -ENOMEM ; goto fail;drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c +6
-6@@ -345,9 +345,9 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,* Copy the command submission and bo array to kernel space in * one go, and do this outside of any locks. */ - bos =drm_malloc_ab (args->nr_bos,sizeof (*bos)); - relocs =drm_malloc_ab (args->nr_relocs,sizeof (*relocs)); - stream =drm_malloc_ab (1 , args->stream_size); + bos =kvmalloc_array (args->nr_bos,sizeof (*bos),GFP_KERNEL ); + relocs =kvmalloc_array (args->nr_relocs,sizeof (*relocs),GFP_KERNEL ); + stream =kvmalloc_array (1 , args->stream_size,GFP_KERNEL ); cmdbuf =etnaviv_cmdbuf_new (gpu->cmdbuf_suballoc,ALIGN (args->stream_size,8 ) +8 , args->nr_bos);@@ -489,11 +489,11 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,if (cmdbuf)etnaviv_cmdbuf_free (cmdbuf);if (stream) -drm_free_large (stream); +kvfree (stream);if (bos) -drm_free_large (bos); +kvfree (bos);if (relocs) -drm_free_large (relocs); +kvfree (relocs);return ret; }drivers/gpu/drm/exynos/exynos_drm_gem.c +6
-5@@ -59,7 +59,8 @@ static int exynos_drm_alloc_buf(struct exynos_drm_gem *exynos_gem) nr_pages = exynos_gem->size >>PAGE_SHIFT ; - exynos_gem->pages =drm_calloc_large (nr_pages,sizeof (struct page *)); + exynos_gem->pages =kvmalloc_array (nr_pages,sizeof (struct page *), +GFP_KERNEL | __GFP_ZERO);if (!exynos_gem->pages) {DRM_ERROR ("failed to allocate pages.\n" );return -ENOMEM ;@@ -101,7 +102,7 @@ static int exynos_drm_alloc_buf(struct exynos_drm_gem *exynos_gem)dma_free_attrs (to_dma_dev (dev), exynos_gem->size, exynos_gem->cookie, exynos_gem->dma_addr, exynos_gem->dma_attrs); err_free: -drm_free_large (exynos_gem->pages); +kvfree (exynos_gem->pages);return ret; }@@ -122,7 +123,7 @@ static void exynos_drm_free_buf(struct exynos_drm_gem *exynos_gem) (dma_addr_t )exynos_gem->dma_addr, exynos_gem->dma_attrs); -drm_free_large (exynos_gem->pages); +kvfree (exynos_gem->pages); } static int exynos_drm_gem_handle_create(struct drm_gem_object *obj,@@ -559,7 +560,7 @@ exynos_drm_gem_prime_import_sg_table(struct drm_device *dev, exynos_gem->dma_addr =sg_dma_address (sgt->sgl); npages = exynos_gem->size >>PAGE_SHIFT ; - exynos_gem->pages =drm_malloc_ab (npages,sizeof (struct page *)); + exynos_gem->pages =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!exynos_gem->pages) { ret = -ENOMEM ; goto err;@@ -588,7 +589,7 @@ exynos_drm_gem_prime_import_sg_table(struct drm_device *dev,return &exynos_gem->base; err_free_large: -drm_free_large (exynos_gem->pages); +kvfree (exynos_gem->pages); err:drm_gem_object_release (&exynos_gem->base);kfree (exynos_gem);drivers/gpu/drm/i915/i915_debugfs.c +2
-2@@ -229,7 +229,7 @@ static int i915_gem_stolen_list_info(struct seq_file *m, void *data)int ret; total =READ_ONCE (dev_priv->mm.object_count); - objects =drm_malloc_ab (total,sizeof (*objects)); + objects =kvmalloc_array (total,sizeof (*objects),GFP_KERNEL );if (!objects)return -ENOMEM ;@@ -274,7 +274,7 @@ static int i915_gem_stolen_list_info(struct seq_file *m, void *data)mutex_unlock (&dev->struct_mutex); out: -drm_free_large (objects); +kvfree (objects);return ret; }drivers/gpu/drm/i915/i915_gem.c +2
-2@@ -2556,7 +2556,7 @@ static void *i915_gem_object_map(const struct drm_i915_gem_object *obj,if (n_pages >ARRAY_SIZE (stack_pages)) {/* Too big for stack -- allocate temporary array instead */ - pages =drm_malloc_gfp (n_pages,sizeof (*pages),GFP_TEMPORARY ); + pages =kvmalloc_array (n_pages,sizeof (*pages),GFP_TEMPORARY );if (!pages)return NULL ; }@@ -2578,7 +2578,7 @@ static void *i915_gem_object_map(const struct drm_i915_gem_object *obj, addr =vmap (pages, n_pages,0 , pgprot);if (pages != stack_pages) -drm_free_large (pages); +kvfree (pages);return addr; }drivers/gpu/drm/i915/i915_gem_execbuffer.c +17
-17@@ -1019,11 +1019,11 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,for (i =0 ; i < count; i++) total += exec[i].relocation_count; - reloc_offset =drm_malloc_ab (count,sizeof (*reloc_offset)); - reloc =drm_malloc_ab (total,sizeof (*reloc)); + reloc_offset =kvmalloc_array (count,sizeof (*reloc_offset),GFP_KERNEL ); + reloc =kvmalloc_array (total,sizeof (*reloc),GFP_KERNEL );if (reloc ==NULL || reloc_offset ==NULL ) { -drm_free_large (reloc); -drm_free_large (reloc_offset); +kvfree (reloc); +kvfree (reloc_offset);mutex_lock (&dev->struct_mutex);return -ENOMEM ; }@@ -1099,8 +1099,8 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,*/ err: -drm_free_large (reloc); -drm_free_large (reloc_offset); +kvfree (reloc); +kvfree (reloc_offset);return ret; }@@ -1871,13 +1871,13 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, }/* Copy in the exec list from userland */ - exec_list =drm_malloc_ab (sizeof (*exec_list), args->buffer_count); - exec2_list =drm_malloc_ab (sizeof (*exec2_list), args->buffer_count); + exec_list =kvmalloc_array (sizeof (*exec_list), args->buffer_count,GFP_KERNEL ); + exec2_list =kvmalloc_array (sizeof (*exec2_list), args->buffer_count,GFP_KERNEL );if (exec_list ==NULL || exec2_list ==NULL ) {DRM_DEBUG ("Failed to allocate exec list for %d buffers\n" , args->buffer_count); -drm_free_large (exec_list); -drm_free_large (exec2_list); +kvfree (exec_list); +kvfree (exec2_list);return -ENOMEM ; } ret = copy_from_user(exec_list,@@ -1886,8 +1886,8 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,if (ret !=0 ) {DRM_DEBUG ("copy %d exec entries failed %d\n" , args->buffer_count, ret); -drm_free_large (exec_list); -drm_free_large (exec2_list); +kvfree (exec_list); +kvfree (exec2_list);return -EFAULT ; }@@ -1936,8 +1936,8 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, } } -drm_free_large (exec_list); -drm_free_large (exec2_list); +kvfree (exec_list); +kvfree (exec2_list);return ret; }@@ -1955,7 +1955,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,return -EINVAL ; } - exec2_list =drm_malloc_gfp (args->buffer_count, + exec2_list =kvmalloc_array (args->buffer_count,sizeof (*exec2_list),GFP_TEMPORARY );if (exec2_list ==NULL ) {@@ -1969,7 +1969,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,if (ret !=0 ) {DRM_DEBUG ("copy %d exec entries failed %d\n" , args->buffer_count, ret); -drm_free_large (exec2_list); +kvfree (exec2_list);return -EFAULT ; }@@ -1996,6 +1996,6 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data, } } -drm_free_large (exec2_list); +kvfree (exec2_list);return ret; }drivers/gpu/drm/i915/i915_gem_gtt.c +3
-3@@ -3114,7 +3114,7 @@ intel_rotate_pages(struct intel_rotation_info *rot_info,int ret = -ENOMEM ;/* Allocate a temporary list of source pages for random access. */ - page_addr_list =drm_malloc_gfp (n_pages, + page_addr_list =kvmalloc_array (n_pages,sizeof (dma_addr_t),GFP_TEMPORARY );if (!page_addr_list)@@ -3147,14 +3147,14 @@ intel_rotate_pages(struct intel_rotation_info *rot_info,DRM_DEBUG_KMS ("Created rotated page mapping for object size %zu (%ux%u tiles, %u pages)\n" , obj->base.size, rot_info->plane[0 ].width, rot_info->plane[0 ].height, size); -drm_free_large (page_addr_list); +kvfree (page_addr_list);return st; err_sg_alloc:kfree (st); err_st_alloc: -drm_free_large (page_addr_list); +kvfree (page_addr_list);DRM_DEBUG_KMS ("Failed to create rotated mapping for object size %zu! (%ux%u tiles, %u pages)\n" , obj->base.size, rot_info->plane[0 ].width, rot_info->plane[0 ].height, size);drivers/gpu/drm/i915/i915_gem_userptr.c +4
-4@@ -507,7 +507,7 @@ __i915_gem_userptr_get_pages_worker(struct work_struct *_work) ret = -ENOMEM ; pinned =0 ; - pvec =drm_malloc_gfp (npages,sizeof (struct page *),GFP_TEMPORARY ); + pvec =kvmalloc_array (npages,sizeof (struct page *),GFP_TEMPORARY );if (pvec !=NULL ) {struct mm_struct *mm = obj->userptr.mm->mm;unsigned int flags =0 ;@@ -555,7 +555,7 @@ __i915_gem_userptr_get_pages_worker(struct work_struct *_work)mutex_unlock (&obj->mm.lock);release_pages (pvec, pinned,0 ); -drm_free_large (pvec); +kvfree (pvec);i915_gem_object_put (obj);put_task_struct (work->task);@@ -642,7 +642,7 @@ i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj) pinned =0 ;if (mm == current->mm) { - pvec =drm_malloc_gfp (num_pages,sizeof (struct page *), + pvec =kvmalloc_array (num_pages,sizeof (struct page *),GFP_TEMPORARY | __GFP_NORETRY | __GFP_NOWARN);@@ -669,7 +669,7 @@ i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj)if (IS_ERR (pages))release_pages (pvec, pinned,0 ); -drm_free_large (pvec); +kvfree (pvec);return pages; }drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c +6
-6@@ -117,7 +117,7 @@ static int igt_random_insert_remove(void *arg)mock_engine_reset (engine); - waiters =drm_malloc_gfp (count,sizeof (*waiters),GFP_TEMPORARY ); + waiters =kvmalloc_array (count,sizeof (*waiters),GFP_TEMPORARY );if (!waiters) goto out_engines;@@ -169,7 +169,7 @@ static int igt_random_insert_remove(void *arg) out_bitmap:kfree (bitmap); out_waiters: -drm_free_large (waiters); +kvfree (waiters); out_engines:mock_engine_flush (engine);return err;@@ -187,7 +187,7 @@ static int igt_insert_complete(void *arg)mock_engine_reset (engine); - waiters =drm_malloc_gfp (count,sizeof (*waiters),GFP_TEMPORARY ); + waiters =kvmalloc_array (count,sizeof (*waiters),GFP_TEMPORARY );if (!waiters) goto out_engines;@@ -254,7 +254,7 @@ static int igt_insert_complete(void *arg) out_bitmap:kfree (bitmap); out_waiters: -drm_free_large (waiters); +kvfree (waiters); out_engines:mock_engine_flush (engine);return err;@@ -368,7 +368,7 @@ static int igt_wakeup(void *arg)mock_engine_reset (engine); - waiters =drm_malloc_gfp (count,sizeof (*waiters),GFP_TEMPORARY ); + waiters =kvmalloc_array (count,sizeof (*waiters),GFP_TEMPORARY );if (!waiters) goto out_engines;@@ -454,7 +454,7 @@ static int igt_wakeup(void *arg)put_task_struct (waiters[n].tsk); } -drm_free_large (waiters); +kvfree (waiters); out_engines:mock_engine_flush (engine);return err;drivers/gpu/drm/msm/msm_gem.c +5
-5@@ -50,13 +50,13 @@ static struct page **get_pages_vram(struct drm_gem_object *obj,struct page **p;int ret, i; - p =drm_malloc_ab (npages,sizeof (struct page *)); + p =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!p)return ERR_PTR (-ENOMEM ); ret =drm_mm_insert_node (&priv->vram.mm, msm_obj->vram_node, npages);if (ret) { -drm_free_large (p); +kvfree (p);return ERR_PTR (ret); }@@ -127,7 +127,7 @@ static void put_pages(struct drm_gem_object *obj)drm_gem_put_pages (obj, msm_obj->pages, true, false); else {drm_mm_remove_node (msm_obj->vram_node); -drm_free_large (msm_obj->pages); +kvfree (msm_obj->pages); } msm_obj->pages =NULL ;@@ -707,7 +707,7 @@ void msm_gem_free_object(struct drm_gem_object *obj)* ours, just free the array we allocated: */ if (msm_obj->pages) -drm_free_large (msm_obj->pages); +kvfree (msm_obj->pages);drm_prime_gem_destroy (obj, msm_obj->sgt); }else {@@ -863,7 +863,7 @@ struct drm_gem_object *msm_gem_import(struct drm_device *dev, msm_obj =to_msm_bo (obj); msm_obj->sgt = sgt; - msm_obj->pages =drm_malloc_ab (npages,sizeof (struct page *)); + msm_obj->pages =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (!msm_obj->pages) { ret = -ENOMEM ; goto fail;drivers/gpu/drm/radeon/radeon_cs.c +6
-5@@ -87,7 +87,8 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p) p->dma_reloc_idx =0 ;/* FIXME: we assume that each relocs use 4 dwords */ p->nrelocs = chunk->length_dw /4 ; - p->relocs =drm_calloc_large (p->nrelocs,sizeof (struct radeon_bo_list )); + p->relocs =kvmalloc_array (p->nrelocs,sizeof (struct radeon_bo_list ), +GFP_KERNEL | __GFP_ZERO);if (p->relocs ==NULL ) {return -ENOMEM ; }@@ -341,7 +342,7 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)continue ; } - p->chunks[i].kdata =drm_malloc_ab (size,sizeof (uint32_t )); + p->chunks[i].kdata =kvmalloc_array (size,sizeof (uint32_t ),GFP_KERNEL ); size *=sizeof (uint32_t );if (p->chunks[i].kdata ==NULL ) {return -ENOMEM ;@@ -440,10 +441,10 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error, bo } }kfree (parser->track); -drm_free_large (parser->relocs); -drm_free_large (parser->vm_bos); +kvfree (parser->relocs); +kvfree (parser->vm_bos);for (i =0 ; i < parser->nchunks; i++) -drm_free_large (parser->chunks[i].kdata); +kvfree (parser->chunks[i].kdata);kfree (parser->chunks);kfree (parser->chunks_array);radeon_ib_free (parser->rdev, &parser->ib);drivers/gpu/drm/radeon/radeon_gem.c +1
-1@@ -587,7 +587,7 @@ static void radeon_gem_va_update_vm(struct radeon_device *rdev,ttm_eu_backoff_reservation (&ticket, &list); error_free: -drm_free_large (vm_bos); +kvfree (vm_bos);if (r && r != -ERESTARTSYS )DRM_ERROR ("Couldn't update BO_VA (%d)\n" , r);drivers/gpu/drm/radeon/radeon_ring.c +2
-2@@ -314,7 +314,7 @@ unsigned radeon_ring_backup(struct radeon_device *rdev, struct radeon_ring *ring }/* and then save the content of the ring */ - *data =drm_malloc_ab (size,sizeof (uint32_t )); + *data =kvmalloc_array (size,sizeof (uint32_t ),GFP_KERNEL );if (!*data) {mutex_unlock (&rdev->ring_lock);return 0 ;@@ -356,7 +356,7 @@ int radeon_ring_restore(struct radeon_device *rdev, struct radeon_ring *ring, }radeon_ring_unlock_commit (rdev, ring, false); -drm_free_large (data); +kvfree (data);return 0 ; }drivers/gpu/drm/radeon/radeon_vm.c +2
-2@@ -132,8 +132,8 @@ struct radeon_bo_list *radeon_vm_get_bos(struct radeon_device *rdev,struct radeon_bo_list *list;unsigned i, idx; - list =drm_malloc_ab (vm->max_pde_used +2 , -sizeof (struct radeon_bo_list )); + list =kvmalloc_array (vm->max_pde_used +2 , +sizeof (struct radeon_bo_list ),GFP_KERNEL );if (!list)return NULL ;drivers/gpu/drm/ttm/ttm_tt.c +7
-6@@ -39,7 +39,6 @@#include <linux/slab.h> #include <linux/export.h> #include <drm/drm_cache.h> -#include <drm/drm_mem_util.h> #include <drm/ttm/ttm_module.h> #include <drm/ttm/ttm_bo_driver.h> #include <drm/ttm/ttm_placement.h> @@ -53,14 +52,16 @@*/ static void ttm_tt_alloc_page_directory (struct ttm_tt *ttm) { - ttm->pages =drm_calloc_large (ttm->num_pages,sizeof (void *)); + ttm->pages =kvmalloc_array (ttm->num_pages,sizeof (void *), +GFP_KERNEL | __GFP_ZERO); }static void ttm_dma_tt_alloc_page_directory (struct ttm_dma_tt *ttm) { - ttm->ttm.pages =drm_calloc_large (ttm->ttm.num_pages, + ttm->ttm.pages =kvmalloc_array (ttm->ttm.num_pages,sizeof (*ttm->ttm.pages) + -sizeof (*ttm->dma_address)); +sizeof (*ttm->dma_address), +GFP_KERNEL | __GFP_ZERO); ttm->dma_address = (void *) (ttm->ttm.pages + ttm->ttm.num_pages); }@@ -208,7 +209,7 @@ EXPORT_SYMBOL(ttm_tt_init);void ttm_tt_fini (struct ttm_tt *ttm) { -drm_free_large (ttm->pages); +kvfree (ttm->pages); ttm->pages =NULL ; }EXPORT_SYMBOL (ttm_tt_fini);@@ -243,7 +244,7 @@ void ttm_dma_tt_fini(struct ttm_dma_tt *ttm_dma) {struct ttm_tt *ttm = &ttm_dma->ttm; -drm_free_large (ttm->pages); +kvfree (ttm->pages); ttm->pages =NULL ; ttm_dma->dma_address =NULL ; }drivers/gpu/drm/udl/udl_dmabuf.c +1
-1@@ -228,7 +228,7 @@ static int udl_prime_create(struct drm_device *dev,return -ENOMEM ; obj->sg = sg; - obj->pages =drm_malloc_ab (npages,sizeof (struct page *)); + obj->pages =kvmalloc_array (npages,sizeof (struct page *),GFP_KERNEL );if (obj->pages ==NULL ) {DRM_ERROR ("obj pages is NULL %d\n" , npages);return -ENOMEM ;drivers/gpu/drm/udl/udl_gem.c +1
-1@@ -146,7 +146,7 @@ int udl_gem_get_pages(struct udl_gem_object *obj)void udl_gem_put_pages (struct udl_gem_object *obj) {if (obj->base.import_attach) { -drm_free_large (obj->pages); +kvfree (obj->pages); obj->pages =NULL ;return ; }drivers/gpu/drm/vc4/vc4_gem.c +8
-7@@ -545,14 +545,15 @@ vc4_cl_lookup_bos(struct drm_device *dev,return -EINVAL ; } - exec->bo =drm_calloc_large (exec->bo_count, -sizeof (struct drm_gem_cma_object *)); + exec->bo =kvmalloc_array (exec->bo_count, +sizeof (struct drm_gem_cma_object *), +GFP_KERNEL | __GFP_ZERO);if (!exec->bo) {DRM_ERROR ("Failed to allocate validated BO pointers\n" );return -ENOMEM ; } - handles =drm_malloc_ab (exec->bo_count,sizeof (uint32_t )); + handles =kvmalloc_array (exec->bo_count,sizeof (uint32_t ),GFP_KERNEL );if (!handles) { ret = -ENOMEM ;DRM_ERROR ("Failed to allocate incoming GEM handles\n" );@@ -584,7 +585,7 @@ vc4_cl_lookup_bos(struct drm_device *dev,spin_unlock (&file_priv->table_lock); fail: -drm_free_large (handles); +kvfree (handles);return ret; }@@ -622,7 +623,7 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec)* read the contents back for validation, and I think the * bo->vaddr is uncached access. */ - temp =drm_malloc_ab (temp_size,1 ); + temp =kvmalloc_array (temp_size,1 ,GFP_KERNEL );if (!temp) {DRM_ERROR ("Failed to allocate storage for copying " "in bin/render CLs.\n" );@@ -697,7 +698,7 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec) ret =vc4_wait_for_seqno (dev, exec->bin_dep_seqno, ~0ull , true); fail: -drm_free_large (temp); +kvfree (temp);return ret; }@@ -710,7 +711,7 @@ vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec)if (exec->bo) {for (i =0 ; i < exec->bo_count; i++)drm_gem_object_unreference_unlocked (&exec->bo[i]->base); -drm_free_large (exec->bo); +kvfree (exec->bo); }while (!list_empty (&exec->unref_list)) {drivers/gpu/drm/virtio/virtgpu_ioctl.c +14
-13@@ -119,13 +119,14 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,INIT_LIST_HEAD (&validate_list);if (exbuf->num_bo_handles) { - bo_handles =drm_malloc_ab (exbuf->num_bo_handles, -sizeof (uint32_t )); - buflist =drm_calloc_large (exbuf->num_bo_handles, -sizeof (struct ttm_validate_buffer )); + bo_handles =kvmalloc_array (exbuf->num_bo_handles, +sizeof (uint32_t ),GFP_KERNEL ); + buflist =kvmalloc_array (exbuf->num_bo_handles, +sizeof (struct ttm_validate_buffer ), +GFP_KERNEL | __GFP_ZERO);if (!bo_handles || !buflist) { -drm_free_large (bo_handles); -drm_free_large (buflist); +kvfree (bo_handles); +kvfree (buflist);return -ENOMEM ; }@@ -133,16 +134,16 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,if (copy_from_user (bo_handles, user_bo_handles, exbuf->num_bo_handles *sizeof (uint32_t ))) { ret = -EFAULT ; -drm_free_large (bo_handles); -drm_free_large (buflist); +kvfree (bo_handles); +kvfree (buflist);return ret; }for (i =0 ; i < exbuf->num_bo_handles; i++) { gobj =drm_gem_object_lookup (drm_file, bo_handles[i]);if (!gobj) { -drm_free_large (bo_handles); -drm_free_large (buflist); +kvfree (bo_handles); +kvfree (buflist);return -ENOENT ; }@@ -151,7 +152,7 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,list_add (&buflist[i].head, &validate_list); } -drm_free_large (bo_handles); +kvfree (bo_handles); } ret =virtio_gpu_object_list_validate (&ticket, &validate_list);@@ -171,7 +172,7 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,/* fence the command bo */ virtio_gpu_unref_list (&validate_list); -drm_free_large (buflist); +kvfree (buflist);dma_fence_put (&fence->f);return 0 ;@@ -179,7 +180,7 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,ttm_eu_backoff_reservation (&ticket, &validate_list); out_free:virtio_gpu_unref_list (&validate_list); -drm_free_large (buflist); +kvfree (buflist);return ret; }include/drm/drmP.h +0
-1@@ -70,7 +70,6 @@#include <drm/drm_fourcc.h> #include <drm/drm_global.h> #include <drm/drm_hashtab.h> -#include <drm/drm_mem_util.h> #include <drm/drm_mm.h> #include <drm/drm_os_linux.h> #include <drm/drm_sarea.h> include/drm/drm_mem_util.h deleted +0
-43@@ -1,53 +0,0 @@ -/* -* Copyright © 2008 Intel Corporation -* -* Permission is hereby granted, free of charge, to any person obtaining a -* copy of this software and associated documentation files (the "Software"), -* to deal in the Software without restriction, including without limitation -* the rights to use, copy, modify, merge, publish, distribute, sublicense, -* and/or sell copies of the Software, and to permit persons to whom the -* Software is furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice (including the next -* paragraph) shall be included in all copies or substantial portions of the -* Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -* IN THE SOFTWARE. -* -* Authors: -* Jesse Barnes <[email protected]> -* -*/ -#ifndef _DRM_MEM_UTIL_H_ -#define _DRM_MEM_UTIL_H_ - -#include <linux/vmalloc.h> - -static __inline__void *drm_calloc_large (size_t nmemb,size_t size) -{ -return kvmalloc_array (nmemb, size,GFP_KERNEL | __GFP_ZERO); -} - -/* Modeled after cairo's malloc_ab, it's like calloc but without the zeroing. */ -static __inline__void *drm_malloc_ab (size_t nmemb,size_t size) -{ -return kvmalloc_array (nmemb, size,GFP_KERNEL ); -} - -static __inline__void *drm_malloc_gfp (size_t nmemb,size_t size,gfp_t gfp)include/drm/drm_mem_util.h line 53
Quoted 10 lines
include/drm/drm_mem_util.h deleted +0
-10-{ -return kvmalloc_array (nmemb, size, gfp); -} - -static __inlinevoid drm_free_large (void *ptr) -{ -kvfree (ptr); -} - -#endif _______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Signature · 7 lines
Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Quoted 8 lines · Michal Hocko
From: Michal Hocko <[email protected]>
drm_[cm]alloc* has grown their own kvmalloc with vmalloc fallback implementations. MM has grown kvmalloc* helpers in the meantime. Let's use those because it a) reduces the code and b) MM has a better idea how to implement fallbacks (e.g. do not vmalloc before kmalloc is tried with
__GFP_NORETRY).
Quoted 4 lines
drm_calloc_largeneeds to get__GFP_ZEROexplicitly but it is the same thing askvmalloc_arrayin principle.Signed-off-by Michal Hocko <[email protected]>
Just a little surprised that calloc_large users still exist.
One more feature request from mm, can we have the
if (size != 0 && n > SIZE_MAX / size)
check exported by itself. It is used by both kvmalloc_array and kmalloc_array, and in my ioctls I have it open-coded as well to differentiate between the -EINVAL (for bogus user values) and genuine -ENOMEM.
-Chris
Signature · 7 lines
Chris Wilson, Intel Open Source Technology Centre -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 9 lines · Chris Wilson
Quoted 8 lines · Michal Hocko
From: Michal Hocko <[email protected]>
drm_[cm]alloc* has grown their own kvmalloc with vmalloc fallback implementations. MM has grown kvmalloc* helpers in the meantime. Let's use those because it a) reduces the code and b) MM has a better idea how to implement fallbacks (e.g. do not vmalloc before kmalloc is tried with
__GFP_NORETRY).
Quoted 8 lines
Quoted 4 lines
drm_calloc_largeneeds to get__GFP_ZEROexplicitly but it is the same thing askvmalloc_arrayin principle.Signed-off-by Michal Hocko <[email protected]>Just a little surprised that
calloc_largeusers still exist.Reviewed-by Chris Wilson <[email protected]>
Thanks!
Quoted 3 lines
One more feature request from mm, can we have the
if (size != 0 && n > SIZE_MAX / size)check exported by itself.
What do you exactly mean by exporting? Something like the following? I haven't compile tested it outside of mm with different config options. Sticking alloc_array_check into mm_types.h is kind of gross but I do not have a great idea where to put it. A new header doesn't seem nice.
---
include/linux/mm.h +1 -1
@@ -534,7 +534,7 @@ static inline void *kvzalloc(size_t size, gfp_t flags)static inline void *kvmalloc_array (size_t n,size_t size,gfp_t flags) { -if (size !=0 && n >SIZE_MAX / size) +if (!alloc_array_check (n, size))return NULL ;return kvmalloc (n * size, flags);
include/linux/mm_types.h +6 -0
@@ -601,4 +601,10 @@ typedef struct { unsigned long val; } swp_entry_t; +static inline bool alloc_array_check (size_t n,size_t size) +{ +if (size !=0 && n >SIZE_MAX / size) +return false; +return true; +}#endif /* _LINUX_MM_TYPES_H */
include/linux/slab.h +1 -1
@@ -602,7 +602,7 @@ int memcg_update_all_caches(int num_memcgs);*/ static inline void *kmalloc_array (size_t n,size_t size,gfp_t flags) { -if (size !=0 && n >SIZE_MAX / size) +if (!alloc_array_check (n, size))return NULL ;if (__builtin_constant_p (n) &&__builtin_constant_p (size))return kmalloc (n * size, flags);
Signature · 8 lines
Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 19 lines · Michal Hocko
Quoted 9 lines · Chris Wilson
Quoted 8 lines · Michal Hocko
From: Michal Hocko <[email protected]>
drm_[cm]alloc* has grown their own kvmalloc with vmalloc fallback implementations. MM has grown kvmalloc* helpers in the meantime. Let's use those because it a) reduces the code and b) MM has a better idea how to implement fallbacks (e.g. do not vmalloc before kmalloc is tried with
__GFP_NORETRY).Quoted 8 lines
Quoted 4 lines
drm_calloc_largeneeds to get__GFP_ZEROexplicitly but it is the same thing askvmalloc_arrayin principle.Signed-off-by Michal Hocko <[email protected]>Just a little surprised that
calloc_largeusers still exist.Reviewed-by Chris Wilson <[email protected]>
Quoted 7 lines
Thanks!
Quoted 3 lines
One more feature request from mm, can we have the
if (size != 0 && n > SIZE_MAX / size)check exported by itself.
What do you exactly mean by exporting?
Just make available to others so that little things like choice between SIZE_MAX and ULONG_MAX are consistent and actually reflect the right limit (as dictated by kmalloc/kvmalloc/vmalloc...).
Quoted 23 lines
Something like the following?
I haven't compile tested it outside of mm with different config options. Stickingalloc_array_checkintomm_types.his kind of gross but I do not have a great idea where to put it. A new header doesn't seem nice.
---include/linux/mm.h +1
-1@@ -534,7 +534,7 @@ static inline void *kvzalloc(size_t size, gfp_t flags)static inline void *kvmalloc_array (size_t n,size_t size,gfp_t flags) { -if (size !=0 && n >SIZE_MAX / size) +if (!alloc_array_check (n, size))return NULL ;return kvmalloc (n * size, flags);include/linux/mm_types.h +0
-0
include/linux/mm_types.h typedef struct { · line 608
Quoted 8 lines
include/linux/mm_types.h +5
-0@@ -601,4 +601,10 @@ typedef struct {unsigned long val; } swp_entry_t; +static inline bool alloc_array_check (size_t n,size_t size) +{ +if (size !=0 && n >SIZE_MAX / size) +return false; +return true;
Just return size == 0 || n <= SIZE_MAX /size ?
Whether or not size being 0 makes for a sane user is another question. The guideline is that size is the known constant from sizeof() or whatever and n is the variable number to allocate.
But yes, that inline is what I want :)
-Chris
Signature · 7 lines
Chris Wilson, Intel Open Source Technology Centre -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 1 line · Chris Wilson
On Wed, May 17, 2017 at 11:03:50AM +0200, Michal Hocko wrote:
[...]
Quoted 8 lines
include/linux/mm_types.h typedef struct { · line 608
Quoted 5 lines
include/linux/mm_types.h +5
-0+static inline bool alloc_array_check (size_t n,size_t size) +{ +if (size !=0 && n >SIZE_MAX / size) +return false; +return true;Just return size == 0 || n <=
SIZE_MAX/size ?
Quoted 5 lines
Whether or not size being 0 makes for a sane user is another question. The guideline is that size is the known constant from
sizeof()or whatever and n is the variable number to allocate.But yes, that inline is what I want :)
I will think about this. Maybe it will help to simplify/unify some other users. Do you have any pointers to save me some grepping...?
Signature · 8 lines
Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>