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 <zhengqi.arch@bytedance.com>

    md/raid5: dynamically allocate the md-raid5 shrinker
***

Bug 4346767

Change-Id: Idbe40753f79481d85e5899d2905039860d39dc5e
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3020001
Reviewed-by: Suresh Mangipudi <smangipudi@nvidia.com>
GVS: Gerrit_Virtual_Submit <buildbot_gerritrpt@nvidia.com>
This commit is contained in:
Laxman Dewangan
2023-11-21 16:52:56 +00:00
committed by mobile promotions
parent 4ef0a332e8
commit fc748158cc
2 changed files with 25 additions and 0 deletions

View File

@@ -95,6 +95,9 @@ subdir-ccflags-y += -DNV_PWM_OPS_HAS_NO_OWNER
# get_file_rcu() have change the argument # get_file_rcu() have change the argument
subdir-ccflags-y += -DNV_GET_FILE_RCU_HAS_PTR_FILE_ARGS subdir-ccflags-y += -DNV_GET_FILE_RCU_HAS_PTR_FILE_ARGS
# Support enable to allocate shrinker dynamically
subdir-ccflags-y += -DNV_NVMAP_DYNAMIC_SHRINKER_ALLOC_SUPPORT
endif endif
ifeq ($(CONFIG_TEGRA_VIRTUALIZATION),y) ifeq ($(CONFIG_TEGRA_VIRTUALIZATION),y)

View File

@@ -581,11 +581,15 @@ static unsigned long nvmap_page_pool_scan_objects(struct shrinker *shrinker,
SHRINK_STOP : (sc->nr_to_scan - remaining); 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 = { static struct shrinker nvmap_page_pool_shrinker = {
.count_objects = nvmap_page_pool_count_objects, .count_objects = nvmap_page_pool_count_objects,
.scan_objects = nvmap_page_pool_scan_objects, .scan_objects = nvmap_page_pool_scan_objects,
.seeks = 1, .seeks = 1,
}; };
#endif
static void shrink_page_pools(unsigned long *total_pages, unsigned long *available_pages) 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"); NULL, "nvmap-bz");
if (IS_ERR(background_allocator)) if (IS_ERR(background_allocator))
goto fail; 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 */ #if defined(NV_REGISTER_SHRINKER_HAS_FMT_ARG) /* Linux v6.0 */
register_shrinker(&nvmap_page_pool_shrinker, "nvmap_pp_shrinker"); register_shrinker(&nvmap_page_pool_shrinker, "nvmap_pp_shrinker");
#else #else
register_shrinker(&nvmap_page_pool_shrinker); register_shrinker(&nvmap_page_pool_shrinker);
#endif
#endif #endif
return 0; return 0;
@@ -793,7 +810,12 @@ int nvmap_page_pool_fini(struct nvmap_device *dev)
* registered * registered
*/ */
if (!IS_ERR_OR_NULL(background_allocator)) { 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); unregister_shrinker(&nvmap_page_pool_shrinker);
#endif
kthread_stop(background_allocator); kthread_stop(background_allocator);
background_allocator = NULL; background_allocator = NULL;
} }