diff --git a/drivers/gpu/nvgpu/gk20a/as_gk20a.c b/drivers/gpu/nvgpu/gk20a/as_gk20a.c index 1d604b83e..42fa21678 100644 --- a/drivers/gpu/nvgpu/gk20a/as_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/as_gk20a.c @@ -73,6 +73,7 @@ static int gk20a_as_alloc_share(struct gk20a_as *as, */ int gk20a_as_release_share(struct gk20a_as_share *as_share) { + struct gk20a *g = as_share->vm->mm->g; int err; gk20a_dbg_fn(""); @@ -80,7 +81,10 @@ int gk20a_as_release_share(struct gk20a_as_share *as_share) if (atomic_dec_return(&as_share->ref_cnt) > 0) return 0; + gk20a_busy(g->dev); err = gk20a_vm_release_share(as_share); + gk20a_idle(g->dev); + release_as_share_id(as_share->as, as_share->id); kfree(as_share); return err; diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c index d2174f37f..624eec94c 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c @@ -2350,14 +2350,15 @@ int gk20a_vm_free_space(struct gk20a_as_share *as_share, mutex_lock(&vm->update_gmmu_lock); va_node = addr_to_reservation(vm, args->offset); if (va_node) { - struct mapped_buffer_node *buffer; + struct mapped_buffer_node *buffer, *n; /* there is no need to unallocate the buffers in va. Just * convert them into normal buffers */ - list_for_each_entry(buffer, - &va_node->va_buffers_list, va_buffers_list) + list_for_each_entry_safe(buffer, n, + &va_node->va_buffers_list, va_buffers_list) { list_del_init(&buffer->va_buffers_list); + } list_del(&va_node->reserved_va_list);