From 16c65f5da8c65387d299198c8d985cdc4b53fa5b Mon Sep 17 00:00:00 2001 From: wangwang Date: Wed, 1 Nov 2023 15:23:19 +0800 Subject: [PATCH] moto_swap:fix kernel panic on memcg conf the app_score in default oemdata(hybridswap) is initialized as 300 however, the userspace only configures 100, 200, 400, 600 groups, there is no room fit for initial value, while go through all the memcgroups, it is not possible to find a slot to fit in the default value, the outbond index causes the panic Change-Id: I45e59a2629c17ae9eaa326c749d6ed4b51e3b2e7 Signed-off-by: wangwang Reviewed-on: https://gerrit.mot.com/2782610 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Reviewed-by: Xiangpo Zhao Tested-by: Jira Key Submit-Approved: Jira Key --- drivers/moto_swap/hybridswap/hybridswap_swapd.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/drivers/moto_swap/hybridswap/hybridswap_swapd.c b/drivers/moto_swap/hybridswap/hybridswap_swapd.c index 6e145efc4bee..51326c2d698e 100644 --- a/drivers/moto_swap/hybridswap/hybridswap_swapd.c +++ b/drivers/moto_swap/hybridswap/hybridswap_swapd.c @@ -397,21 +397,26 @@ static void swapd_mcgs_setup_parse(int level_num) { struct mem_cgroup *memcg = NULL; memcg_hybs_t *hybs = NULL; - int i; + int i, k; while ((memcg = fetch_next_memcg(memcg))) { hybs = MEMCGRP_ITEM_DATA(memcg); if (!hybs) continue; - for (i = 0; i < level_num; ++i) { + for (i = level_num - 1, k = 0; i >= 0; i--) { if (atomic64_read(&hybs->app_grade) >= zswap_param[i].min_grade && - atomic64_read(&hybs->app_grade) <= zswap_param[i].max_grade) + atomic64_read(&hybs->app_grade) <= zswap_param[i].max_grade) { + k = i; break; + } + else if (atomic64_read(&hybs->app_grade) <= zswap_param[i].max_grade) { + k = i; + } } - atomic_set(&hybs->mem2zram_scale, zswap_param[i].mem2zram_scale); - atomic_set(&hybs->zram2ufs_scale, zswap_param[i].zram2ufs_scale); - atomic_set(&hybs->pagefault_level, zswap_param[i].pagefault_level); + atomic_set(&hybs->mem2zram_scale, zswap_param[k].mem2zram_scale); + atomic_set(&hybs->zram2ufs_scale, zswap_param[k].zram2ufs_scale); + atomic_set(&hybs->pagefault_level, zswap_param[k].pagefault_level); } }