mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-22 17:36:20 +03:00
gpu: nvgpu: Fixes to static offset mappings
This patch addresses two issues in fixes offset mappings: - VA unmapping did not use lists safely. This caused an application hang if the application did not free all (fixed offset) buffers before quiting. - GPU was not powered closing AS node. If the address space had areas that were not freed, the driver tried to access hw without powering it up first. Change-Id: Ida526d222ea4e03b8d765eca16574ddc1823e60d Signed-off-by: Arto Merilainen <amerilainen@nvidia.com> Reviewed-on: http://git-master/r/405872 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
This commit is contained in:
committed by
Dan Willemsen
parent
93044a4dc2
commit
219eb3d26b
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user