diff mbox

[2/2,-v2] drm: drop drm_[cm]alloc* helpers

Message ID 20170517122312.GK18247@dhcp22.suse.cz (mailing list archive)
State New, archived
Headers show

Commit Message

Michal Hocko May 17, 2017, 12:23 p.m. UTC
As 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.
---
From 4a00b3ade5ca4514f7affd8de6f7119c8d5c5a86 Mon Sep 17 00:00:00 2001
From: Michal Hocko <mhocko@suse.com>
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

Suggested-by: Daniel Vetter <daniel@ffwll.ch>
Signed-off-by: Michal Hocko <mhocko@suse.com>
---
 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

Comments

Christian König May 18, 2017, 8:16 a.m. UTC | #1
Am 17.05.2017 um 14:23 schrieb Michal Hocko:
> As 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.
> ---
>  From 4a00b3ade5ca4514f7affd8de6f7119c8d5c5a86 Mon Sep 17 00:00:00 2001
> From: Michal Hocko <mhocko@suse.com>
> 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
>
> Suggested-by: Daniel Vetter <daniel@ffwll.ch>
> Signed-off-by: Michal Hocko <mhocko@suse.com>

Acked-by: Christian König <christian.koenig@amd.com>

> ---
>   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
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
> index a6649874e6ce..9f0247cdda5e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
> @@ -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;
>   }
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> index 4e6b9501ab0a..5b3e0f63a115 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> @@ -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, bo
>   		amdgpu_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);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index 07ff3b1514f1..749a6cde7985 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -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);
>   }
>   
>   /**
> diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
> index b1e28c944637..8dc11064253d 100644
> --- a/drivers/gpu/drm/drm_gem.c
> +++ b/drivers/gpu/drm/drm_gem.c
> @@ -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);
>   
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
> index fd56f92f3469..d6fb724fc3cc 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
> @@ -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);
>   }
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
> index abed6f781281..e5da4f2300ba 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
> @@ -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;
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> index de80ee1b71df..ee7069e93eda 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> @@ -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;
>   }
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c
> index 55a1579d11b3..c23479be4850 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_gem.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c
> @@ -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);
> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
> index bd9abef40c66..c8f3c0cc79fb 100644
> --- a/drivers/gpu/drm/i915/i915_debugfs.c
> +++ b/drivers/gpu/drm/i915/i915_debugfs.c
> @@ -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;
>   }
>   
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 0c1cbe98c994..aa790a6d38e2 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -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;
>   }
> diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> index af1965774e7b..04211c970b9f 100644
> --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> @@ -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;
>   }
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index bc3c63e92c16..899427863547 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -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);
> diff --git a/drivers/gpu/drm/i915/i915_gem_userptr.c b/drivers/gpu/drm/i915/i915_gem_userptr.c
> index 58ccf8b8ca1c..1a0ce1dc68f5 100644
> --- a/drivers/gpu/drm/i915/i915_gem_userptr.c
> +++ b/drivers/gpu/drm/i915/i915_gem_userptr.c
> @@ -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;
>   }
> diff --git a/drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c b/drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c
> index 19860a372d90..7276194c04f7 100644
> --- a/drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c
> +++ b/drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c
> @@ -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;
> diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
> index 68e509b3b9e4..465dab942afa 100644
> --- a/drivers/gpu/drm/msm/msm_gem.c
> +++ b/drivers/gpu/drm/msm/msm_gem.c
> @@ -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;
> diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
> index 3ac671f6c8e1..00b22af70f5c 100644
> --- a/drivers/gpu/drm/radeon/radeon_cs.c
> +++ b/drivers/gpu/drm/radeon/radeon_cs.c
> @@ -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);
> diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
> index dddb372de2b9..574bf7e6b118 100644
> --- a/drivers/gpu/drm/radeon/radeon_gem.c
> +++ b/drivers/gpu/drm/radeon/radeon_gem.c
> @@ -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);
> diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
> index 8c7872339c2a..84802b201bef 100644
> --- a/drivers/gpu/drm/radeon/radeon_ring.c
> +++ b/drivers/gpu/drm/radeon/radeon_ring.c
> @@ -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;
>   }
>   
> diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
> index a1358748cea5..5f68245579a3 100644
> --- a/drivers/gpu/drm/radeon/radeon_vm.c
> +++ b/drivers/gpu/drm/radeon/radeon_vm.c
> @@ -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;
>   
> diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
> index 5260179d788a..8ebc8d3560c3 100644
> --- a/drivers/gpu/drm/ttm/ttm_tt.c
> +++ b/drivers/gpu/drm/ttm/ttm_tt.c
> @@ -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;
>   }
> diff --git a/drivers/gpu/drm/udl/udl_dmabuf.c b/drivers/gpu/drm/udl/udl_dmabuf.c
> index ed0e636243b2..2e031a894813 100644
> --- a/drivers/gpu/drm/udl/udl_dmabuf.c
> +++ b/drivers/gpu/drm/udl/udl_dmabuf.c
> @@ -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;
> diff --git a/drivers/gpu/drm/udl/udl_gem.c b/drivers/gpu/drm/udl/udl_gem.c
> index 775c50e4f02c..db9ceceba30e 100644
> --- a/drivers/gpu/drm/udl/udl_gem.c
> +++ b/drivers/gpu/drm/udl/udl_gem.c
> @@ -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;
>   	}
> diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c
> index e9c381c42139..bf466674ca9b 100644
> --- a/drivers/gpu/drm/vc4/vc4_gem.c
> +++ b/drivers/gpu/drm/vc4/vc4_gem.c
> @@ -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)) {
> diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
> index 61f3a963af95..6ed4bfc9b82b 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
> @@ -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;
>   }
>   
> diff --git a/include/drm/drmP.h b/include/drm/drmP.h
> index e1daa4f343cd..59df08d14b89 100644
> --- a/include/drm/drmP.h
> +++ b/include/drm/drmP.h
> @@ -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>
> diff --git a/include/drm/drm_mem_util.h b/include/drm/drm_mem_util.h
> deleted file mode 100644
> index a1ddf55fda67..000000000000
> --- a/include/drm/drm_mem_util.h
> +++ /dev/null
> @@ -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 <jbarnes@virtuousgeek.org>
> - *
> - */
> -#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)
> -{
> -	return kvmalloc_array(nmemb, size, gfp);
> -}
> -
> -static __inline void drm_free_large(void *ptr)
> -{
> -	kvfree(ptr);
> -}
> -
> -#endif
Daniel Vetter May 18, 2017, 3:23 p.m. UTC | #2
On Thu, May 18, 2017 at 10:16:38AM +0200, Christian König wrote:
> Am 17.05.2017 um 14:23 schrieb Michal Hocko:
> > As 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.
> > ---
> >  From 4a00b3ade5ca4514f7affd8de6f7119c8d5c5a86 Mon Sep 17 00:00:00 2001
> > From: Michal Hocko <mhocko@suse.com>
> > 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
> > 
> > Suggested-by: Daniel Vetter <daniel@ffwll.ch>
> > Signed-off-by: Michal Hocko <mhocko@suse.com>
> 
> Acked-by: Christian König <christian.koenig@amd.com>

Found another conflict in vgem (grew another user there in-between), fixed
that up and applied both patches to drm-misc-next.

Thanks, Daniel

> 
> > ---
> >   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
> > 
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
> > index a6649874e6ce..9f0247cdda5e 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
> > @@ -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;
> >   }
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> > index 4e6b9501ab0a..5b3e0f63a115 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> > @@ -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, bo
> >   		amdgpu_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);
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> > index 07ff3b1514f1..749a6cde7985 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> > @@ -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);
> >   }
> >   /**
> > diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
> > index b1e28c944637..8dc11064253d 100644
> > --- a/drivers/gpu/drm/drm_gem.c
> > +++ b/drivers/gpu/drm/drm_gem.c
> > @@ -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);
> > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
> > index fd56f92f3469..d6fb724fc3cc 100644
> > --- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
> > +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
> > @@ -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);
> >   }
> > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
> > index abed6f781281..e5da4f2300ba 100644
> > --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
> > +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
> > @@ -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;
> > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> > index de80ee1b71df..ee7069e93eda 100644
> > --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> > +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> > @@ -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;
> >   }
> > diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c
> > index 55a1579d11b3..c23479be4850 100644
> > --- a/drivers/gpu/drm/exynos/exynos_drm_gem.c
> > +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c
> > @@ -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);
> > diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
> > index bd9abef40c66..c8f3c0cc79fb 100644
> > --- a/drivers/gpu/drm/i915/i915_debugfs.c
> > +++ b/drivers/gpu/drm/i915/i915_debugfs.c
> > @@ -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;
> >   }
> > diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> > index 0c1cbe98c994..aa790a6d38e2 100644
> > --- a/drivers/gpu/drm/i915/i915_gem.c
> > +++ b/drivers/gpu/drm/i915/i915_gem.c
> > @@ -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;
> >   }
> > diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> > index af1965774e7b..04211c970b9f 100644
> > --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> > +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> > @@ -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;
> >   }
> > diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
> > index bc3c63e92c16..899427863547 100644
> > --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> > +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> > @@ -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);
> > diff --git a/drivers/gpu/drm/i915/i915_gem_userptr.c b/drivers/gpu/drm/i915/i915_gem_userptr.c
> > index 58ccf8b8ca1c..1a0ce1dc68f5 100644
> > --- a/drivers/gpu/drm/i915/i915_gem_userptr.c
> > +++ b/drivers/gpu/drm/i915/i915_gem_userptr.c
> > @@ -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;
> >   }
> > diff --git a/drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c b/drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c
> > index 19860a372d90..7276194c04f7 100644
> > --- a/drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c
> > +++ b/drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c
> > @@ -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;
> > diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
> > index 68e509b3b9e4..465dab942afa 100644
> > --- a/drivers/gpu/drm/msm/msm_gem.c
> > +++ b/drivers/gpu/drm/msm/msm_gem.c
> > @@ -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;
> > diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
> > index 3ac671f6c8e1..00b22af70f5c 100644
> > --- a/drivers/gpu/drm/radeon/radeon_cs.c
> > +++ b/drivers/gpu/drm/radeon/radeon_cs.c
> > @@ -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);
> > diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
> > index dddb372de2b9..574bf7e6b118 100644
> > --- a/drivers/gpu/drm/radeon/radeon_gem.c
> > +++ b/drivers/gpu/drm/radeon/radeon_gem.c
> > @@ -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);
> > diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
> > index 8c7872339c2a..84802b201bef 100644
> > --- a/drivers/gpu/drm/radeon/radeon_ring.c
> > +++ b/drivers/gpu/drm/radeon/radeon_ring.c
> > @@ -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;
> >   }
> > diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
> > index a1358748cea5..5f68245579a3 100644
> > --- a/drivers/gpu/drm/radeon/radeon_vm.c
> > +++ b/drivers/gpu/drm/radeon/radeon_vm.c
> > @@ -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;
> > diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
> > index 5260179d788a..8ebc8d3560c3 100644
> > --- a/drivers/gpu/drm/ttm/ttm_tt.c
> > +++ b/drivers/gpu/drm/ttm/ttm_tt.c
> > @@ -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;
> >   }
> > diff --git a/drivers/gpu/drm/udl/udl_dmabuf.c b/drivers/gpu/drm/udl/udl_dmabuf.c
> > index ed0e636243b2..2e031a894813 100644
> > --- a/drivers/gpu/drm/udl/udl_dmabuf.c
> > +++ b/drivers/gpu/drm/udl/udl_dmabuf.c
> > @@ -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;
> > diff --git a/drivers/gpu/drm/udl/udl_gem.c b/drivers/gpu/drm/udl/udl_gem.c
> > index 775c50e4f02c..db9ceceba30e 100644
> > --- a/drivers/gpu/drm/udl/udl_gem.c
> > +++ b/drivers/gpu/drm/udl/udl_gem.c
> > @@ -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;
> >   	}
> > diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c
> > index e9c381c42139..bf466674ca9b 100644
> > --- a/drivers/gpu/drm/vc4/vc4_gem.c
> > +++ b/drivers/gpu/drm/vc4/vc4_gem.c
> > @@ -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)) {
> > diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
> > index 61f3a963af95..6ed4bfc9b82b 100644
> > --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c
> > +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
> > @@ -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;
> >   }
> > diff --git a/include/drm/drmP.h b/include/drm/drmP.h
> > index e1daa4f343cd..59df08d14b89 100644
> > --- a/include/drm/drmP.h
> > +++ b/include/drm/drmP.h
> > @@ -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>
> > diff --git a/include/drm/drm_mem_util.h b/include/drm/drm_mem_util.h
> > deleted file mode 100644
> > index a1ddf55fda67..000000000000
> > --- a/include/drm/drm_mem_util.h
> > +++ /dev/null
> > @@ -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 <jbarnes@virtuousgeek.org>
> > - *
> > - */
> > -#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)
> > -{
> > -	return kvmalloc_array(nmemb, size, gfp);
> > -}
> > -
> > -static __inline void drm_free_large(void *ptr)
> > -{
> > -	kvfree(ptr);
> > -}
> > -
> > -#endif
> 
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
diff mbox

Patch

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
index a6649874e6ce..9f0247cdda5e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
@@ -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;
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 4e6b9501ab0a..5b3e0f63a115 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -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, bo
 		amdgpu_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);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 07ff3b1514f1..749a6cde7985 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -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);
 }
 
 /**
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index b1e28c944637..8dc11064253d 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -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);
 
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
index fd56f92f3469..d6fb724fc3cc 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
@@ -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);
 }
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
index abed6f781281..e5da4f2300ba 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
@@ -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;
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
index de80ee1b71df..ee7069e93eda 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
@@ -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;
 }
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c
index 55a1579d11b3..c23479be4850 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_gem.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c
@@ -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);
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index bd9abef40c66..c8f3c0cc79fb 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -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;
 }
 
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 0c1cbe98c994..aa790a6d38e2 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -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;
 }
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index af1965774e7b..04211c970b9f 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -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;
 }
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index bc3c63e92c16..899427863547 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -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);
diff --git a/drivers/gpu/drm/i915/i915_gem_userptr.c b/drivers/gpu/drm/i915/i915_gem_userptr.c
index 58ccf8b8ca1c..1a0ce1dc68f5 100644
--- a/drivers/gpu/drm/i915/i915_gem_userptr.c
+++ b/drivers/gpu/drm/i915/i915_gem_userptr.c
@@ -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;
 }
diff --git a/drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c b/drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c
index 19860a372d90..7276194c04f7 100644
--- a/drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c
+++ b/drivers/gpu/drm/i915/selftests/intel_breadcrumbs.c
@@ -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;
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
index 68e509b3b9e4..465dab942afa 100644
--- a/drivers/gpu/drm/msm/msm_gem.c
+++ b/drivers/gpu/drm/msm/msm_gem.c
@@ -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;
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index 3ac671f6c8e1..00b22af70f5c 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -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);
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
index dddb372de2b9..574bf7e6b118 100644
--- a/drivers/gpu/drm/radeon/radeon_gem.c
+++ b/drivers/gpu/drm/radeon/radeon_gem.c
@@ -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);
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
index 8c7872339c2a..84802b201bef 100644
--- a/drivers/gpu/drm/radeon/radeon_ring.c
+++ b/drivers/gpu/drm/radeon/radeon_ring.c
@@ -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;
 }
 
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
index a1358748cea5..5f68245579a3 100644
--- a/drivers/gpu/drm/radeon/radeon_vm.c
+++ b/drivers/gpu/drm/radeon/radeon_vm.c
@@ -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;
 
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
index 5260179d788a..8ebc8d3560c3 100644
--- a/drivers/gpu/drm/ttm/ttm_tt.c
+++ b/drivers/gpu/drm/ttm/ttm_tt.c
@@ -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;
 }
diff --git a/drivers/gpu/drm/udl/udl_dmabuf.c b/drivers/gpu/drm/udl/udl_dmabuf.c
index ed0e636243b2..2e031a894813 100644
--- a/drivers/gpu/drm/udl/udl_dmabuf.c
+++ b/drivers/gpu/drm/udl/udl_dmabuf.c
@@ -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;
diff --git a/drivers/gpu/drm/udl/udl_gem.c b/drivers/gpu/drm/udl/udl_gem.c
index 775c50e4f02c..db9ceceba30e 100644
--- a/drivers/gpu/drm/udl/udl_gem.c
+++ b/drivers/gpu/drm/udl/udl_gem.c
@@ -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;
 	}
diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c
index e9c381c42139..bf466674ca9b 100644
--- a/drivers/gpu/drm/vc4/vc4_gem.c
+++ b/drivers/gpu/drm/vc4/vc4_gem.c
@@ -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)) {
diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
index 61f3a963af95..6ed4bfc9b82b 100644
--- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c
+++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
@@ -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;
 }
 
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index e1daa4f343cd..59df08d14b89 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -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>
diff --git a/include/drm/drm_mem_util.h b/include/drm/drm_mem_util.h
deleted file mode 100644
index a1ddf55fda67..000000000000
--- a/include/drm/drm_mem_util.h
+++ /dev/null
@@ -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 <jbarnes@virtuousgeek.org>
- *
- */
-#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)
-{
-	return kvmalloc_array(nmemb, size, gfp);
-}
-
-static __inline void drm_free_large(void *ptr)
-{
-	kvfree(ptr);
-}
-
-#endif