mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-22 17:36:20 +03:00
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:
committed by
mobile promotions
parent
2431b832e7
commit
535a27411a
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* GK20A Graphics
|
* 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
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
* copy of this software and associated documentation files (the "Software"),
|
* copy of this software and associated documentation files (the "Software"),
|
||||||
@@ -22,6 +22,7 @@
|
|||||||
* DEALINGS IN THE SOFTWARE.
|
* DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <nvgpu/debug.h>
|
||||||
#include <nvgpu/nvgpu_common.h>
|
#include <nvgpu/nvgpu_common.h>
|
||||||
#include <nvgpu/kmem.h>
|
#include <nvgpu/kmem.h>
|
||||||
#include <nvgpu/allocator.h>
|
#include <nvgpu/allocator.h>
|
||||||
@@ -1138,6 +1139,8 @@ static void gk20a_free_cb(struct nvgpu_ref *refcount)
|
|||||||
|
|
||||||
nvgpu_sw_quiesce_remove_support(g);
|
nvgpu_sw_quiesce_remove_support(g);
|
||||||
|
|
||||||
|
gk20a_debug_deinit(g);
|
||||||
|
|
||||||
if (g->gfree != NULL) {
|
if (g->gfree != NULL) {
|
||||||
g->gfree(g);
|
g->gfree(g);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
* copy of this software and associated documentation files (the "Software"),
|
* 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_bitmap_alloc *alloc;
|
||||||
struct nvgpu_rbtree_node *node = NULL;
|
struct nvgpu_rbtree_node *node = NULL;
|
||||||
|
|
||||||
|
alloc_lock(na);
|
||||||
|
|
||||||
|
nvgpu_fini_alloc_debug(na);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Kill any outstanding allocations.
|
* 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_kmem_cache_destroy(a->meta_data_cache);
|
||||||
nvgpu_kfree(nvgpu_alloc_to_gpu(na), a->bitmap);
|
nvgpu_kfree(nvgpu_alloc_to_gpu(na), a->bitmap);
|
||||||
nvgpu_kfree(nvgpu_alloc_to_gpu(na), a);
|
nvgpu_kfree(nvgpu_alloc_to_gpu(na), a);
|
||||||
|
|
||||||
|
alloc_unlock(na);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
@@ -493,9 +499,7 @@ int nvgpu_bitmap_allocator_init(struct gk20a *g, struct nvgpu_allocator *na,
|
|||||||
nvgpu_smp_wmb();
|
nvgpu_smp_wmb();
|
||||||
a->inited = true;
|
a->inited = true;
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_FS
|
|
||||||
nvgpu_init_alloc_debug(g, na);
|
nvgpu_init_alloc_debug(g, na);
|
||||||
#endif
|
|
||||||
alloc_dbg(na, "New allocator: type bitmap");
|
alloc_dbg(na, "New allocator: type bitmap");
|
||||||
alloc_dbg(na, " base 0x%llx", a->base);
|
alloc_dbg(na, " base 0x%llx", a->base);
|
||||||
alloc_dbg(na, " bit_offs 0x%llx", a->bit_offs);
|
alloc_dbg(na, " bit_offs 0x%llx", a->bit_offs);
|
||||||
|
|||||||
@@ -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
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
* copy of this software and associated documentation files (the "Software"),
|
* 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);
|
alloc_lock(na);
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_FS
|
|
||||||
nvgpu_fini_alloc_debug(na);
|
nvgpu_fini_alloc_debug(na);
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Free the fixed allocs first.
|
* Free the fixed allocs first.
|
||||||
@@ -1543,9 +1541,7 @@ int nvgpu_buddy_allocator_init(struct gk20a *g, struct nvgpu_allocator *na,
|
|||||||
nvgpu_smp_wmb();
|
nvgpu_smp_wmb();
|
||||||
a->initialized = true;
|
a->initialized = true;
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_FS
|
|
||||||
nvgpu_init_alloc_debug(g, na);
|
nvgpu_init_alloc_debug(g, na);
|
||||||
#endif
|
|
||||||
alloc_dbg(na, "New allocator: type buddy");
|
alloc_dbg(na, "New allocator: type buddy");
|
||||||
alloc_dbg(na, " base 0x%llx", a->base);
|
alloc_dbg(na, " base 0x%llx", a->base);
|
||||||
alloc_dbg(na, " size 0x%llx", a->length);
|
alloc_dbg(na, " size 0x%llx", a->length);
|
||||||
|
|||||||
@@ -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
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
* copy of this software and associated documentation files (the "Software"),
|
* 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);
|
struct nvgpu_page_allocator *a = page_allocator(na);
|
||||||
|
|
||||||
alloc_lock(na);
|
alloc_lock(na);
|
||||||
|
nvgpu_fini_alloc_debug(na);
|
||||||
nvgpu_kfree(nvgpu_alloc_to_gpu(na), a);
|
nvgpu_kfree(nvgpu_alloc_to_gpu(na), a);
|
||||||
na->priv = NULL;
|
na->priv = NULL;
|
||||||
alloc_unlock(na);
|
alloc_unlock(na);
|
||||||
@@ -1114,9 +1115,7 @@ int nvgpu_page_allocator_init(struct gk20a *g, struct nvgpu_allocator *na,
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_FS
|
|
||||||
nvgpu_init_alloc_debug(g, na);
|
nvgpu_init_alloc_debug(g, na);
|
||||||
#endif
|
|
||||||
palloc_dbg(a, "New allocator: type page");
|
palloc_dbg(a, "New allocator: type page");
|
||||||
palloc_dbg(a, " base 0x%llx", a->base);
|
palloc_dbg(a, " base 0x%llx", a->base);
|
||||||
palloc_dbg(a, " size 0x%llx", a->length);
|
palloc_dbg(a, " size 0x%llx", a->length);
|
||||||
|
|||||||
@@ -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
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
* copy of this software and associated documentation files (the "Software"),
|
* 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.
|
* @param[in] a Pointer to nvgpu allocator.
|
||||||
*/
|
*/
|
||||||
void nvgpu_fini_alloc_debug(struct nvgpu_allocator *a);
|
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.
|
* @brief Initialize nvgpu allocator.
|
||||||
|
|||||||
@@ -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
|
* This software is licensed under the terms of the GNU General Public
|
||||||
* License version 2, as published by the Free Software Foundation, and
|
* 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)
|
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)
|
void nvgpu_alloc_debugfs_init(struct gk20a *g)
|
||||||
|
|||||||
@@ -1932,8 +1932,6 @@ int nvgpu_remove(struct device *dev)
|
|||||||
|
|
||||||
gk20a_power_node_deinit(dev_from_gk20a(g));
|
gk20a_power_node_deinit(dev_from_gk20a(g));
|
||||||
|
|
||||||
gk20a_debug_deinit(g);
|
|
||||||
|
|
||||||
nvgpu_remove_sysfs(dev);
|
nvgpu_remove_sysfs(dev);
|
||||||
|
|
||||||
if (platform->secure_buffer.destroy)
|
if (platform->secure_buffer.destroy)
|
||||||
|
|||||||
Reference in New Issue
Block a user