diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c index 0b84b7daa..9bacb5c98 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c @@ -1726,20 +1726,24 @@ fail_unlock: static int gk20a_channel_add_job(struct channel_gk20a *c, struct gk20a_fence *pre_fence, - struct gk20a_fence *post_fence) + struct gk20a_fence *post_fence, + bool skip_buffer_refcounting) { struct vm_gk20a *vm = c->vm; struct channel_gk20a_job *job = NULL; struct mapped_buffer_node **mapped_buffers = NULL; - int err = 0, num_mapped_buffers; + int err = 0, num_mapped_buffers = 0; /* job needs reference to this vm (released in channel_update) */ gk20a_vm_get(vm); - err = gk20a_vm_get_buffers(vm, &mapped_buffers, &num_mapped_buffers); - if (err) { - gk20a_vm_put(vm); - return err; + if (!skip_buffer_refcounting) { + err = gk20a_vm_get_buffers(vm, &mapped_buffers, + &num_mapped_buffers); + if (err) { + gk20a_vm_put(vm); + return err; + } } job = kzalloc(sizeof(*job), GFP_KERNEL); @@ -1795,7 +1799,8 @@ void gk20a_channel_update(struct channel_gk20a *c, int nr_completed) if (c->sync) c->sync->signal_timeline(c->sync); - gk20a_vm_put_buffers(vm, job->mapped_buffers, + if (job->num_mapped_buffers) + gk20a_vm_put_buffers(vm, job->mapped_buffers, job->num_mapped_buffers); /* Close the fences (this will unref the semaphores and release @@ -1858,6 +1863,8 @@ int gk20a_submit_channel_gpfifo(struct channel_gk20a *c, const int extra_entries = 2; bool need_wfi = !(flags & NVGPU_SUBMIT_GPFIFO_FLAGS_SUPPRESS_WFI); struct nvgpu_gpfifo *gpfifo_mem = c->gpfifo.mem.cpu_va; + bool skip_buffer_refcounting = (flags & + NVGPU_SUBMIT_GPFIFO_FLAGS_SKIP_BUFFER_REFCOUNTING); if (c->has_timedout) return -ETIMEDOUT; @@ -2106,7 +2113,8 @@ int gk20a_submit_channel_gpfifo(struct channel_gk20a *c, *fence_out = gk20a_fence_get(post_fence); /* TODO! Check for errors... */ - gk20a_channel_add_job(c, pre_fence, post_fence); + gk20a_channel_add_job(c, pre_fence, post_fence, + skip_buffer_refcounting); c->cmds_pending = true; gk20a_bar1_writel(g, diff --git a/include/uapi/linux/nvgpu.h b/include/uapi/linux/nvgpu.h index d2b5ceb8d..025f2c9bd 100644 --- a/include/uapi/linux/nvgpu.h +++ b/include/uapi/linux/nvgpu.h @@ -669,6 +669,8 @@ struct nvgpu_fence { #define NVGPU_SUBMIT_GPFIFO_FLAGS_SYNC_FENCE (1 << 3) /* suppress WFI before fence trigger */ #define NVGPU_SUBMIT_GPFIFO_FLAGS_SUPPRESS_WFI (1 << 4) +/* skip buffer refcounting during submit */ +#define NVGPU_SUBMIT_GPFIFO_FLAGS_SKIP_BUFFER_REFCOUNTING (1 << 5) struct nvgpu_submit_gpfifo_args { __u64 gpfifo;