From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 6AE34CA5FD4 for ; Fri, 2 Oct 2026 17:40:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=OZH54YUcPbN3M8P1hvcMJT3M3GLc1J1qh3IU3kaKjFQ=; b=EkaH7yGp3GmGovzhcXuz9cdAJf Zh+Cx9YH+QBOgcNlV0Et7jExF/HpZXyZKOmiNpsm6EhOCD3mP38mMvRUrg4Bu/mSUPduAYJXxmGw9 PWR9SLeDmV1/Az65RbGlsXTZwjg7Fq+HM26rQ1Ju2DE7GCRHS6+8wkkNiz9V0I+diaVoLG55flFFx 6xVi3NRJrMLHF/pvz3xi4BHuwrIpvSK/P6nD0KoKp7XxC8pH5hFxvbFS+hCveHPiKkVhO5yh16KYa cvRicM1tRqLn6+IDB7PAj2bsCmliex6Ciij4XBJvSuyJZEcOVtxOrJX3C4FVVEovsk/qhdq9W8RVl aBctc1wg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1xChFN-0000000CBnJ-0zIc; Fri, 02 Oct 2026 17:40:37 +0000 Received: from desiato.infradead.org ([2001:8b0:10b:1:d65d:64ff:fe57:4e05]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1xChFJ-0000000CBgP-1Ico for linux-arm-kernel@bombadil.infradead.org; Fri, 02 Oct 2026 17:40:34 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=desiato.20200630; h=Content-Transfer-Encoding:MIME-Version :References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description; bh=OZH54YUcPbN3M8P1hvcMJT3M3GLc1J1qh3IU3kaKjFQ=; b=BGowfmuRjKKvE86Zgac7JOzZX5 cSm752bCt0pbX5TKJrA++HWGwpANfB4FSbORAXXhN1HFR0uH7lr0NxWeEn2Cw0aVeNdZZYb8ftn7q NuH1C8QjW2I1g0J8Sf8d+PrXiWBthoQ/xy+yUO47TEJxCkBGun8Ow3+o2950IJDZ0uOUA/HBfCW2x VsQwQNWPeR9YRiD0PPvTZbxepoIjxd9eT0xlkwWO4YYhAyiTHLVFsR5dAuHo6UmTwoVv7GkBxwa9Z 7XceyWti5xqF6Q+ELpVhi3AaJaGX0iulaR746DOqi8crlxywBjGZwRWVizDVAB6j+dheNyRdMe+Dt q5yWRV2g==; Received: from foss.arm.com ([217.140.110.172]) by desiato.infradead.org with esmtp (Exim 4.99.2 #2 (Red Hat Linux)) id 1xChFG-00000006BLf-0cI4 for linux-arm-kernel@lists.infradead.org; Fri, 02 Oct 2026 17:40:32 +0000 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 F364F2F; Fri, 2 Oct 2026 10:40:25 -0700 (PDT) Received: from eglon.cambridge.arm.com (eglon.cambridge.arm.com [10.2.212.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 2C3CB3F85F; Fri, 2 Oct 2026 10:40:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1790962829; bh=C1Ru/K/IUy21IT909GMiThQ4o8LVJ+X4/duWEnBq+88=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mhyFsJERECvOx/fiZJj4u+4EOl9DQEuCNhNruSVa9s67CPkWPFu7+GJwe/ubSY2Le 03nLf9RBnfQEJngerFTK+ektzQRtGShg/+NpCZwmSvvPsEfQL3nmVxRW8tRahOl6Wm MAuhCKsuRzkjA74nelsdhrhonBCxr62V/UoBeik0= From: James Morse To: linux-arm-kernel@lists.infradead.org Cc: Catalin Marinas , Will Deacon , Ben Horgan , Andre Przywara , Fuad Tabba , Jonathan Cameron , Gavin Shan , Srivathsa L Rao , James Morse Subject: [PATCH 21/27] arm_mpam: propagate MSC access errors for mpam_reprogram_ris_partid() Date: Fri, 2 Oct 2026 18:39:34 +0100 Message-ID: <20261002173941.292319-22-james.morse@arm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20261002173941.292319-1-james.morse@arm.com> References: <20261002173941.292319-1-james.morse@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20261002_184030_754176_CE3E39CD X-CRM114-Status: GOOD ( 19.17 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org From: Andre Przywara Allow the mpam_reprogram_ris_partid() function to check for and return errors, and propagate MSC read and write errors from the lower level up. This also covers the callers of this function: mpam_reset_ris() and apply_config(). Signed-off-by: Andre Przywara Reviewed-by: Ben Horgan Reviewed-by: Jonathan Cameron Reviewed-by: Gavin Shan Tested-by: Gavin Shan # on NVIDIA Grace Hopper Reviewed-by: Srivathsa L Rao [morse: Fixed merge conflicts in mpam_save_mbwu_state() and __ris_msmon_read()] Signed-off-by: James Morse --- drivers/resctrl/mpam_devices.c | 137 ++++++++++++++++++++++----------- 1 file changed, 94 insertions(+), 43 deletions(-) diff --git a/drivers/resctrl/mpam_devices.c b/drivers/resctrl/mpam_devices.c index 39437361ed7a..7e7b483ff900 100644 --- a/drivers/resctrl/mpam_devices.c +++ b/drivers/resctrl/mpam_devices.c @@ -1616,7 +1616,7 @@ void mpam_msmon_reset_mbwu(struct mpam_component *comp, struct mon_cfg *ctx) } } -static void mpam_reset_msc_bitmap(struct mpam_msc *msc, u16 reg, u16 wd) +static int mpam_reset_msc_bitmap(struct mpam_msc *msc, u16 reg, u16 wd) { u32 num_words, msb; u32 bm = ~0; @@ -1625,15 +1625,20 @@ static void mpam_reset_msc_bitmap(struct mpam_msc *msc, u16 reg, u16 wd) lockdep_assert_held(&msc->part_sel_lock); if (wd == 0) - return; + return 0; /* * Write all ~0 to all but the last 32bit-word, which may * have fewer bits... */ num_words = DIV_ROUND_UP(wd, 32); - for (i = 0; i < num_words - 1; i++, reg += sizeof(bm)) - __mpam_write_reg(msc, reg, bm); + for (i = 0; i < num_words - 1; i++, reg += sizeof(bm)) { + int ret; + + ret = __mpam_write_reg(msc, reg, bm); + if (ret) + return ret; + } /* * ....and then the last (maybe) partial 32bit word. When wd is a @@ -1641,7 +1646,7 @@ static void mpam_reset_msc_bitmap(struct mpam_msc *msc, u16 reg, u16 wd) */ msb = (wd - 1) % 32; bm = GENMASK(msb, 0); - __mpam_write_reg(msc, reg, bm); + return __mpam_write_reg(msc, reg, bm); } static void mpam_apply_t241_erratum(struct mpam_msc_ris *ris, u16 partid) @@ -1714,40 +1719,59 @@ static u16 mpam_wa_t241_calc_min_from_max(struct mpam_props *props, } /* Called via IPI. Call while holding an SRCU reference */ -static void mpam_reprogram_ris_partid(struct mpam_msc_ris *ris, u16 partid, - struct mpam_config *cfg) +static int mpam_reprogram_ris_partid(struct mpam_msc_ris *ris, u16 partid, + struct mpam_config *cfg) { u16 cmax = MPAMCFG_CMAX_CMAX; struct mpam_msc *msc = ris->vmsc->msc; struct mpam_props *rprops = &ris->props; + int ret; - mutex_lock(&msc->part_sel_lock); - __mpam_part_sel(ris->ris_idx, partid, msc); + guard(mutex)(&msc->part_sel_lock); + ret = __mpam_part_sel(ris->ris_idx, partid, msc); + if (ret) + return ret; if (mpam_has_feature(mpam_feat_partid_nrw, rprops)) { /* Update the intpartid mapping */ - mpam_write_partsel_reg(msc, INTPARTID, - MPAMCFG_INTPARTID_INTERNAL | partid); + ret = mpam_write_partsel_reg(msc, INTPARTID, + MPAMCFG_INTPARTID_INTERNAL | partid); + if (ret) + return ret; /* * Then switch to the 'internal' partid to update the * configuration. */ - __mpam_intpart_sel(ris->ris_idx, partid, msc); + ret = __mpam_intpart_sel(ris->ris_idx, partid, msc); + if (ret) + return ret; } if (mpam_has_feature(mpam_feat_cpor_part, rprops)) { - if (mpam_has_feature(mpam_feat_cpor_part, cfg)) - mpam_write_partsel_reg(msc, CPBM, cfg->cpbm); - else - mpam_reset_msc_bitmap(msc, MPAMCFG_CPBM, rprops->cpbm_wd); + if (mpam_has_feature(mpam_feat_cpor_part, cfg)) { + ret = mpam_write_partsel_reg(msc, CPBM, cfg->cpbm); + if (ret) + return ret; + } else { + ret = mpam_reset_msc_bitmap(msc, MPAMCFG_CPBM, + rprops->cpbm_wd); + if (ret) + return ret; + } } if (mpam_has_feature(mpam_feat_mbw_part, rprops)) { - if (mpam_has_feature(mpam_feat_mbw_part, cfg)) - mpam_write_partsel_reg(msc, MBW_PBM, cfg->mbw_pbm); - else - mpam_reset_msc_bitmap(msc, MPAMCFG_MBW_PBM, rprops->mbw_pbm_bits); + if (mpam_has_feature(mpam_feat_mbw_part, cfg)) { + ret = mpam_write_partsel_reg(msc, MBW_PBM, cfg->mbw_pbm); + if (ret) + return ret; + } else { + ret = mpam_reset_msc_bitmap(msc, MPAMCFG_MBW_PBM, + rprops->mbw_pbm_bits); + if (ret) + return ret; + } } if (mpam_has_feature(mpam_feat_mbw_min, rprops)) { @@ -1760,27 +1784,47 @@ static void mpam_reprogram_ris_partid(struct mpam_msc_ris *ris, u16 partid, val = max(val, min); } - mpam_write_partsel_reg(msc, MBW_MIN, val); + ret = mpam_write_partsel_reg(msc, MBW_MIN, val); + if (ret) + return ret; } if (mpam_has_feature(mpam_feat_mbw_max, rprops)) { - if (mpam_has_feature(mpam_feat_mbw_max, cfg)) - mpam_write_partsel_reg(msc, MBW_MAX, cfg->mbw_max); - else - mpam_write_partsel_reg(msc, MBW_MAX, MPAMCFG_MBW_MAX_MAX); + if (mpam_has_feature(mpam_feat_mbw_max, cfg)) { + ret = mpam_write_partsel_reg(msc, MBW_MAX, cfg->mbw_max); + if (ret) + return ret; + } else { + ret = mpam_write_partsel_reg(msc, MBW_MAX, + MPAMCFG_MBW_MAX_MAX); + if (ret) + return ret; + } } - if (mpam_has_feature(mpam_feat_mbw_prop, rprops)) - mpam_write_partsel_reg(msc, MBW_PROP, 0); + if (mpam_has_feature(mpam_feat_mbw_prop, rprops)) { + ret = mpam_write_partsel_reg(msc, MBW_PROP, 0); + if (ret) + return ret; + } - if (mpam_has_feature(mpam_feat_cmax_cmax, rprops)) - mpam_write_partsel_reg(msc, CMAX, cmax); + if (mpam_has_feature(mpam_feat_cmax_cmax, rprops)) { + ret = mpam_write_partsel_reg(msc, CMAX, cmax); + if (ret) + return ret; + } - if (mpam_has_feature(mpam_feat_cmax_cmin, rprops)) - mpam_write_partsel_reg(msc, CMIN, 0); + if (mpam_has_feature(mpam_feat_cmax_cmin, rprops)) { + ret = mpam_write_partsel_reg(msc, CMIN, 0); + if (ret) + return ret; + } - if (mpam_has_feature(mpam_feat_cmax_cassoc, rprops)) - mpam_write_partsel_reg(msc, CASSOC, MPAMCFG_CASSOC_CASSOC); + if (mpam_has_feature(mpam_feat_cmax_cassoc, rprops)) { + ret = mpam_write_partsel_reg(msc, CASSOC, MPAMCFG_CASSOC_CASSOC); + if (ret) + return ret; + } if (mpam_has_feature(mpam_feat_intpri_part, rprops) || mpam_has_feature(mpam_feat_dspri_part, rprops)) { @@ -1804,12 +1848,14 @@ static void mpam_reprogram_ris_partid(struct mpam_msc_ris *ris, u16 partid, pri_val |= FIELD_PREP(MPAMCFG_PRI_DSPRI, dspri); } - mpam_write_partsel_reg(msc, PRI, pri_val); + ret = mpam_write_partsel_reg(msc, PRI, pri_val); + if (ret) + return ret; } mpam_quirk_post_config_change(ris, partid, cfg); - mutex_unlock(&msc->part_sel_lock); + return 0; } /* Call with msc cfg_lock held */ @@ -1936,6 +1982,7 @@ static int mpam_reset_ris(void *arg) u16 partid_max; struct mpam_config reset_cfg = {}; struct mpam_msc_ris *ris = arg; + int ret; if (ris->in_reset_state) return 0; @@ -1943,8 +1990,11 @@ static int mpam_reset_ris(void *arg) spin_lock(&partid_max_lock); partid_max = mpam_partid_max; spin_unlock(&partid_max_lock); - for (u32 partid = 0; partid <= partid_max; partid++) - mpam_reprogram_ris_partid(ris, partid, &reset_cfg); + for (u32 partid = 0; partid <= partid_max; partid++) { + ret = mpam_reprogram_ris_partid(ris, partid, &reset_cfg); + if (ret) + return ret; + } return 0; } @@ -1983,9 +2033,8 @@ static int __write_config(void *arg) { struct mpam_write_config_arg *c = arg; - mpam_reprogram_ris_partid(c->ris, c->partid, &c->comp->cfg[c->partid]); - - return 0; + return mpam_reprogram_ris_partid(c->ris, c->partid, + &c->comp->cfg[c->partid]); } static void mpam_reprogram_msc(struct mpam_msc *msc) @@ -3144,6 +3193,7 @@ int mpam_apply_config(struct mpam_component *comp, u16 partid, struct mpam_msc_ris *ris; struct mpam_vmsc *vmsc; struct mpam_msc *msc; + int ret; lockdep_assert_cpus_held(); @@ -3161,14 +3211,15 @@ int mpam_apply_config(struct mpam_component *comp, u16 partid, srcu_read_lock_held(&mpam_srcu)) { msc = vmsc->msc; - mutex_lock(&msc->cfg_lock); + guard(mutex)(&msc->cfg_lock); list_for_each_entry_srcu(ris, &vmsc->ris, vmsc_list, srcu_read_lock_held(&mpam_srcu)) { arg.ris = ris; - mpam_touch_msc(msc, __write_config, &arg); + ret = mpam_touch_msc(msc, __write_config, &arg); + if (ret) + return ret; ris->in_reset_state = false; } - mutex_unlock(&msc->cfg_lock); } return 0; -- 2.53.0