diff --git a/include/linux/sched/frame_rtg.h b/include/linux/sched/frame_rtg.h index 71ecf65c599e4b469c92ab5fe50c7cc84e581d4f..added0ed2c11bd2cc59a4c41dde2b1370fd58572 100644 --- a/include/linux/sched/frame_rtg.h +++ b/include/linux/sched/frame_rtg.h @@ -21,7 +21,7 @@ struct frame_info { * rtg->prev_window_exec -=> the thread's runtime of last frame * rtg->prev_window_time -=> the actual time of the last frame */ - rwlock_t lock; + struct mutex lock; struct related_thread_group *rtg; int prio; struct task_struct *thread[MAX_TID_NUM]; diff --git a/kernel/sched/rtg/frame_rtg.c b/kernel/sched/rtg/frame_rtg.c index 686705e91cff5e267619f973dd969fa402e52b91..293fb03e36e2e73c38f3987d0aad77a3f7b9ef21 100644 --- a/kernel/sched/rtg/frame_rtg.c +++ b/kernel/sched/rtg/frame_rtg.c @@ -381,14 +381,14 @@ void set_frame_prio(struct frame_info *frame_info, int prio) if (!frame_info) return; - write_lock(&frame_info->lock); + mutex_lock(&frame_info->lock); if (frame_info->prio == prio) goto out; update_frame_task_prio(frame_info, prio); frame_info->prio = prio; out: - write_unlock(&frame_info->lock); + mutex_unlock(&frame_info->lock); } static int do_set_rtg_sched(struct task_struct *task, bool is_rtg, @@ -556,7 +556,7 @@ void update_frame_thread_info(struct frame_info *frame_info, // reset curr_rt_thread_num atomic_set(&frame_info->curr_rt_thread_num, 0); - write_lock(&frame_info->lock); + mutex_lock(&frame_info->lock); old_prio = frame_info->prio; real_thread = 0; for (i = 0; i < thread_num; i++) { @@ -568,7 +568,7 @@ void update_frame_thread_info(struct frame_info *frame_info, } frame_info->prio = prio; frame_info->thread_num = real_thread; - write_unlock(&frame_info->lock); + mutex_unlock(&frame_info->lock); } static void do_set_frame_sched_state(struct frame_info *frame_info, @@ -627,14 +627,14 @@ void set_frame_sched_state(struct frame_info *frame_info, bool enable) /* reset curr_rt_thread_num */ atomic_set(&frame_info->curr_rt_thread_num, 0); - write_lock(&frame_info->lock); + mutex_lock(&frame_info->lock); prio = frame_info->prio; for (i = 0; i < MAX_TID_NUM; i++) { if (frame_info->thread[i]) do_set_frame_sched_state(frame_info, frame_info->thread[i], enable, prio); } - write_unlock(&frame_info->lock); + mutex_unlock(&frame_info->lock); trace_rtg_frame_sched(frame_info->rtg->id, "FRAME_STATUS", frame_info->status); @@ -1165,9 +1165,9 @@ static int _init_frame_info(struct frame_info *frame_info, int id) unsigned long flags; memset(frame_info, 0, sizeof(struct frame_info)); - rwlock_init(&frame_info->lock); + mutex_init(&frame_info->lock); - write_lock(&frame_info->lock); + mutex_lock(&frame_info->lock); frame_info->frame_rate = DEFAULT_FRAME_RATE; frame_info->frame_time = div_u64(NSEC_PER_SEC, frame_info->frame_rate); frame_info->thread_num = 0; @@ -1188,7 +1188,7 @@ static int _init_frame_info(struct frame_info *frame_info, int id) grp = frame_rtg(id); if (unlikely(!grp)) { - write_unlock(&frame_info->lock); + mutex_unlock(&frame_info->lock); return -EINVAL; } @@ -1198,7 +1198,7 @@ static int _init_frame_info(struct frame_info *frame_info, int id) raw_spin_unlock_irqrestore(&grp->lock, flags); frame_info->rtg = grp; - write_unlock(&frame_info->lock); + mutex_unlock(&frame_info->lock); return 0; } diff --git a/kernel/sched/rtg/rtg_ctrl.c b/kernel/sched/rtg/rtg_ctrl.c index 923ed654de6c77486905e5ebda553a749a156d85..231aeaeb0507542bc9c4c6c8ea62cde98be62ecf 100644 --- a/kernel/sched/rtg/rtg_ctrl.c +++ b/kernel/sched/rtg/rtg_ctrl.c @@ -162,7 +162,7 @@ static int do_update_rt_frame_num(struct frame_info *frame_info, int new_type) int old_type; int ret = SUCC; - read_lock(&frame_info->lock); + mutex_lock(&frame_info->lock); old_type = frame_info->prio - DEFAULT_RT_PRIO; if (is_rt_type(new_type) == is_rt_type(old_type)) goto out; @@ -180,7 +180,7 @@ static int do_update_rt_frame_num(struct frame_info *frame_info, int new_type) } } out: - read_unlock(&frame_info->lock); + mutex_unlock(&frame_info->lock); return ret; } @@ -697,15 +697,15 @@ static int parse_add_rtg_thread(const struct rtg_grp_data *rs_data) pr_err("[SCHED_RTG] grp not created yet.\n"); return -INVALID_ARG; } - write_lock(&frame_info->lock); + mutex_lock(&frame_info->lock); add_num = rs_data->tid_num; if ((frame_info->thread_num < 0) || (add_num < 0)) { + mutex_unlock(&frame_info->lock); pr_err("[SCHED_RTG] Unexception err: frame_info num < 0.\n"); - write_unlock(&frame_info->lock); return -INVALID_RTG_ID; } if (frame_info->thread_num + add_num > MAX_TID_NUM) { - write_unlock(&frame_info->lock); + mutex_unlock(&frame_info->lock); return -INVALID_RTG_ID; } add_index = frame_info->thread_num; @@ -721,7 +721,7 @@ static int parse_add_rtg_thread(const struct rtg_grp_data *rs_data) fail_num++; } } - write_unlock(&frame_info->lock); + mutex_unlock(&frame_info->lock); return fail_num; }