From: Ben Horgan <ben.horgan@arm.com>
To: Tony Luck <tony.luck@intel.com>, Fenghua Yu <fenghuay@nvidia.com>,
Reinette Chatre <reinette.chatre@intel.com>,
Maciej Wieczor-Retman <maciej.wieczor-retman@intel.com>,
Peter Newman <peternewman@google.com>,
James Morse <james.morse@arm.com>,
Babu Moger <babu.moger@amd.com>,
Drew Fustini <dfustini@baylibre.com>,
Dave Martin <Dave.Martin@arm.com>, Chen Yu <yu.c.chen@intel.com>,
David E Box <david.e.box@intel.com>,
x86@kernel.org
Cc: Christoph Hellwig <hch@infradead.org>,
linux-kernel@vger.kernel.org, patches@lists.linux.dev
Subject: Re: [PATCH v14 06/24] arm,x86,fs/resctrl: Replace architecture capability helpers with generic versions
Date: Wed, 4 Nov 2026 15:23:34 +0000 [thread overview]
Message-ID: <293d0352-7a5d-4b8a-b004-277cd8a81902@arm.com> (raw)
In-Reply-To: <20261019205031.16977-7-tony.luck@intel.com>
Hi Tony,
On 19/10/2026 21:50, Tony Luck wrote:
> resctrl supports allocation or monitoring if any resource is capable of
> it. Each architecture answers this via resctrl_arch_alloc_capable() and
> resctrl_arch_mon_capable(). x86 maintains global flags for this in
> addition to the per-resource flags and must keep both in sync. MPAM
> derives the answer from its per-resource flags.
>
> The per-resource flags are part of the resource description that the file
> system already has, so the architecture helpers duplicate information
> available to the file system.
>
> Define resctrl_alloc_capable() and resctrl_mon_capable() in the file system
> based on the per-resource flags and remove the architecture helpers, in
> preparation for removing the x86 global flags. The result is unchanged for
> MPAM, which presents all monitors on the L3 resource.
>
> Suggested-by: Reinette Chatre <reinette.chatre@intel.com>
> Signed-off-by: Tony Luck <tony.luck@intel.com>
Looks good to me. For the MPAM parts:
Acked-by: Ben Horgan <ben.horgan@arm.com>
Thanks,
Ben
> ---
> v14:
> New Subject: without {alloc,mon}
> New commit message in context, problem, solution format
> Did not apply Reinette RB tag because of commit message rewrite.
> ---
> include/linux/arm_mpam.h | 3 ---
> include/linux/resctrl.h | 30 ++++++++++++++++++++++++++++
> arch/x86/include/asm/resctrl.h | 10 ----------
> drivers/resctrl/mpam_resctrl.c | 26 ++----------------------
> fs/resctrl/monitor.c | 10 +++++-----
> fs/resctrl/pseudo_lock.c | 6 +++---
> fs/resctrl/rdtgroup.c | 36 +++++++++++++++++-----------------
> 7 files changed, 58 insertions(+), 63 deletions(-)
>
> diff --git a/include/linux/arm_mpam.h b/include/linux/arm_mpam.h
> index f92a36187a52..ba4131048260 100644
> --- a/include/linux/arm_mpam.h
> +++ b/include/linux/arm_mpam.h
> @@ -50,9 +50,6 @@ static inline int mpam_ris_create(struct mpam_msc *msc, u8 ris_idx,
> }
> #endif
>
> -bool resctrl_arch_alloc_capable(void);
> -bool resctrl_arch_mon_capable(void);
> -
> void resctrl_arch_set_cpu_default_closid(int cpu, u32 closid);
> void resctrl_arch_set_closid_rmid(struct task_struct *tsk, u32 closid, u32 rmid);
> void resctrl_arch_set_cpu_default_closid_rmid(int cpu, u32 closid, u32 rmid);
> diff --git a/include/linux/resctrl.h b/include/linux/resctrl.h
> index 10dfdca7f4bf..0e7fce070fde 100644
> --- a/include/linux/resctrl.h
> +++ b/include/linux/resctrl.h
> @@ -346,6 +346,36 @@ struct rdt_resource {
> */
> struct rdt_resource *resctrl_arch_get_resource(enum resctrl_res_level l);
>
> +/*
> + * resctrl_alloc_capable - Are any allocation resources enabled?
> + */
> +static inline bool resctrl_alloc_capable(void)
> +{
> + struct rdt_resource *r;
> +
> + for_each_rdt_resource(r) {
> + if (r->alloc_capable)
> + return true;
> + }
> +
> + return false;
> +}
> +
> +/*
> + * resctrl_mon_capable - Are any monitor resources enabled?
> + */
> +static inline bool resctrl_mon_capable(void)
> +{
> + struct rdt_resource *r;
> +
> + for_each_rdt_resource(r) {
> + if (r->mon_capable)
> + return true;
> + }
> +
> + return false;
> +}
> +
> /**
> * struct resctrl_schema - configuration abilities of a resource presented to
> * user-space
> diff --git a/arch/x86/include/asm/resctrl.h b/arch/x86/include/asm/resctrl.h
> index 2031b30ff25b..9c44a7766631 100644
> --- a/arch/x86/include/asm/resctrl.h
> +++ b/arch/x86/include/asm/resctrl.h
> @@ -50,11 +50,6 @@ DECLARE_STATIC_KEY_FALSE(rdt_enable_key);
> DECLARE_STATIC_KEY_FALSE(rdt_alloc_enable_key);
> DECLARE_STATIC_KEY_FALSE(rdt_mon_enable_key);
>
> -static inline bool resctrl_arch_alloc_capable(void)
> -{
> - return rdt_alloc_capable;
> -}
> -
> static inline void resctrl_arch_enable_alloc(void)
> {
> static_branch_enable_cpuslocked(&rdt_alloc_enable_key);
> @@ -67,11 +62,6 @@ static inline void resctrl_arch_disable_alloc(void)
> static_branch_dec_cpuslocked(&rdt_enable_key);
> }
>
> -static inline bool resctrl_arch_mon_capable(void)
> -{
> - return rdt_mon_capable;
> -}
> -
> static inline void resctrl_arch_enable_mon(void)
> {
> static_branch_enable_cpuslocked(&rdt_mon_enable_key);
> diff --git a/drivers/resctrl/mpam_resctrl.c b/drivers/resctrl/mpam_resctrl.c
> index f2c651e9f6ea..7ddee8f5162f 100644
> --- a/drivers/resctrl/mpam_resctrl.c
> +++ b/drivers/resctrl/mpam_resctrl.c
> @@ -75,28 +75,6 @@ static DECLARE_WAIT_QUEUE_HEAD(wait_cacheinfo_ready);
> */
> static bool resctrl_enabled;
>
> -bool resctrl_arch_alloc_capable(void)
> -{
> - struct mpam_resctrl_res *res;
> - enum resctrl_res_level rid;
> -
> - for_each_mpam_resctrl_control(res, rid) {
> - if (res->resctrl_res.alloc_capable)
> - return true;
> - }
> -
> - return false;
> -}
> -
> -bool resctrl_arch_mon_capable(void)
> -{
> - struct mpam_resctrl_res *res = &mpam_resctrl_controls[RDT_RESOURCE_L3];
> - struct rdt_resource *l3 = &res->resctrl_res;
> -
> - /* All monitors are presented as being on the L3 cache */
> - return l3->mon_capable;
> -}
> -
> bool resctrl_arch_is_evt_configurable(enum resctrl_event_id evt)
> {
> return false;
> @@ -1902,9 +1880,9 @@ int mpam_resctrl_setup(void)
>
> cpus_read_unlock();
>
> - if (!resctrl_arch_alloc_capable() && !resctrl_arch_mon_capable()) {
> + if (!resctrl_alloc_capable() && !resctrl_mon_capable()) {
> pr_debug("No alloc(%u) or monitor(%u) found - resctrl not supported\n",
> - resctrl_arch_alloc_capable(), resctrl_arch_mon_capable());
> + resctrl_alloc_capable(), resctrl_mon_capable());
> return -EOPNOTSUPP;
> }
>
> diff --git a/fs/resctrl/monitor.c b/fs/resctrl/monitor.c
> index 04e4ea612b7c..cb34d3637ee5 100644
> --- a/fs/resctrl/monitor.c
> +++ b/fs/resctrl/monitor.c
> @@ -338,7 +338,7 @@ void free_rmid(u32 closid, u32 rmid)
> * allows architectures that ignore the closid parameter to avoid an
> * unnecessary check.
> */
> - if (!resctrl_arch_mon_capable() ||
> + if (!resctrl_mon_capable() ||
> idx == resctrl_arch_rmid_idx_encode(RESCTRL_RESERVED_CLOSID,
> RESCTRL_RESERVED_RMID))
> return;
> @@ -888,7 +888,7 @@ void mbm_handle_overflow(struct work_struct *work)
> * If the filesystem has been unmounted this work no longer needs to
> * run.
> */
> - if (!resctrl_mounted || !resctrl_arch_mon_capable())
> + if (!resctrl_mounted || !resctrl_mon_capable())
> goto out_unlock;
>
> /*
> @@ -950,7 +950,7 @@ void mbm_setup_overflow_handler(struct rdt_l3_mon_domain *dom, unsigned long del
> * When a domain comes online there is no guarantee the filesystem is
> * mounted. If not, there is no need to catch counter overflow.
> */
> - if (!resctrl_mounted || !resctrl_arch_mon_capable())
> + if (!resctrl_mounted || !resctrl_mon_capable())
> return;
> cpu = cpumask_any_housekeeping(&dom->hdr.cpu_mask, exclude_cpu);
> dom->mbm_work_cpu = cpu;
> @@ -966,7 +966,7 @@ int setup_rmid_lru_list(void)
> u32 idx;
> int i;
>
> - if (!resctrl_arch_mon_capable())
> + if (!resctrl_mon_capable())
> return 0;
>
> /*
> @@ -1006,7 +1006,7 @@ int setup_rmid_lru_list(void)
>
> void free_rmid_lru_list(void)
> {
> - if (!resctrl_arch_mon_capable())
> + if (!resctrl_mon_capable())
> return;
>
> mutex_lock(&rdtgroup_mutex);
> diff --git a/fs/resctrl/pseudo_lock.c b/fs/resctrl/pseudo_lock.c
> index 56ab63f19bad..3d831227a42f 100644
> --- a/fs/resctrl/pseudo_lock.c
> +++ b/fs/resctrl/pseudo_lock.c
> @@ -383,7 +383,7 @@ static int rdtgroup_locksetup_user_restrict(struct rdtgroup *rdtgrp)
> if (ret)
> goto err_cpus;
>
> - if (resctrl_arch_mon_capable()) {
> + if (resctrl_mon_capable()) {
> ret = rdtgroup_kn_mode_restrict(rdtgrp, "mon_groups");
> if (ret)
> goto err_cpus_list;
> @@ -430,7 +430,7 @@ static int rdtgroup_locksetup_user_restore(struct rdtgroup *rdtgrp)
> if (ret)
> goto err_cpus;
>
> - if (resctrl_arch_mon_capable()) {
> + if (resctrl_mon_capable()) {
> ret = rdtgroup_kn_mode_restore(rdtgrp, "mon_groups", 0777);
> if (ret)
> goto err_cpus_list;
> @@ -577,7 +577,7 @@ int rdtgroup_locksetup_exit(struct rdtgroup *rdtgrp)
> {
> int ret;
>
> - if (resctrl_arch_mon_capable()) {
> + if (resctrl_mon_capable()) {
> ret = alloc_rmid(rdtgrp->closid);
> if (ret < 0) {
> rdt_last_cmd_puts("Out of RMIDs\n");
> diff --git a/fs/resctrl/rdtgroup.c b/fs/resctrl/rdtgroup.c
> index 57ab090072c2..96a4978ce6b6 100644
> --- a/fs/resctrl/rdtgroup.c
> +++ b/fs/resctrl/rdtgroup.c
> @@ -691,7 +691,7 @@ static bool is_closid_match(struct task_struct *t, struct rdtgroup *r)
>
> static bool is_rmid_match(struct task_struct *t, struct rdtgroup *r)
> {
> - return (resctrl_arch_mon_capable() && (r->type == RDTMON_GROUP) &&
> + return (resctrl_mon_capable() && (r->type == RDTMON_GROUP) &&
> resctrl_arch_match_rmid(t, r->mon.parent->closid,
> r->mon.rmid));
> }
> @@ -3157,9 +3157,9 @@ static void resctrl_unmount(void)
> resctrl_arch_reset_all_ctrls(r);
>
> resctrl_fs_teardown();
> - if (resctrl_arch_alloc_capable())
> + if (resctrl_alloc_capable())
> resctrl_arch_disable_alloc();
> - if (resctrl_arch_mon_capable())
> + if (resctrl_mon_capable())
> resctrl_arch_disable_mon();
> resctrl_mounted = false;
> mutex_unlock(&rdtgroup_mutex);
> @@ -3213,7 +3213,7 @@ static int rdt_get_tree(struct fs_context *fc)
> if (ret)
> goto out_schemata_free;
>
> - if (resctrl_arch_mon_capable())
> + if (resctrl_mon_capable())
> flags |= RFTYPE_MON;
>
> ret = rdtgroup_add_files(rdtgroup_default.kn, flags);
> @@ -3226,7 +3226,7 @@ static int rdt_get_tree(struct fs_context *fc)
> if (ret < 0)
> goto out_closid_exit;
>
> - if (resctrl_arch_mon_capable()) {
> + if (resctrl_mon_capable()) {
> ret = mongroup_create_dir(rdtgroup_default.kn,
> &rdtgroup_default, "mon_groups",
> &kn_mongrp);
> @@ -3246,12 +3246,12 @@ static int rdt_get_tree(struct fs_context *fc)
> if (ret)
> goto out_mondata;
>
> - if (resctrl_arch_alloc_capable())
> + if (resctrl_alloc_capable())
> resctrl_arch_enable_alloc();
> - if (resctrl_arch_mon_capable())
> + if (resctrl_mon_capable())
> resctrl_arch_enable_mon();
>
> - if (resctrl_arch_alloc_capable() || resctrl_arch_mon_capable())
> + if (resctrl_alloc_capable() || resctrl_mon_capable())
> resctrl_mounted = true;
>
> if (resctrl_is_mbm_enabled()) {
> @@ -3294,10 +3294,10 @@ static int rdt_get_tree(struct fs_context *fc)
> return ret;
>
> out_mondata:
> - if (resctrl_arch_mon_capable())
> + if (resctrl_mon_capable())
> kernfs_remove(kn_mondata);
> out_mongrp:
> - if (resctrl_arch_mon_capable()) {
> + if (resctrl_mon_capable()) {
> mon_put_kn_priv();
> rdtgroup_unassign_cntrs(&rdtgroup_default);
> kernfs_remove(kn_mongrp);
> @@ -3886,7 +3886,7 @@ static int mkdir_rdt_prepare_rmid_alloc(struct rdtgroup *rdtgrp)
> {
> int ret;
>
> - if (!resctrl_arch_mon_capable())
> + if (!resctrl_mon_capable())
> return 0;
>
> ret = alloc_rmid(rdtgrp->closid);
> @@ -3911,7 +3911,7 @@ static int mkdir_rdt_prepare_rmid_alloc(struct rdtgroup *rdtgrp)
>
> static void mkdir_rdt_prepare_rmid_free(struct rdtgroup *rgrp)
> {
> - if (resctrl_arch_mon_capable()) {
> + if (resctrl_mon_capable()) {
> rdtgroup_unassign_cntrs(rgrp);
> free_rmid(rgrp->closid, rgrp->mon.rmid);
> }
> @@ -4002,7 +4002,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn,
>
> if (rtype == RDTCTRL_GROUP) {
> files = RFTYPE_BASE | RFTYPE_CTRL;
> - if (resctrl_arch_mon_capable())
> + if (resctrl_mon_capable())
> files |= RFTYPE_MON;
> } else {
> files = RFTYPE_BASE | RFTYPE_MON;
> @@ -4111,7 +4111,7 @@ static int rdtgroup_mkdir_ctrl_mon(struct kernfs_node *parent_kn,
>
> list_add(&rdtgrp->rdtgroup_list, &rdt_all_groups);
>
> - if (resctrl_arch_mon_capable()) {
> + if (resctrl_mon_capable()) {
> /*
> * Create an empty mon_groups directory to hold the subset
> * of tasks and cpus to monitor.
> @@ -4152,11 +4152,11 @@ static int rdtgroup_mkdir(struct kernfs_node *parent_kn, const char *name,
> * allocation is supported, add a control and monitoring
> * subdirectory
> */
> - if (resctrl_arch_alloc_capable() && parent_kn == rdtgroup_default.kn)
> + if (resctrl_alloc_capable() && parent_kn == rdtgroup_default.kn)
> return rdtgroup_mkdir_ctrl_mon(parent_kn, name, mode);
>
> /* Else, attempt to add a monitoring subdirectory. */
> - if (resctrl_arch_mon_capable())
> + if (resctrl_mon_capable())
> return rdtgroup_mkdir_mon(parent_kn, name, mode);
>
> return -EPERM;
> @@ -4571,7 +4571,7 @@ void resctrl_offline_mon_domain(struct rdt_resource *r, struct rdt_domain_hdr *h
> * If resctrl is mounted, remove all the
> * per domain monitor data directories.
> */
> - if (resctrl_mounted && resctrl_arch_mon_capable())
> + if (resctrl_mounted && resctrl_mon_capable())
> rmdir_mondata_subdir_allrdtgrp(r, hdr);
>
> if (r->rid != RDT_RESOURCE_L3)
> @@ -4708,7 +4708,7 @@ int resctrl_online_mon_domain(struct rdt_resource *r, struct rdt_domain_hdr *hdr
> * by rdt_get_tree() calling mkdir_mondata_all().
> * If resctrl is mounted, add per domain monitor data directories.
> */
> - if (resctrl_mounted && resctrl_arch_mon_capable())
> + if (resctrl_mounted && resctrl_mon_capable())
> mkdir_mondata_subdir_allrdtgrp(r, hdr);
>
> out_unlock:
next prev parent reply other threads:[~2026-11-04 15:23 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-19 20:50 [PATCH v14 00/24] Allow AET to use PMT as loadable module Tony Luck
2026-10-19 20:50 ` [PATCH v14 01/24] x86/cpufeatures: Add missing CQM feature dependency Tony Luck
2026-10-19 20:50 ` [PATCH v14 02/24] x86/resctrl: Check if monitoring features are supported Tony Luck
2026-10-19 20:50 ` [PATCH v14 03/24] x86/resctrl: Centralize monitoring feature enumeration Tony Luck
2026-10-19 20:50 ` [PATCH v14 04/24] x86/resctrl: Apply Intel MBM quirk from rdt_get_l3_mon_config() Tony Luck
2026-10-19 20:50 ` [PATCH v14 05/24] x86/resctrl: Delete resctrl_cpu_detect() Tony Luck
2026-10-19 20:50 ` [PATCH v14 06/24] arm,x86,fs/resctrl: Replace architecture capability helpers with generic versions Tony Luck
2026-10-20 14:08 ` Chen Yu
2026-11-04 15:23 ` Ben Horgan [this message]
2026-10-19 20:50 ` [PATCH v14 07/24] x86/resctrl: Update special case for Intel Haswell enumeration Tony Luck
2026-10-19 20:50 ` [PATCH v14 08/24] x86/resctrl: Delete rdt_alloc_capable and rdt_mon_capable Tony Luck
2026-10-19 20:50 ` [PATCH v14 09/24] fs/resctrl: Remove redundant calls to resctrl_mon_capable() Tony Luck
2026-10-20 13:38 ` Chen Yu
2026-10-20 15:52 ` Luck, Tony
2026-10-19 20:50 ` [PATCH v14 10/24] x86/resctrl: Honor rdt={perf|energy} options to force enable AET events Tony Luck
2026-10-20 14:21 ` Chen Yu
2026-10-19 20:50 ` [PATCH v14 11/24] fs/resctrl: Add interface to disable a monitor event Tony Luck
2026-10-19 20:50 ` [PATCH v14 12/24] arm,x86,fs/resctrl: Allocate maximum needed rmid_ptrs[] Tony Luck
2026-10-19 20:50 ` [PATCH v14 13/24] arm,x86,fs/resctrl: Use right size for L3 monitor data structures Tony Luck
2026-10-19 20:50 ` [PATCH v14 14/24] x86,fs/resctrl: Handle systems where AET is the only monitoring feature Tony Luck
2026-10-21 22:22 ` [PATCH v14+ " Tony Luck
2026-10-19 20:50 ` [PATCH v14 15/24] x86/resctrl: Add PMT registration API for AET enumeration callbacks Tony Luck
2026-10-19 20:50 ` [PATCH v14 16/24] platform/x86/intel/pmt: Register enumeration functions with resctrl Tony Luck
2026-10-19 20:50 ` [PATCH v14 17/24] x86/resctrl: Use registered function pointers for AET enumeration Tony Luck
2026-10-19 20:50 ` [PATCH v14 18/24] arm,x86,fs/resctrl: Enumerate AET on every resctrl mount Tony Luck
2026-10-19 20:50 ` [PATCH v14 19/24] x86/resctrl: Enforce system RMID limit on AET Tony Luck
2026-10-19 20:50 ` [PATCH v14 20/24] x86/resctrl: Export interface to report telemetry unbind/remove Tony Luck
2026-10-21 22:22 ` [PATCH v14+ " Tony Luck
2026-10-19 20:50 ` [PATCH v14 21/24] platform/x86/intel/pmt: Inform resctrl when MMIO maps are being removed Tony Luck
2026-10-19 20:50 ` [PATCH v14 22/24] x86/resctrl: Require 64-bit x86 for resctrl support Tony Luck
2026-10-19 20:50 ` [PATCH v14 23/24] x86/resctrl: Simplify Kconfig options for resctrl Tony Luck
2026-10-19 20:50 ` [PATCH v14 24/24] x86,fs/resctrl: Document telemetry mount timing caveat Tony Luck
2026-10-20 16:27 ` [PATCH v14 00/24] Allow AET to use PMT as loadable module Luck, Tony
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=293d0352-7a5d-4b8a-b004-277cd8a81902@arm.com \
--to=ben.horgan@arm.com \
--cc=Dave.Martin@arm.com \
--cc=babu.moger@amd.com \
--cc=david.e.box@intel.com \
--cc=dfustini@baylibre.com \
--cc=fenghuay@nvidia.com \
--cc=hch@infradead.org \
--cc=james.morse@arm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=maciej.wieczor-retman@intel.com \
--cc=patches@lists.linux.dev \
--cc=peternewman@google.com \
--cc=reinette.chatre@intel.com \
--cc=tony.luck@intel.com \
--cc=x86@kernel.org \
--cc=yu.c.chen@intel.com \
/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
all inboxes | Powered by JetHome®