From: "Yu, Fenghua" <fenghua.yu@intel.com>
To: James Morse <james.morse@arm.com>,
"x86@kernel.org" <x86@kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Cc: "Chatre, Reinette" <reinette.chatre@intel.com>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
H Peter Anvin <hpa@zytor.com>, Babu Moger <Babu.Moger@amd.com>,
"shameerali.kolothum.thodi@huawei.com"
<shameerali.kolothum.thodi@huawei.com>,
D Scott Phillips OS <scott@os.amperecomputing.com>,
"carl@os.amperecomputing.com" <carl@os.amperecomputing.com>,
"lcherian@marvell.com" <lcherian@marvell.com>,
"bobo.shaobowang@huawei.com" <bobo.shaobowang@huawei.com>,
"tan.shaopeng@fujitsu.com" <tan.shaopeng@fujitsu.com>,
"xingxin.hx@openanolis.org" <xingxin.hx@openanolis.org>,
"baolin.wang@linux.alibaba.com" <baolin.wang@linux.alibaba.com>,
Jamie Iles <quic_jiles@quicinc.com>,
Xin Hao <xhao@linux.alibaba.com>,
"peternewman@google.com" <peternewman@google.com>
Subject: RE: [PATCH v2 07/18] x86/resctrl: Move CLOSID/RMID matching and setting to use helpers
Date: Tue, 17 Jan 2023 19:10:33 +0000 [thread overview]
Message-ID: <IA1PR11MB6097186B7E9C2CF52A7F29C99BC69@IA1PR11MB6097.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20230113175459.14825-8-james.morse@arm.com>
Hi, James,
> When switching tasks, the CLOSID and RMID that the new task should use are
> stored in struct task_struct. For x86 the CLOSID known by resctrl, the value in
> task_struct, and the value written to the CPU register are all the same thing.
>
> MPAM's CPU interface has two different PARTID's one for data accesses the
> other for instruction fetch. Storing resctrl's CLOSID value in struct task_struct
> implies the arch code knows whether resctrl is using CDP.
>
> Move the matching and setting of the struct task_struct properties to use
> helpers. This allows arm64 to store the hardware format of the register, instead
> of having to convert it each time.
>
> __rdtgroup_move_task()s use of READ_ONCE()/WRITE_ONCE() ensures torn
> values aren't seen as another CPU may schedule the task being moved while the
> value is being changed. MPAM has an additional corner-case here as the PMG
> bits extend the PARTID space. If the scheduler sees a new-CLOSID but old-RMID,
> the task will dirty an RMID that the limbo code is not watching causing an
> inaccurate count. x86's RMID are independent values, so the limbo code will still
> be watching the old-RMID in this circumstance.
> To avoid this, arm64 needs both the CLOSID/RMID WRITE_ONCE()d together.
> Both values must be provided together.
>
> Because MPAM's RMID values are not unique, the CLOSID must be provided
> when matching the RMID.
>
> CC: Valentin Schneider <vschneid@redhat.com>
> Tested-by: Shaopeng Tan <tan.shaopeng@fujitsu.com>
> Signed-off-by: James Morse <james.morse@arm.com>
> ---
> arch/x86/include/asm/resctrl.h | 18 ++++++++
> arch/x86/kernel/cpu/resctrl/rdtgroup.c | 57 +++++++++++++++-----------
> 2 files changed, 51 insertions(+), 24 deletions(-)
>
> diff --git a/arch/x86/include/asm/resctrl.h b/arch/x86/include/asm/resctrl.h
> index 44d568f3577c..d589a82995ac 100644
> --- a/arch/x86/include/asm/resctrl.h
> +++ b/arch/x86/include/asm/resctrl.h
> @@ -95,6 +95,24 @@ static inline unsigned int
> resctrl_arch_round_mon_val(unsigned int val)
> return val * scale;
> }
>
> +static inline void resctrl_arch_set_closid_rmid(struct task_struct *tsk,
> + u32 closid, u32 rmid)
> +{
> + WRITE_ONCE(tsk->closid, closid);
> + WRITE_ONCE(tsk->rmid, rmid);
> +}
> +
> +static inline bool resctrl_arch_match_closid(struct task_struct *tsk,
> +u32 closid) {
> + return READ_ONCE(tsk->closid) == closid; }
> +
> +static inline bool resctrl_arch_match_rmid(struct task_struct *tsk, u32 ignored,
> + u32 rmid)
> +{
> + return READ_ONCE(tsk->rmid) == rmid;
> +}
> +
> static inline void resctrl_sched_in(void) {
> if (static_branch_likely(&rdt_enable_key))
> diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c
> b/arch/x86/kernel/cpu/resctrl/rdtgroup.c
> index e1f879e13823..ced7400decae 100644
> --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c
> +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c
> @@ -84,7 +84,7 @@ void rdt_last_cmd_printf(const char *fmt, ...)
> *
> * Using a global CLOSID across all resources has some advantages and
> * some drawbacks:
> - * + We can simply set "current->closid" to assign a task to a resource
> + * + We can simply set current's closid to assign a task to a resource
> * group.
Seems this change doesn't gain anything. Maybe this change can be removed?
> * + Context switch code can avoid extra memory references deciding which
> * CLOSID to load into the PQR_ASSOC MSR
> @@ -549,14 +549,26 @@ static void update_task_closid_rmid(struct
> task_struct *t)
> _update_task_closid_rmid(t);
> }
>
> +static bool task_in_rdtgroup(struct task_struct *tsk, struct rdtgroup
> +*rdtgrp) {
> + u32 closid, rmid = rdtgrp->mon.rmid;
> +
> + if (rdtgrp->type == RDTCTRL_GROUP)
> + closid = rdtgrp->closid;
> + else if (rdtgrp->type == RDTMON_GROUP)
> + closid = rdtgrp->mon.parent->closid;
> + else
> + return false;
> +
> + return resctrl_arch_match_closid(tsk, closid) &&
> + resctrl_arch_match_rmid(tsk, closid, rmid); }
> +
> static int __rdtgroup_move_task(struct task_struct *tsk,
> struct rdtgroup *rdtgrp)
> {
> /* If the task is already in rdtgrp, no need to move the task. */
> - if ((rdtgrp->type == RDTCTRL_GROUP && tsk->closid == rdtgrp->closid
> &&
> - tsk->rmid == rdtgrp->mon.rmid) ||
> - (rdtgrp->type == RDTMON_GROUP && tsk->rmid == rdtgrp-
> >mon.rmid &&
> - tsk->closid == rdtgrp->mon.parent->closid))
> + if (task_in_rdtgroup(tsk, rdtgrp))
> return 0;
>
> /*
> @@ -567,19 +579,14 @@ static int __rdtgroup_move_task(struct task_struct
> *tsk,
> * For monitor groups, can move the tasks only from
> * their parent CTRL group.
> */
> -
> - if (rdtgrp->type == RDTCTRL_GROUP) {
> - WRITE_ONCE(tsk->closid, rdtgrp->closid);
> - WRITE_ONCE(tsk->rmid, rdtgrp->mon.rmid);
> - } else if (rdtgrp->type == RDTMON_GROUP) {
> - if (rdtgrp->mon.parent->closid == tsk->closid) {
> - WRITE_ONCE(tsk->rmid, rdtgrp->mon.rmid);
> - } else {
> - rdt_last_cmd_puts("Can't move task to different
> control group\n");
> - return -EINVAL;
> - }
> + if (rdtgrp->type == RDTMON_GROUP &&
> + !resctrl_arch_match_closid(tsk, rdtgrp->mon.parent->closid)) {
> + rdt_last_cmd_puts("Can't move task to different control
> group\n");
> + return -EINVAL;
> }
>
> + resctrl_arch_set_closid_rmid(tsk, rdtgrp->closid, rdtgrp->mon.rmid);
> +
> /*
> * Ensure the task's closid and rmid are written before determining if
> * the task is current that will decide if it will be interrupted.
> @@ -599,14 +606,15 @@ static int __rdtgroup_move_task(struct task_struct
> *tsk,
>
> static bool is_closid_match(struct task_struct *t, struct rdtgroup *r) {
> - return (rdt_alloc_capable &&
> - (r->type == RDTCTRL_GROUP) && (t->closid == r->closid));
> + return (rdt_alloc_capable && (r->type == RDTCTRL_GROUP) &&
> + resctrl_arch_match_closid(t, r->closid));
> }
>
> static bool is_rmid_match(struct task_struct *t, struct rdtgroup *r) {
> - return (rdt_mon_capable &&
> - (r->type == RDTMON_GROUP) && (t->rmid == r->mon.rmid));
> + return (rdt_mon_capable && (r->type == RDTMON_GROUP) &&
> + resctrl_arch_match_rmid(t, r->mon.parent->closid,
> + r->mon.rmid));
> }
>
> /**
> @@ -802,7 +810,7 @@ int proc_resctrl_show(struct seq_file *s, struct
> pid_namespace *ns,
> rdtg->mode != RDT_MODE_EXCLUSIVE)
> continue;
>
> - if (rdtg->closid != tsk->closid)
> + if (!resctrl_arch_match_closid(tsk, rdtg->closid))
> continue;
>
> seq_printf(s, "res:%s%s\n", (rdtg == &rdtgroup_default) ? "/" : "",
> @@ -810,7 +818,8 @@ int proc_resctrl_show(struct seq_file *s, struct
> pid_namespace *ns,
> seq_puts(s, "mon:");
> list_for_each_entry(crg, &rdtg->mon.crdtgrp_list,
> mon.crdtgrp_list) {
> - if (tsk->rmid != crg->mon.rmid)
> + if (!resctrl_arch_match_rmid(tsk, crg->mon.parent-
> >closid,
> + crg->mon.rmid))
> continue;
> seq_printf(s, "%s", crg->kn->name);
> break;
> @@ -2401,8 +2410,8 @@ static void rdt_move_group_tasks(struct rdtgroup
> *from, struct rdtgroup *to,
> for_each_process_thread(p, t) {
> if (!from || is_closid_match(t, from) ||
> is_rmid_match(t, from)) {
> - WRITE_ONCE(t->closid, to->closid);
> - WRITE_ONCE(t->rmid, to->mon.rmid);
> + resctrl_arch_set_closid_rmid(t, to->closid,
> + to->mon.rmid);
>
> /*
> * If the task is on a CPU, set the CPU in the mask.
> --
> 2.30.2
Thanks.
-Fenghua
next prev parent reply other threads:[~2023-01-17 20:19 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-13 17:54 [PATCH v2 00/18] x86/resctrl: monitored closid+rmid together, separate arch/fs locking James Morse
2023-01-13 17:54 ` [PATCH v2 01/18] x86/resctrl: Track the closid with the rmid James Morse
2023-01-13 17:54 ` [PATCH v2 02/18] x86/resctrl: Access per-rmid structures by index James Morse
2023-01-17 18:28 ` Yu, Fenghua
2023-03-03 18:33 ` James Morse
2023-01-17 18:29 ` Yu, Fenghua
2023-02-02 23:44 ` Reinette Chatre
2023-03-03 18:33 ` James Morse
2023-01-13 17:54 ` [PATCH v2 03/18] x86/resctrl: Create helper for RMID allocation and mondata dir creation James Morse
2023-01-13 17:54 ` [PATCH v2 04/18] x86/resctrl: Move rmid allocation out of mkdir_rdt_prepare() James Morse
2023-01-17 18:28 ` Yu, Fenghua
2023-02-02 23:45 ` Reinette Chatre
2023-03-03 18:33 ` James Morse
2023-01-13 17:54 ` [PATCH v2 05/18] x86/resctrl: Allow RMID allocation to be scoped by CLOSID James Morse
2023-01-17 18:53 ` Yu, Fenghua
2023-03-03 18:34 ` James Morse
2023-02-02 23:45 ` Reinette Chatre
2023-03-03 18:34 ` James Morse
2023-03-10 19:57 ` Reinette Chatre
2023-01-13 17:54 ` [PATCH v2 06/18] x86/resctrl: Allow the allocator to check if a CLOSID can allocate clean RMID James Morse
2023-01-17 18:29 ` Yu, Fenghua
2023-03-03 18:35 ` James Morse
2023-02-02 23:46 ` Reinette Chatre
2023-03-03 18:36 ` James Morse
2023-03-10 19:59 ` Reinette Chatre
2023-03-20 17:12 ` James Morse
2023-01-13 17:54 ` [PATCH v2 07/18] x86/resctrl: Move CLOSID/RMID matching and setting to use helpers James Morse
2023-01-17 19:10 ` Yu, Fenghua [this message]
2023-03-03 18:37 ` James Morse
2023-02-02 23:47 ` Reinette Chatre
2023-03-06 11:32 ` James Morse
2023-03-08 10:30 ` Peter Newman
2023-03-10 20:00 ` Reinette Chatre
2023-01-13 17:54 ` [PATCH v2 08/18] x86/resctrl: Queue mon_event_read() instead of sending an IPI James Morse
2023-01-17 18:29 ` Yu, Fenghua
2023-03-06 11:32 ` James Morse
2023-03-10 20:00 ` Reinette Chatre
2023-02-02 23:47 ` Reinette Chatre
2023-03-06 11:33 ` James Morse
2023-03-08 16:09 ` James Morse
2023-03-10 20:06 ` Reinette Chatre
2023-03-20 17:12 ` James Morse
2023-01-13 17:54 ` [PATCH v2 09/18] x86/resctrl: Allow resctrl_arch_rmid_read() to sleep James Morse
2023-01-23 13:54 ` Peter Newman
2023-03-06 11:33 ` James Morse
2023-01-23 15:33 ` Peter Newman
2023-03-06 11:33 ` James Morse
2023-03-06 13:14 ` Peter Newman
2023-03-08 17:45 ` James Morse
2023-03-09 13:41 ` Peter Newman
2023-03-09 17:35 ` James Morse
2023-03-10 9:28 ` Peter Newman
2023-03-20 17:12 ` James Morse
2023-03-22 13:21 ` Peter Newman
2023-01-13 17:54 ` [PATCH v2 10/18] x86/resctrl: Allow arch to allocate memory needed in resctrl_arch_rmid_read() James Morse
2023-01-13 17:54 ` [PATCH v2 11/18] x86/resctrl: Make resctrl_mounted checks explicit James Morse
2023-01-13 17:54 ` [PATCH v2 12/18] x86/resctrl: Move alloc/mon static keys into helpers James Morse
2023-01-13 17:54 ` [PATCH v2 13/18] x86/resctrl: Make rdt_enable_key the arch's decision to switch James Morse
2023-02-02 23:48 ` Reinette Chatre
2023-01-13 17:54 ` [PATCH v2 14/18] x86/resctrl: Add helpers for system wide mon/alloc capable James Morse
2023-01-25 7:16 ` Shaopeng Tan (Fujitsu)
2023-03-06 11:34 ` James Morse
2023-01-13 17:54 ` [PATCH v2 15/18] x86/resctrl: Add cpu online callback for resctrl work James Morse
2023-01-13 17:54 ` [PATCH v2 16/18] x86/resctrl: Allow overflow/limbo handlers to be scheduled on any-but cpu James Morse
2023-02-02 23:49 ` Reinette Chatre
2023-03-06 11:34 ` James Morse
2023-01-13 17:54 ` [PATCH v2 17/18] x86/resctrl: Add cpu offline callback for resctrl work James Morse
2023-01-13 17:54 ` [PATCH v2 18/18] x86/resctrl: Separate arch and fs resctrl locks James Morse
2023-02-02 23:50 ` Reinette Chatre
2023-03-06 11:34 ` James Morse
2023-03-11 0:22 ` Reinette Chatre
2023-03-20 17:12 ` James Morse
2023-01-25 7:19 ` [PATCH v2 00/18] x86/resctrl: monitored closid+rmid together, separate arch/fs locking Shaopeng Tan (Fujitsu)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=IA1PR11MB6097186B7E9C2CF52A7F29C99BC69@IA1PR11MB6097.namprd11.prod.outlook.com \
--to=fenghua.yu@intel.com \
--cc=Babu.Moger@amd.com \
--cc=baolin.wang@linux.alibaba.com \
--cc=bobo.shaobowang@huawei.com \
--cc=bp@alien8.de \
--cc=carl@os.amperecomputing.com \
--cc=hpa@zytor.com \
--cc=james.morse@arm.com \
--cc=lcherian@marvell.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=peternewman@google.com \
--cc=quic_jiles@quicinc.com \
--cc=reinette.chatre@intel.com \
--cc=scott@os.amperecomputing.com \
--cc=shameerali.kolothum.thodi@huawei.com \
--cc=tan.shaopeng@fujitsu.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
--cc=xhao@linux.alibaba.com \
--cc=xingxin.hx@openanolis.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).