From 63e3a910f2a7bb8cd8f13d77664edf352c08fb74 Mon Sep 17 00:00:00 2001 From: wanxiaoqing Date: Wed, 29 Nov 2023 18:12:48 +0800 Subject: [PATCH] fix up app add rtg group failed when change backgroup to Signed-off-by: wanxiaoqing --- kernel/sched/rtg/frame_rtg.c | 33 +++++++++++++++++++++++++++++++++ kernel/sched/rtg/frame_rtg.h | 1 + kernel/sched/rtg/rtg_ctrl.c | 5 +++-- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/kernel/sched/rtg/frame_rtg.c b/kernel/sched/rtg/frame_rtg.c index 79db645228c4..e28dff2c9a9d 100644 --- a/kernel/sched/rtg/frame_rtg.c +++ b/kernel/sched/rtg/frame_rtg.c @@ -364,6 +364,39 @@ int search_rtg(int pid) return 0; } +/*Attention: only current invoke this function*/ +struct frame_info *lookup_frame_info_by_task(struct task_struct *task) +{ + struct rtg_info grp_info; + struct frame_info *frame_info = NULL; + int i = 0; + int j = 0; + + grp_info.rtg_num = 0; + + read_lock(&g_id_manager.lock); + for (i = MULTI_FRAME_ID; i < MULTI_FRAME_ID + MULTI_FRAME_NUM; i++) { + if (test_bit(i - MULTI_FRAME_ID, g_id_manager.id_map)) { + grp_info.rtgs[grp_info.rtg_num] = i; + grp_info.rtg_num++; + } + } + read_unlock(&g_id_manager.lock); + for (i = 0; i < grp_info.rtg_num; i++) { + frame_info = lookup_frame_info_by_grp_id(grp_info.rtgs[i]); + if (!frame_info) { + pr_err("[FRAME_RTG] unexpected grp %d find error\n", i); + return NULL; + } + for (j = 0; j < frame_info->thread_num; j++) { + if(frame_info->thread[j] && frame_info->thread[j]->pid == task->pid) + return frame_info; + } + } + + return NULL; +} + static void update_frame_task_prio(struct frame_info *frame_info, int prio) { int i; diff --git a/kernel/sched/rtg/frame_rtg.h b/kernel/sched/rtg/frame_rtg.h index 01f23d27413a..4cf0817044cb 100644 --- a/kernel/sched/rtg/frame_rtg.h +++ b/kernel/sched/rtg/frame_rtg.h @@ -108,6 +108,7 @@ void set_frame_sched_state(struct frame_info *frame_info, bool enable); int set_frame_margin(struct frame_info *frame_info, int margin); int set_frame_timestamp(struct frame_info *frame_info, unsigned long timestamp); int set_frame_max_util(struct frame_info *frame_info, int max_util); +struct frame_info *lookup_frame_info_by_task(struct task_struct *task); int set_frame_min_util(struct frame_info *frame_info, int min_util, bool is_boost); struct frame_info *lookup_frame_info_by_grp_id(int grp_id); int list_rtg_group(struct rtg_info *rs_data); diff --git a/kernel/sched/rtg/rtg_ctrl.c b/kernel/sched/rtg/rtg_ctrl.c index 0931e93dc5fa..c8df83ecc8e9 100644 --- a/kernel/sched/rtg/rtg_ctrl.c +++ b/kernel/sched/rtg/rtg_ctrl.c @@ -487,9 +487,10 @@ int update_frame_state(int grp_id, int margin, bool in_frame) { struct frame_info *frame_info = NULL; - frame_info = lookup_frame_info_by_grp_id(grp_id); - if (!frame_info || !frame_info->rtg) + frame_info = lookup_frame_info_by_task(current); + if (!frame_info || !frame_info->rtg) { return -INVALID_RTG_ID; + } if (in_frame) { start_frame_freq(frame_info); -- Gitee