gpu: nvgpu: fix allocator debugfs deinit

Allocator (bitmap, buddy, page) debugfs files are not cleaned up when
the allocators are destroyed. This leads to warning logs from nvgpu
like below:

[21073.493000] debugfs: File 'gk20a_as_17' in directory 'allocators' already present!
[21073.493026] debugfs: File 'gk20a_as_17-sys' in directory 'allocators' already present!

Remove the per-allocator debugfs node when destroying an allocator in
runtime.

While at this, add missing nvgpu_allocator locking to the function
nvgpu_bitmap_alloc_destroy. And create nop functions for the
functions nvgpu_init_alloc_debug and nvgpu_fini_alloc_debug
when CONFIG_DEBUG_FS is not defined to avoid adding the
CONFIG checks at multiple places.

Move gk20a_debug_deinit to the end of gk20a_free_cb called in nvgpu_put
as that tears down all debugfs entries. Allocator destroy happens as
part of nvgpu_put call and it can lead to invalid debugfs dentry
access if gk20a_debug_deinit is called before it.

Bug 3481097

Change-Id: I8a66bcf6ade7e5707f9207c78a54d12d7bd94c02
Signed-off-by: Sagar Kamble <skamble@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2648012
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
This commit is contained in:
Sagar Kamble
2021-12-30 19:06:15 +05:30
committed by mobile promotions
parent 2431b832e7
commit 535a27411a
7 changed files with 27 additions and 17 deletions

View File

@@ -1,7 +1,7 @@
/*
* GK20A Graphics
*
* Copyright (c) 2011-2021, NVIDIA CORPORATION. All rights reserved.
* Copyright (c) 2011-2022, NVIDIA CORPORATION. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -22,6 +22,7 @@
* DEALINGS IN THE SOFTWARE.
*/
#include <nvgpu/debug.h>
#include <nvgpu/nvgpu_common.h>
#include <nvgpu/kmem.h>
#include <nvgpu/allocator.h>
@@ -1138,6 +1139,8 @@ static void gk20a_free_cb(struct nvgpu_ref *refcount)
nvgpu_sw_quiesce_remove_support(g);
gk20a_debug_deinit(g);
if (g->gfree != NULL) {
g->gfree(g);
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2016-2021, NVIDIA CORPORATION. All rights reserved.
* Copyright (c) 2016-2022, NVIDIA CORPORATION. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -349,6 +349,10 @@ static void nvgpu_bitmap_alloc_destroy(struct nvgpu_allocator *na)
struct nvgpu_bitmap_alloc *alloc;
struct nvgpu_rbtree_node *node = NULL;
alloc_lock(na);
nvgpu_fini_alloc_debug(na);
/*
* Kill any outstanding allocations.
*/
@@ -365,6 +369,8 @@ static void nvgpu_bitmap_alloc_destroy(struct nvgpu_allocator *na)
nvgpu_kmem_cache_destroy(a->meta_data_cache);
nvgpu_kfree(nvgpu_alloc_to_gpu(na), a->bitmap);
nvgpu_kfree(nvgpu_alloc_to_gpu(na), a);
alloc_unlock(na);
}
#ifdef __KERNEL__
@@ -493,9 +499,7 @@ int nvgpu_bitmap_allocator_init(struct gk20a *g, struct nvgpu_allocator *na,
nvgpu_smp_wmb();
a->inited = true;
#ifdef CONFIG_DEBUG_FS
nvgpu_init_alloc_debug(g, na);
#endif
alloc_dbg(na, "New allocator: type bitmap");
alloc_dbg(na, " base 0x%llx", a->base);
alloc_dbg(na, " bit_offs 0x%llx", a->bit_offs);

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2016-2021, NVIDIA CORPORATION. All rights reserved.
* Copyright (c) 2016-2022, NVIDIA CORPORATION. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -302,9 +302,7 @@ static void nvgpu_buddy_allocator_destroy(struct nvgpu_allocator *na)
alloc_lock(na);
#ifdef CONFIG_DEBUG_FS
nvgpu_fini_alloc_debug(na);
#endif
/*
* Free the fixed allocs first.
@@ -1543,9 +1541,7 @@ int nvgpu_buddy_allocator_init(struct gk20a *g, struct nvgpu_allocator *na,
nvgpu_smp_wmb();
a->initialized = true;
#ifdef CONFIG_DEBUG_FS
nvgpu_init_alloc_debug(g, na);
#endif
alloc_dbg(na, "New allocator: type buddy");
alloc_dbg(na, " base 0x%llx", a->base);
alloc_dbg(na, " size 0x%llx", a->length);

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2016-2021, NVIDIA CORPORATION. All rights reserved.
* Copyright (c) 2016-2022, NVIDIA CORPORATION. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -918,6 +918,7 @@ static void nvgpu_page_allocator_destroy(struct nvgpu_allocator *na)
struct nvgpu_page_allocator *a = page_allocator(na);
alloc_lock(na);
nvgpu_fini_alloc_debug(na);
nvgpu_kfree(nvgpu_alloc_to_gpu(na), a);
na->priv = NULL;
alloc_unlock(na);
@@ -1114,9 +1115,7 @@ int nvgpu_page_allocator_init(struct gk20a *g, struct nvgpu_allocator *na,
goto fail;
}
#ifdef CONFIG_DEBUG_FS
nvgpu_init_alloc_debug(g, na);
#endif
palloc_dbg(a, "New allocator: type page");
palloc_dbg(a, " base 0x%llx", a->base);
palloc_dbg(a, " size 0x%llx", a->length);

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2011-2021, NVIDIA CORPORATION. All rights reserved.
* Copyright (c) 2011-2022, NVIDIA CORPORATION. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -789,7 +789,11 @@ void nvgpu_init_alloc_debug(struct gk20a *g, struct nvgpu_allocator *a);
* @param[in] a Pointer to nvgpu allocator.
*/
void nvgpu_fini_alloc_debug(struct nvgpu_allocator *a);
#endif
#else
static inline void nvgpu_init_alloc_debug(struct gk20a *g,
struct nvgpu_allocator *a) {}
static inline void nvgpu_fini_alloc_debug(struct nvgpu_allocator *a) {}
#endif /* CONFIG_DEBUG_FS */
/**
* @brief Initialize nvgpu allocator.

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2017 NVIDIA Corporation. All rights reserved.
* Copyright (C) 2017-2022 NVIDIA Corporation. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
@@ -55,6 +55,12 @@ void nvgpu_init_alloc_debug(struct gk20a *g, struct nvgpu_allocator *a)
void nvgpu_fini_alloc_debug(struct nvgpu_allocator *a)
{
struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(a->g);
if (!l->debugfs_allocators)
return;
debugfs_remove(a->debugfs_entry);
}
void nvgpu_alloc_debugfs_init(struct gk20a *g)

View File

@@ -1932,8 +1932,6 @@ int nvgpu_remove(struct device *dev)
gk20a_power_node_deinit(dev_from_gk20a(g));
gk20a_debug_deinit(g);
nvgpu_remove_sysfs(dev);
if (platform->secure_buffer.destroy)