From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 6FA9340800F for ; Fri, 10 Jul 2026 11:56:07 +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=1783684573; cv=none; b=fPx5UL4vuoLLgf+mUAiYKdfPrIfwPcRhWxgD+1rST9Qb/BUHM4eH8v5s4s49/awjErtdkZU0GdGdZFN6tujVB1dJr0IgV36fNO9UikpvVrxt1CbJdgU4PZYspcs0BSW10jCNfdYwkyX/kKeZgkOauQophPGC6UvGCKGnh3ZBjtk= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783684573; c=relaxed/simple; bh=tRbKY3Y19Zi1hPsx89QQ0nDyhprmvEfYYBE29iBt8W8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FS8IdUuTT7Pa/RAu7bN+OGLldSCbj2UgrX5HF6kApHnCbwmU0azY5UjwVX4AMMs2fC0KkMF/oZDGu3EQ/dmDv7yP/5kP2OOCYduAuobeV140RTwYlkAnQgDLVbzSGRrCTXZ7F1SQfhjkIX3Dns5u9JXKXY63I5i4kZkGGIpp3CA= 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=mAV5/wqw; 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="mAV5/wqw" 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 70BF71E7D; Fri, 10 Jul 2026 04:56:01 -0700 (PDT) Received: from e134344.cambridge.arm.com (e134344.arm.com [10.2.212.8]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 80F043F85F; Fri, 10 Jul 2026 04:56:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1783684565; bh=tRbKY3Y19Zi1hPsx89QQ0nDyhprmvEfYYBE29iBt8W8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mAV5/wqwjOcCLHo/yVnps8/NXBWX0Em5u/f4B57WeJTb+wIMPXjuRdPz35uVRQ51b oNFEwappB2TLuLcSOezRAHteDcsfFwnENWp7Va20C0YGY0eT+RXiJom8e40+jK1AR8 fQz1pfnXszVUYYcvzjIYypWcCs/jzChjpQUuM6vs= From: Ben Horgan To: ben.horgan@arm.com Cc: james.morse@arm.com, reinette.chatre@intel.com, fenghuay@nvidia.com, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, dave.martin@arm.com, andre.przywara@arm.com Subject: [PATCH v1 06/11] arm_mpam: Use __ris_msmon_read() for saving MBWU state Date: Fri, 10 Jul 2026 12:55:40 +0100 Message-ID: <20260710115546.29644-7-ben.horgan@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260710115546.29644-1-ben.horgan@arm.com> References: <20260710115546.29644-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: 8bit mbwu_save_mbwu_state() reads the MBWU counters and adds that to a saved correction value. However, the type of counter to read is determined by the RIS rather than the class and overflow is not taken into account. Fix this and mitigate against further divergence by using the same helper as used for user reads, __ris_msmon_read(). Fixes: 41e8a14950e1 ("arm_mpam: Track bandwidth counter state for power management") Signed-off-by: Ben Horgan --- drivers/resctrl/mpam_devices.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/drivers/resctrl/mpam_devices.c b/drivers/resctrl/mpam_devices.c index 222fc248067e..a49f426aefc0 100644 --- a/drivers/resctrl/mpam_devices.c +++ b/drivers/resctrl/mpam_devices.c @@ -1029,12 +1029,6 @@ struct mon_read { bool waited_timeout; }; -static bool mpam_ris_has_mbwu_long_counter(struct mpam_msc_ris *ris) -{ - return (mpam_has_feature(mpam_feat_msmon_mbwu_63counter, &ris->props) || - mpam_has_feature(mpam_feat_msmon_mbwu_44counter, &ris->props)); -} - static u64 mpam_msc_read_mbwu_l(struct mpam_msc *msc) { int retry = 3; @@ -1687,6 +1681,7 @@ static int mpam_save_mbwu_state(void *arg) struct mpam_msc_ris *ris = arg; struct msmon_mbwu_state *mbwu_state; struct mpam_msc *msc = ris->vmsc->msc; + struct mpam_class *class = ris->vmsc->comp->class; for (i = 0; i < ris->props.num_mbwu_mon; i++) { mbwu_state = &ris->mbwu_state[i]; @@ -1702,18 +1697,32 @@ static int mpam_save_mbwu_state(void *arg) cur_flt = mpam_read_monsel_reg(msc, CFG_MBWU_FLT); cur_ctl = mpam_read_monsel_reg(msc, CFG_MBWU_CTL); - if (mpam_ris_has_mbwu_long_counter(ris)) - val = mpam_msc_read_mbwu_l(msc); - else - val = mpam_read_monsel_reg(msc, MBWU); - cfg->mon = i; cfg->pmg = FIELD_GET(MSMON_CFG_x_FLT_PMG, cur_flt); cfg->match_pmg = FIELD_GET(MSMON_CFG_x_CTL_MATCH_PMG, cur_ctl); cfg->partid = FIELD_GET(MSMON_CFG_x_FLT_PARTID, cur_flt); - mbwu_state->correction += val; mbwu_state->enabled = FIELD_GET(MSMON_CFG_x_CTL_EN, cur_ctl); mpam_mon_sel_unlock(msc); + + if (mbwu_state->enabled) { + struct mon_read mbwu_arg = { + mbwu_arg.ris = ris, + mbwu_arg.ctx = cfg, + mbwu_arg.type = mpam_msmon_choose_counter(class), + mbwu_arg.val = &val, + }; + + val = 0; + __ris_msmon_read(&mbwu_arg); + + if (WARN_ON_ONCE(!mpam_mon_sel_lock(msc))) + return -EIO; + + mbwu_state->reset_on_next_read = true; + if (!mbwu_arg.err) + mbwu_state->correction = val; + mpam_mon_sel_unlock(msc); + } } return 0; -- 2.43.0