From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=217.140.110.172 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793612766; b=sBEGlEJo+qb5gXPXq6XZJNyszPuvxaHdqNJUNK4bNVY1b5f2QHTIq70/PPWohAaBrIoF 5l3vex18tANZPsCx30vozSWpoZas1p/00Ta0DXp+hU+Mk24CGJeh0Y0Kbgp9DjncDUMc+ yI4RH6CyKLl37xV4yGol2mC5NiA6sl1wMkjyZj+bApS4ID7YEvxoOxfPPJRohysziq/kw 6wsg/hny9EPzyZ5mga65wNB/Ke//fGIwGXT49cidlgl76uju1khSyWzYkdbEfSGwo3gbr 29Wt+VPiJnmV0NtULSEVVYfjHgv/3xrXlTyA68+GHDnrqO1xlxA9JVya3aifLCcy1fg== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793612766; h=DMARC-Filter:Received:Received:DKIM-Signature:Message-ID:Date: MIME-Version:User-Agent:Subject:To:Cc:References:Content-Language: From:In-Reply-To:Content-Type:Content-Transfer-Encoding; bh=uDQFPI1KDA0kc2MfKk2nGSM1gT5NZL58NRp1i/RIpe0=; b=edEC3plqMM+3vxGLMVVEHL0nk1jmy2cC2qKvsl9pPUDSIwiKI/2RGh1cxwjVnqte4Drc WdZ/70qxrhRHuAhEeJVgIqi398IRCK8I77mdWBcuOA15O/0/Ui6J95txYIU83DLg0wWli 929OtnKupwG6tnfxchSlRJu/PPatBwE4u99ZbO42ySR+c5flxZqEA2iHeKnEFdvEOJvL/ zHSoBlbfgFOZQmPOkBQaxjtvBWxH/+2vaAhK+mKfpV+H4L6P+wgTU7YObnPXaV9Hwm7BG NuYrzy1KkrYDVTOppFXdBNT5ass8tLOUiUAV6NLpuLYZfXJKbQoqqGBgVPLCbvskBLw== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass header.d=arm.com header.i=@arm.com header.a=rsa-sha256 header.s=foss header.b="Inl/f/n7"; arc=none smtp.remote-ip=217.140.110.172 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 820B9606A32F for ; Mon, 2 Nov 2026 09:46:04 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org 820B9606A32F 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, unprotected) header.d=arm.com header.i=@arm.com header.a=rsa-sha256 header.s=foss header.b=Inl/f/n7 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 60E0A1691; Mon, 2 Nov 2026 01:46:00 -0800 (PST) Received: from [10.2.212.8] (e134344.arm.com [10.2.212.8]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 775B03F59E; Mon, 2 Nov 2026 01:46:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1793612763; bh=L4lGO/TR0LC4Klf4but4GyDe/cWEKZRFCS4SULLDNI8=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=Inl/f/n71KfSzhlbqkGJYPcf9+SOi/1GQKNdCnZkGPQo5Z0UfbN8QRNQJDpMFbCZJ TzHazfDTqjwjWVbD1mpuVT6U69ShYE97nahhJ2VFlnAts7fjqWENMPdmdIGt7cAvFR mW+/T3dUvc/wyK2u6YV1avNZRLZd24HHoRZ1A9Zc= Message-ID: <912dbaa0-0fc0-46fb-819a-6594538b47cd@arm.com> Date: Mon, 2 Nov 2026 09:46:01 +0000 X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH] arm_mpam: Only program MATCH_PMG when the monitor supports it To: Ping Li , james.morse@arm.com Cc: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, reinette.chatre@intel.com, fenghuay@nvidia.com References: <20261102071300.554160-1-leeonion.muyu@gmail.com> Content-Language: en-US From: Ben Horgan In-Reply-To: <20261102071300.554160-1-leeonion.muyu@gmail.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Hi Ping, On 02/11/2026 07:13, Ping Li wrote: > An MSC of ours implements the MBWU monitor without PMG support: > MPAMF_MBWUMON_IDR.NO_MATCH_PMG is 1, so MSMON_CFG_x_CTL.MATCH_PMG is > RES0. On this hardware resctrl monitor reads always returned 0. > > Tracking this down: __read_mon() unconditionally sets match_pmg, > because the resctrl (closid, rmid) model maps rmid to PMG. The > expected configuration generated by gen_msmon_ctl_flt_vals() then > contains MATCH_PMG, but the hardware ignores the bit, so the > configuration read back never matches, config_mismatch is always > true and the monitor is reprogrammed on every read - the counter > never accumulates. > > The architecture allows an MSMON implementation without PMG > support, so read the NO_MATCH_PMG bits during probe and only > program MATCH_PMG when the monitor supports PMG filtering, > falling back to filtering by PARTID only. The CSU monitor has > the same issue and is covered the same way. I'm afraid this doesn't work. resctrl will show the same counts for every monitor group under a control group rather than the counts related to the tasks/cpus associated with the individual monitor groups. Have you actually built NO_MATCH_PMG? I ask because I understood that NO_MATCH_PMG and NO_MATCH_PARTID were erroneously added to the MPAMv1 specification and were going to be removed. What you should build or not is question for support@arm.com rather than the list though. Thanks, Ben > > Signed-off-by: Ping Li > --- > drivers/resctrl/mpam_devices.c | 22 +++++++++++++++++++++- > drivers/resctrl/mpam_internal.h | 4 ++++ > 2 files changed, 25 insertions(+), 1 deletion(-) > > diff --git a/drivers/resctrl/mpam_devices.c b/drivers/resctrl/mpam_devices.c > index c067b6d57d71..2086ff121b59 100644 > --- a/drivers/resctrl/mpam_devices.c > +++ b/drivers/resctrl/mpam_devices.c > @@ -1089,6 +1089,9 @@ static int mpam_ris_hw_probe(struct mpam_msc_ris *ris) > if (FIELD_GET(MPAMF_CSUMON_IDR_HAS_XCL, csumonidr)) > mpam_set_feature(mpam_feat_msmon_csu_xcl, props); > > + if (!FIELD_GET(MPAMF_CSUMON_IDR_NO_MATCH_PMG, csumonidr)) > + mpam_set_feature(mpam_feat_msmon_csu_match_pmg, props); > + > /* Is NRDY hardware managed? */ > err = mpam_ris_hw_probe_csu_nrdy(ris); > if (err < 0) > @@ -1118,6 +1121,9 @@ static int mpam_ris_hw_probe(struct mpam_msc_ris *ris) > if (FIELD_GET(MPAMF_MBWUMON_IDR_HAS_RWBW, mbwumon_idr)) > mpam_set_feature(mpam_feat_msmon_mbwu_rwbw, props); > > + if (!FIELD_GET(MPAMF_MBWUMON_IDR_NO_MATCH_PMG, mbwumon_idr)) > + mpam_set_feature(mpam_feat_msmon_mbwu_match_pmg, props); > + > has_long = FIELD_GET(MPAMF_MBWUMON_IDR_HAS_LONG, mbwumon_idr); > if (has_long) { > if (FIELD_GET(MPAMF_MBWUMON_IDR_LWD, mbwumon_idr)) > @@ -1309,6 +1315,20 @@ static int mpam_msc_zero_mbwu_l(struct mpam_msc *msc) > return __mpam_write_reg(msc, MSMON_MBWU_L + 4, 0); > } > > +static bool msmon_supports_match_pmg(struct mon_read *m) > +{ > + switch (m->type) { > + case mpam_feat_msmon_csu: > + return mpam_has_feature(mpam_feat_msmon_csu_match_pmg, &m->ris->props); > + case mpam_feat_msmon_mbwu_31counter: > + case mpam_feat_msmon_mbwu_44counter: > + case mpam_feat_msmon_mbwu_63counter: > + return mpam_has_feature(mpam_feat_msmon_mbwu_match_pmg, &m->ris->props); > + default: > + return true; > + } > +} > + > static void gen_msmon_ctl_flt_vals(struct mon_read *m, u32 *ctl_val, > u32 *flt_val) > { > @@ -1322,7 +1342,7 @@ static void gen_msmon_ctl_flt_vals(struct mon_read *m, u32 *ctl_val, > > *flt_val = FIELD_PREP(MSMON_CFG_x_FLT_PARTID, ctx->partid); > > - if (m->ctx->match_pmg) { > + if (m->ctx->match_pmg && msmon_supports_match_pmg(m)) { > *ctl_val |= MSMON_CFG_x_CTL_MATCH_PMG; > *flt_val |= FIELD_PREP(MSMON_CFG_x_FLT_PMG, ctx->pmg); > } > diff --git a/drivers/resctrl/mpam_internal.h b/drivers/resctrl/mpam_internal.h > index 1f86cc158100..88cd5ac4cde3 100644 > --- a/drivers/resctrl/mpam_internal.h > +++ b/drivers/resctrl/mpam_internal.h > @@ -227,12 +227,14 @@ enum mpam_device_features { > mpam_feat_msmon_csu, > mpam_feat_msmon_csu_capture, > mpam_feat_msmon_csu_xcl, > + mpam_feat_msmon_csu_match_pmg, > mpam_feat_msmon_mbwu, > mpam_feat_msmon_mbwu_31counter, > mpam_feat_msmon_mbwu_44counter, > mpam_feat_msmon_mbwu_63counter, > mpam_feat_msmon_mbwu_capture, > mpam_feat_msmon_mbwu_rwbw, > + mpam_feat_msmon_mbwu_match_pmg, > mpam_feat_partid_nrw, > MPAM_FEATURE_LAST > }; > @@ -645,6 +647,7 @@ int mpam_fb_check_shared_buffer_size(struct mpam_msc *msc); > > /* MPAMF_CSUMON_IDR - MPAM cache storage usage monitor ID register */ > #define MPAMF_CSUMON_IDR_NUM_MON GENMASK(15, 0) > +#define MPAMF_CSUMON_IDR_NO_MATCH_PMG BIT(22) > #define MPAMF_CSUMON_IDR_HAS_OFLOW_CAPT BIT(24) > #define MPAMF_CSUMON_IDR_HAS_CEVNT_OFLW BIT(25) > #define MPAMF_CSUMON_IDR_HAS_OFSR BIT(26) > @@ -655,6 +658,7 @@ int mpam_fb_check_shared_buffer_size(struct mpam_msc *msc); > > /* MPAMF_MBWUMON_IDR - MPAM memory bandwidth usage monitor ID register */ > #define MPAMF_MBWUMON_IDR_NUM_MON GENMASK(15, 0) > +#define MPAMF_MBWUMON_IDR_NO_MATCH_PMG BIT(22) > #define MPAMF_MBWUMON_IDR_HAS_RWBW BIT(28) > #define MPAMF_MBWUMON_IDR_LWD BIT(29) > #define MPAMF_MBWUMON_IDR_HAS_LONG BIT(30)