
hulk inclusion category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/IBN6HC -------------------------------- A CPU's current task can have its {closid, rmid} fields read locally while they are being concurrently written to from another CPU. This can happen anytime __resctrl_sched_in() races with either __rdtgroup_move_task() or rdt_move_group_tasks(). Prevent load / store tearing for those accesses by giving them the READ_ONCE() / WRITE_ONCE() treatment. Link: https://lkml.kernel.org/r/9921fda88ad81afb9885b517fbe864a2bc7c35a9.160824314... Fixes: e37caef15c18 ("resctrlfs: mpam: Build basic framework for mpam") Signed-off-by: Zeng Heng <zengheng4@huawei.com> --- arch/arm64/kernel/mpam/mpam_resctrl.c | 19 +++++++++++-------- fs/resctrlfs.c | 4 ++-- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/arch/arm64/kernel/mpam/mpam_resctrl.c b/arch/arm64/kernel/mpam/mpam_resctrl.c index 65ef64d2bec7..b04c0d2b8312 100644 --- a/arch/arm64/kernel/mpam/mpam_resctrl.c +++ b/arch/arm64/kernel/mpam/mpam_resctrl.c @@ -1356,12 +1356,12 @@ int __resctrl_group_move_task(struct task_struct *tsk, * their parent CTRL group. */ if (rdtgrp->type == RDTCTRL_GROUP) { - tsk->closid = resctrl_navie_closid(rdtgrp->closid); - tsk->rmid = resctrl_navie_rmid(rdtgrp->mon.rmid); + WRITE_ONCE(tsk->closid, resctrl_navie_closid(rdtgrp->closid)); + WRITE_ONCE(tsk->rmid, resctrl_navie_rmid(rdtgrp->mon.rmid)); } else if (rdtgrp->type == RDTMON_GROUP) { if (rdtgrp->mon.parent->closid.intpartid == tsk->closid) { - tsk->closid = resctrl_navie_closid(rdtgrp->closid); - tsk->rmid = resctrl_navie_rmid(rdtgrp->mon.rmid); + WRITE_ONCE(tsk->closid, resctrl_navie_closid(rdtgrp->closid)); + WRITE_ONCE(tsk->rmid, resctrl_navie_rmid(rdtgrp->mon.rmid)); } else { rdt_last_cmd_puts("Can't move task to different control group\n"); return -EINVAL; @@ -2198,19 +2198,22 @@ void __mpam_sched_in(void) u64 closid = state->default_closid; u64 reqpartid = 0; u64 pmg = 0; + u32 tmp; /* * If this task has a closid/rmid assigned, use it. * Else use the closid/rmid assigned to this cpu. */ if (static_branch_likely(&resctrl_alloc_enable_key)) { - if (current->closid) - closid = current->closid; + tmp = READ_ONCE(current->closid); + if (tmp) + closid = tmp; } if (static_branch_likely(&resctrl_mon_enable_key)) { - if (current->rmid) - rmid = current->rmid; + tmp = READ_ONCE(current->rmid); + if (tmp) + rmid = tmp; } if (closid != state->cur_closid || rmid != state->cur_rmid) { diff --git a/fs/resctrlfs.c b/fs/resctrlfs.c index acd0cbce5027..29fe73571870 100644 --- a/fs/resctrlfs.c +++ b/fs/resctrlfs.c @@ -454,8 +454,8 @@ static void resctrl_move_group_tasks(struct resctrl_group *from, struct resctrl_ read_lock(&tasklist_lock); for_each_process_thread(p, t) { if (!from || is_task_match_resctrl_group(t, from)) { - t->closid = resctrl_navie_closid(to->closid); - t->rmid = resctrl_navie_rmid(to->mon.rmid); + WRITE_ONCE(t->closid, resctrl_navie_closid(to->closid)); + WRITE_ONCE(t->rmid, resctrl_navie_rmid(to->mon.rmid)); #ifdef CONFIG_SMP /* -- 2.25.1