From nobody Thu Apr 2 22:12:11 2026 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A5110421884 for ; Thu, 26 Mar 2026 17:26:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774545966; cv=none; b=WDhKzfa0PcEyb7qo6MPEsmQxt1BVHV31L6ZYM21w3dsktmNS+HP2+D54tw4z2CMFCbk/iyCNt88fnkjALYq033gE/TdYtMV+WY7VScRPGyEPJUmxPZ4S99iNiEC4+63Tkejx64RDKOV987qxip3EWiiK99WUvpfNjEt9Y9zraFA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774545966; c=relaxed/simple; bh=+Fav2lw5Ue0Y+YKFeiS+A/r83UkeWzl+Hu4e89jAtb8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qbcdFT1bZ7s3NS1PAuWq84LtaHItENmPfgBjIdl7arqBnDO48NgIEBrYYJ3XX0dzU5fEWu4IQZSw+ocEs7iXYVguI2Wr5DjamoTGAPw9AjVSEcy8kfsJyVN4BG/eA4PmznApjjmRWx3iW+mbZccnxBUUznFl2C8qSQjMsuPfVNA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b=Mj+EtUxz; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b="Mj+EtUxz" Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 2D0652E99; Thu, 26 Mar 2026 10:25:58 -0700 (PDT) Received: from e134344.cambridge.arm.com (e134344.arm.com [10.1.196.46]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 550A23F641; Thu, 26 Mar 2026 10:26:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1774545964; bh=+Fav2lw5Ue0Y+YKFeiS+A/r83UkeWzl+Hu4e89jAtb8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Mj+EtUxzRzAyAx7fONZ8A/nXilBLwBpPq33MWVkh8XTCKzBLA3ZdJdbjIAYnZtzPM Vtc0ElTExBs1/5gHJubZZgJysMqiQizm+t9crKEu6eR07U8hhPeDI/79sN6pnIM745 8LQ9Ex6NOVUAdxUkuA5V6chAyS9I+BsXYmWSP+gk= From: Ben Horgan To: linux-kernel@vger.kernel.org Cc: tony.luck@intel.com, reinette.chatre@intel.com, Dave.Martin@arm.com, james.morse@arm.com, babu.moger@amd.com, tglx@kernel.org, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, ben.horgan@arm.com, fenghuay@nvidia.com, tan.shaopeng@fujitsu.com Subject: [PATCH v4 2/7] x86,fs/resctrl: Make 'event_filter' files read only if they're not configurable Date: Thu, 26 Mar 2026 17:25:46 +0000 Message-ID: <20260326172551.1553871-3-ben.horgan@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260326172551.1553871-1-ben.horgan@arm.com> References: <20260326172551.1553871-1-ben.horgan@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When the counter assignment mode is mbm_event resctrl assumes the MBM events are configurable and exposes the 'event_filter' files. These files live at info/L3_MON/event_configs//event_filter and are used to display and set the event configuration. The MPAM architecture has support for configuring the memory bandwidth utilization (MBWU) counters to only count reads or only count writes. However, In MPAM, this event filtering support is optional in the hardware (and not yet implemented in the MPAM driver) but MBM counter assignment is always possible for MPAM MBWU counters. In order to support mbm_event mode with MPAM, make the 'event_filter' files read only if the event configuration can't be changed. A user can still chmod the file and so also return early with an error from event_filter_write(). Introduce a new monitor property, mbm_cntr_configurable, to indicate whether or not assignable MBM counters are configurable. On x86, set this to true whenever mbm_cntr_assignable is true to keep existing behaviour. Signed-off-by: Ben Horgan --- Changes since v2: Use property, mbm_cntr_configurable, rather than arch hook Change the event_filter mode to read only in res_common_files[] Add resctrl_file_mode_init() and use in resctrl_l3_mon_resource_init() set mbm_cntr_configurable for x86 ABMC and mention in commit message --- arch/x86/kernel/cpu/resctrl/monitor.c | 1 + fs/resctrl/internal.h | 2 ++ fs/resctrl/monitor.c | 7 +++++++ fs/resctrl/rdtgroup.c | 11 ++++++++++- include/linux/resctrl.h | 16 +++++++++------- 5 files changed, 29 insertions(+), 8 deletions(-) diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/re= sctrl/monitor.c index 9bd87bae4983..794a6fb175e4 100644 --- a/arch/x86/kernel/cpu/resctrl/monitor.c +++ b/arch/x86/kernel/cpu/resctrl/monitor.c @@ -454,6 +454,7 @@ int __init rdt_get_l3_mon_config(struct rdt_resource *r) (rdt_cpu_has(X86_FEATURE_CQM_MBM_TOTAL) || rdt_cpu_has(X86_FEATURE_CQM_MBM_LOCAL))) { r->mon.mbm_cntr_assignable =3D true; + r->mon.mbm_cntr_configurable =3D true; cpuid_count(0x80000020, 5, &eax, &ebx, &ecx, &edx); r->mon.num_mbm_cntrs =3D (ebx & GENMASK(15, 0)) + 1; hw_res->mbm_cntr_assign_enabled =3D true; diff --git a/fs/resctrl/internal.h b/fs/resctrl/internal.h index 1a9b29119f88..48af75b9dc85 100644 --- a/fs/resctrl/internal.h +++ b/fs/resctrl/internal.h @@ -408,6 +408,8 @@ void __check_limbo(struct rdt_l3_mon_domain *d, bool fo= rce_free); =20 void resctrl_file_fflags_init(const char *config, unsigned long fflags); =20 +void resctrl_file_mode_init(const char *config, umode_t mode); + void rdt_staged_configs_clear(void); =20 bool closid_allocated(unsigned int closid); diff --git a/fs/resctrl/monitor.c b/fs/resctrl/monitor.c index 49f3f6b846b2..8fec3dea33c3 100644 --- a/fs/resctrl/monitor.c +++ b/fs/resctrl/monitor.c @@ -1420,6 +1420,11 @@ ssize_t event_filter_write(struct kernfs_open_file *= of, char *buf, size_t nbytes ret =3D -EINVAL; goto out_unlock; } + if (!r->mon.mbm_cntr_configurable) { + rdt_last_cmd_puts("event_filter is not configurable\n"); + ret =3D -EPERM; + goto out_unlock; + } =20 ret =3D resctrl_parse_mem_transactions(buf, &evt_cfg); if (!ret && mevt->evt_cfg !=3D evt_cfg) { @@ -1884,6 +1889,8 @@ int resctrl_l3_mon_resource_init(void) resctrl_file_fflags_init("available_mbm_cntrs", RFTYPE_MON_INFO | RFTYPE_RES_CACHE); resctrl_file_fflags_init("event_filter", RFTYPE_ASSIGN_CONFIG); + if (r->mon.mbm_cntr_configurable) + resctrl_file_mode_init("event_filter", 0644); resctrl_file_fflags_init("mbm_assign_on_mkdir", RFTYPE_MON_INFO | RFTYPE_RES_CACHE); resctrl_file_fflags_init("mbm_L3_assignments", RFTYPE_MON_BASE); diff --git a/fs/resctrl/rdtgroup.c b/fs/resctrl/rdtgroup.c index 4753841c2ca3..fa5712db3778 100644 --- a/fs/resctrl/rdtgroup.c +++ b/fs/resctrl/rdtgroup.c @@ -2020,7 +2020,7 @@ static struct rftype res_common_files[] =3D { }, { .name =3D "event_filter", - .mode =3D 0644, + .mode =3D 0444, .kf_ops =3D &rdtgroup_kf_single_ops, .seq_show =3D event_filter_show, .write =3D event_filter_write, @@ -2213,6 +2213,15 @@ void resctrl_file_fflags_init(const char *config, un= signed long fflags) rft->fflags =3D fflags; } =20 +void resctrl_file_mode_init(const char *config, umode_t mode) +{ + struct rftype *rft; + + rft =3D rdtgroup_get_rftype_by_name(config); + if (rft) + rft->mode =3D mode; +} + /** * rdtgroup_kn_mode_restrict - Restrict user access to named resctrl file * @r: The resource group with which the file is associated. diff --git a/include/linux/resctrl.h b/include/linux/resctrl.h index 006e57fd7ca5..06e8c72e8660 100644 --- a/include/linux/resctrl.h +++ b/include/linux/resctrl.h @@ -286,13 +286,14 @@ enum resctrl_schema_fmt { =20 /** * struct resctrl_mon - Monitoring related data of a resctrl resource. - * @num_rmid: Number of RMIDs available. - * @mbm_cfg_mask: Memory transactions that can be tracked when bandwidth - * monitoring events can be configured. - * @num_mbm_cntrs: Number of assignable counters. - * @mbm_cntr_assignable:Is system capable of supporting counter assignment? - * @mbm_assign_on_mkdir:True if counters should automatically be assigned = to MBM - * events of monitor groups created via mkdir. + * @num_rmid: Number of RMIDs available. + * @mbm_cfg_mask: Memory transactions that can be tracked when + * bandwidth monitoring events can be configured. + * @num_mbm_cntrs: Number of assignable counters. + * @mbm_cntr_assignable: Is system capable of supporting counter assignmen= t? + * @mbm_assign_on_mkdir: True if counters should automatically be assigned= to MBM + * events of monitor groups created via mkdir. + * @mbm_cntr_configurable: True if assignable counters are configurable. */ struct resctrl_mon { u32 num_rmid; @@ -300,6 +301,7 @@ struct resctrl_mon { int num_mbm_cntrs; bool mbm_cntr_assignable; bool mbm_assign_on_mkdir; + bool mbm_cntr_configurable; }; =20 /** --=20 2.43.0