diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c index 643adca50..c12f196d0 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c @@ -2155,7 +2155,7 @@ static int gk20a_ioctl_channel_submit_gpfifo( * synchronization; we might still wait and do an increment */ size = args->num_entries * sizeof(struct nvgpu_gpfifo); if (size) { - gpfifo = vmalloc(size); + gpfifo = nvgpu_alloc(size, false); if (!gpfifo) return -ENOMEM; @@ -2190,7 +2190,7 @@ static int gk20a_ioctl_channel_submit_gpfifo( gk20a_fence_put(fence_out); clean_up: - vfree(gpfifo); + nvgpu_free(gpfifo); return ret; } diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c index a38db7090..342d3ace0 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c @@ -745,8 +745,8 @@ int gk20a_vm_get_buffers(struct vm_gk20a *vm, mutex_lock(&vm->update_gmmu_lock); - buffer_list = kzalloc(sizeof(*buffer_list) * - vm->num_user_mapped_buffers, GFP_KERNEL); + buffer_list = nvgpu_alloc(sizeof(*buffer_list) * + vm->num_user_mapped_buffers, true); if (!buffer_list) { mutex_unlock(&vm->update_gmmu_lock); return -ENOMEM; @@ -795,7 +795,7 @@ void gk20a_vm_put_buffers(struct vm_gk20a *vm, mutex_unlock(&vm->update_gmmu_lock); - kfree(mapped_buffers); + nvgpu_free(mapped_buffers); } static void gk20a_vm_unmap_user(struct vm_gk20a *vm, u64 offset) diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h index 82003cd0b..7a627354e 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include "gk20a_allocator.h" @@ -628,4 +629,31 @@ void gk20a_mm_init_pdb(struct gk20a *g, void *inst_ptr, u64 pdb_addr); extern const struct gk20a_mmu_level gk20a_mm_levels_64k[]; extern const struct gk20a_mmu_level gk20a_mm_levels_128k[]; +static inline void *nvgpu_alloc(size_t size, bool clear) +{ + void *p; + + if (size > PAGE_SIZE) { + if (clear) + p = vzalloc(size); + else + p = vmalloc(size); + } else { + if (clear) + p = kzalloc(size, GFP_KERNEL); + else + p = kmalloc(size, GFP_KERNEL); + } + + return p; +} + +static inline void nvgpu_free(void *p) +{ + if (virt_addr_valid(p)) + kfree(p); + else + vfree(p); +} + #endif /* MM_GK20A_H */