From 0ca520ee307342b6817ee9bb788765b4f4d72733 Mon Sep 17 00:00:00 2001 From: Laxman Dewangan Date: Tue, 21 Nov 2023 16:52:56 +0000 Subject: [PATCH] nvmap: dynamically allocate nvmap page pool shrinker Dynamically allocate the nvmpa pagepool shrinker as shrinker register and unregister get removed from Linux 6.7. Based on change: *** commit 86298d8b8ceacc17d0192cd6412d2773ff51b27f Author: Qi Zheng md/raid5: dynamically allocate the md-raid5 shrinker *** Bug 4346767 Change-Id: Idbe40753f79481d85e5899d2905039860d39dc5e Signed-off-by: Laxman Dewangan Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3020001 (cherry picked from commit fc748158cc4082e0118044b18beadf72365663f1) Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3036794 Reviewed-by: Jonathan Hunter Tested-by: Jonathan Hunter GVS: Gerrit_Virtual_Submit --- Makefile | 6 ++++++ drivers/video/tegra/nvmap/nvmap_pp.c | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/Makefile b/Makefile index 076165df..ee38391a 100644 --- a/Makefile +++ b/Makefile @@ -53,6 +53,12 @@ subdir-ccflags-y += -DNV_V4L2_ASYNC_NF_SUBDEVICE_INIT_RENAME export CONFIG_SKIP_CRYPTO=y endif +# Changes done in Linux 6.7 onwards +ifeq ($(shell test $(LINUX_VERSION) -ge $(LINUX_VERSION_6_7); echo $$?),0) +# Support enable to allocate shrinker dynamically +subdir-ccflags-y += -DNV_NVMAP_DYNAMIC_SHRINKER_ALLOC_SUPPORT +endif + ifeq ($(CONFIG_TEGRA_VIRTUALIZATION),y) subdir-ccflags-y += -DCONFIG_TEGRA_VIRTUALIZATION endif diff --git a/drivers/video/tegra/nvmap/nvmap_pp.c b/drivers/video/tegra/nvmap/nvmap_pp.c index e325cd41..8c165125 100644 --- a/drivers/video/tegra/nvmap/nvmap_pp.c +++ b/drivers/video/tegra/nvmap/nvmap_pp.c @@ -581,11 +581,15 @@ static unsigned long nvmap_page_pool_scan_objects(struct shrinker *shrinker, SHRINK_STOP : (sc->nr_to_scan - remaining); } +#if defined(NV_NVMAP_DYNAMIC_SHRINKER_ALLOC_SUPPORT) +static struct shrinker *nvmap_page_pool_shrinker; +#else static struct shrinker nvmap_page_pool_shrinker = { .count_objects = nvmap_page_pool_count_objects, .scan_objects = nvmap_page_pool_scan_objects, .seeks = 1, }; +#endif static void shrink_page_pools(unsigned long *total_pages, unsigned long *available_pages) { @@ -771,10 +775,23 @@ int nvmap_page_pool_init(struct nvmap_device *dev) NULL, "nvmap-bz"); if (IS_ERR(background_allocator)) goto fail; +#if defined(NV_NVMAP_DYNAMIC_SHRINKER_ALLOC_SUPPORT) + nvmap_page_pool_shrinker = shrinker_alloc(0, "nvmap_pp_shrinker"); + if (!nvmap_page_pool_shrinker) { + goto fail; + } + + nvmap_page_pool_shrinker->count_objects = nvmap_page_pool_count_objects; + nvmap_page_pool_shrinker->scan_objects = nvmap_page_pool_scan_objects; + nvmap_page_pool_shrinker->seeks = 1; + + shrinker_register(nvmap_page_pool_shrinker); +#else #if defined(NV_REGISTER_SHRINKER_HAS_FMT_ARG) /* Linux v6.0 */ register_shrinker(&nvmap_page_pool_shrinker, "nvmap_pp_shrinker"); #else register_shrinker(&nvmap_page_pool_shrinker); +#endif #endif return 0; @@ -793,7 +810,12 @@ int nvmap_page_pool_fini(struct nvmap_device *dev) * registered */ if (!IS_ERR_OR_NULL(background_allocator)) { +#if defined(NV_NVMAP_DYNAMIC_SHRINKER_ALLOC_SUPPORT) + shrinker_free(nvmap_page_pool_shrinker); + nvmap_page_pool_shrinker = NULL; +#else unregister_shrinker(&nvmap_page_pool_shrinker); +#endif kthread_stop(background_allocator); background_allocator = NULL; }