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)
|
int gk20a_as_release_share(struct gk20a_as_share *as_share)
|
||||||
{
|
{
|
||||||
|
struct gk20a *g = as_share->vm->mm->g;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
gk20a_dbg_fn("");
|
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)
|
if (atomic_dec_return(&as_share->ref_cnt) > 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
gk20a_busy(g->dev);
|
||||||
err = gk20a_vm_release_share(as_share);
|
err = gk20a_vm_release_share(as_share);
|
||||||
|
gk20a_idle(g->dev);
|
||||||
|
|
||||||
release_as_share_id(as_share->as, as_share->id);
|
release_as_share_id(as_share->as, as_share->id);
|
||||||
kfree(as_share);
|
kfree(as_share);
|
||||||
return err;
|
return err;
|
||||||
|
|||||||
@@ -2350,14 +2350,15 @@ int gk20a_vm_free_space(struct gk20a_as_share *as_share,
|
|||||||
mutex_lock(&vm->update_gmmu_lock);
|
mutex_lock(&vm->update_gmmu_lock);
|
||||||
va_node = addr_to_reservation(vm, args->offset);
|
va_node = addr_to_reservation(vm, args->offset);
|
||||||
if (va_node) {
|
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
|
/* there is no need to unallocate the buffers in va. Just
|
||||||
* convert them into normal buffers */
|
* convert them into normal buffers */
|
||||||
|
|
||||||
list_for_each_entry(buffer,
|
list_for_each_entry_safe(buffer, n,
|
||||||
&va_node->va_buffers_list, va_buffers_list)
|
&va_node->va_buffers_list, va_buffers_list) {
|
||||||
list_del_init(&buffer->va_buffers_list);
|
list_del_init(&buffer->va_buffers_list);
|
||||||
|
}
|
||||||
|
|
||||||
list_del(&va_node->reserved_va_list);
|
list_del(&va_node->reserved_va_list);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user