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 A2671105F7AE for ; Fri, 13 Mar 2026 14:48:42 +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=Vk8Dh8e4EH+d4xDuxe29rio8IhI3FGbWiswrW2vYySg=; b=eI7eGGSjHgzVMHSQ9WoMSgwh05 8hdSeXaUYo+mKfyLveFU8rzgUu3N9D4NXFt6WWFZ4DttocTUYiiasvo8ypXCIQnN+F9E7tVhU8PKU 5YFKmTp6DItmQgXaytXHWv2FH6PYFXzkDX0KBZaSfHW4AxJSCmk4U9qjhE0ORymMWCv73jlTS+F1X sB5wgHBPSMgx2QuJbQanZUuWETVEc+hQCAIHF39+eXi5KgnfE3WbJW9gIR869U7C64RD9X+VQC9bA qRzTLHYIPfGhmrwPARXM9N+LIxS+FAdOQ2d1+wY3j3VMWlGAow3MsD2tKjHbChomsVga8x9XlOI8a FhQcpK2w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1w13ob-00000000S5h-2QUJ; Fri, 13 Mar 2026 14:48:37 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1w13oZ-00000000S1N-06KM for linux-arm-kernel@bombadil.infradead.org; Fri, 13 Mar 2026 14:48:35 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; 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=Vk8Dh8e4EH+d4xDuxe29rio8IhI3FGbWiswrW2vYySg=; b=frxzD8iDHN5Gdw0kK7oWfEs9ZL uMQlDOiCGvgW91x/uece/gPiExM5ASTk3kqLlJQiBkiAgsnJATDN4pAeFERgO4gbEmMTQ299GvOUY Om0fraJY0c8J/A7le888rAPfkwGfKA1LKgMxp/ynAcMzjcrtM0ODNGG5ij1gNj4rPCBqJccOMCL+Q SYdZ7kP5TNHm15GoPpI7yVe7ZTlViHsJulglMZ3efO5lY/fPY+puiQXQjFXSPOK/GMHyddXRLOG+T h+2Hn9URSDyIC1CnhsHi2lsgBbFpzJPFh8DCrL0cgQT6GsZre0TTw/xR8cejffsaQy6baUIJe96lA gR8Xitbg==; Received: from foss.arm.com ([217.140.110.172]) by casper.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1w13oV-0000000DG8R-18Ia for linux-arm-kernel@lists.infradead.org; Fri, 13 Mar 2026 14:48:33 +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 05DDC244C; Fri, 13 Mar 2026 07:48:24 -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 3A7673F7BD; Fri, 13 Mar 2026 07:48:26 -0700 (PDT) From: Ben Horgan To: ben.horgan@arm.com Cc: amitsinght@marvell.com, baisheng.gao@unisoc.com, baolin.wang@linux.alibaba.com, carl@os.amperecomputing.com, dave.martin@arm.com, david@kernel.org, dfustini@baylibre.com, fenghuay@nvidia.com, gshan@redhat.com, james.morse@arm.com, jonathan.cameron@huawei.com, kobak@nvidia.com, lcherian@marvell.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, peternewman@google.com, punit.agrawal@oss.qualcomm.com, quic_jiles@quicinc.com, reinette.chatre@intel.com, rohit.mathew@arm.com, scott@os.amperecomputing.com, sdonthineni@nvidia.com, tan.shaopeng@fujitsu.com, xhao@linux.alibaba.com, catalin.marinas@arm.com, will@kernel.org, corbet@lwn.net, maz@kernel.org, oupton@kernel.org, joey.gouly@arm.com, suzuki.poulose@arm.com, kvmarm@lists.linux.dev, zengheng4@huawei.com, linux-doc@vger.kernel.org, Shaopeng Tan Subject: [PATCH v6 28/40] arm_mpam: resctrl: Add support for csu counters Date: Fri, 13 Mar 2026 14:46:05 +0000 Message-ID: <20260313144617.3420416-29-ben.horgan@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260313144617.3420416-1-ben.horgan@arm.com> References: <20260313144617.3420416-1-ben.horgan@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260313_144831_588980_95D5CBB8 X-CRM114-Status: GOOD ( 19.96 ) 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: James Morse resctrl exposes a counter via a file named llc_occupancy. This isn't really a counter as its value goes up and down, this is a snapshot of the cache storage usage monitor. Add some picking code which will only find an L3. The resctrl counter file is called llc_occupancy but we don't check it is the last one as it is already identified as L3. Tested-by: Shaopeng Tan Tested-by: Zeng Heng Tested-by: Punit Agrawal Reviewed-by: Zeng Heng Reviewed-by: Shaopeng Tan Reviewed-by: Jonathan Cameron Signed-off-by: James Morse Co-developed-by: Dave Martin Signed-off-by: Dave Martin Signed-off-by: Ben Horgan --- Changes since rfc: Allow csu counters however many partid or pmg there are else if -> if reduce scope of local variables drop has_csu Changes since v2: return -> break so works for mbwu in later patch add for_each_mpam_resctrl_mon return error from mpam_resctrl_monitor_init(). It may fail when is abmc allocation introduced in a later patch. Squashed in patch from Dave Martin: https://lore.kernel.org/lkml/20250820131621.54983-1-Dave.Martin@arm.com/ Changes since v3: resctrl_enable_mon_event() signature update Restrict the events considered num-rmid update Use raw_smp_processor_id() Tighten heuristics: Make sure it is the L3 Please shout if this means the counters aren't exposed on any platforms Drop tags due to change in policy/rework Changes since v4: Move generic monitor boilerplate to separate patch --- drivers/resctrl/mpam_resctrl.c | 83 ++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/drivers/resctrl/mpam_resctrl.c b/drivers/resctrl/mpam_resctrl.c index 88895d704625..00f3ad23a335 100644 --- a/drivers/resctrl/mpam_resctrl.c +++ b/drivers/resctrl/mpam_resctrl.c @@ -311,6 +311,28 @@ static bool class_has_usable_mba(struct mpam_props *cprops) return mba_class_use_mbw_max(cprops); } +static bool cache_has_usable_csu(struct mpam_class *class) +{ + struct mpam_props *cprops; + + if (!class) + return false; + + cprops = &class->props; + + if (!mpam_has_feature(mpam_feat_msmon_csu, cprops)) + return false; + + /* + * CSU counters settle on the value, so we can get away with + * having only one. + */ + if (!cprops->num_csu_mon) + return false; + + return true; +} + /* * Calculate the worst-case percentage change from each implemented step * in the control. @@ -636,6 +658,64 @@ static void mpam_resctrl_pick_mba(void) } } +static void counter_update_class(enum resctrl_event_id evt_id, + struct mpam_class *class) +{ + struct mpam_class *existing_class = mpam_resctrl_counters[evt_id].class; + + if (existing_class) { + if (class->level == 3) { + pr_debug("Existing class is L3 - L3 wins\n"); + return; + } + + if (existing_class->level < class->level) { + pr_debug("Existing class is closer to L3, %u versus %u - closer is better\n", + existing_class->level, class->level); + return; + } + } + + mpam_resctrl_counters[evt_id].class = class; +} + +static void mpam_resctrl_pick_counters(void) +{ + struct mpam_class *class; + + lockdep_assert_cpus_held(); + + guard(srcu)(&mpam_srcu); + list_for_each_entry_srcu(class, &mpam_classes, classes_list, + srcu_read_lock_held(&mpam_srcu)) { + /* The name of the resource is L3... */ + if (class->type == MPAM_CLASS_CACHE && class->level != 3) { + pr_debug("class %u is a cache but not the L3", class->level); + continue; + } + + if (!cpumask_equal(&class->affinity, cpu_possible_mask)) { + pr_debug("class %u does not cover all CPUs", + class->level); + continue; + } + + if (cache_has_usable_csu(class)) { + pr_debug("class %u has usable CSU", + class->level); + + /* CSU counters only make sense on a cache. */ + switch (class->type) { + case MPAM_CLASS_CACHE: + counter_update_class(QOS_L3_OCCUP_EVENT_ID, class); + break; + default: + break; + } + } + } +} + static int mpam_resctrl_control_init(struct mpam_resctrl_res *res) { struct mpam_class *class = res->class; @@ -1270,6 +1350,9 @@ int mpam_resctrl_setup(void) } } + /* Find some classes to use for monitors */ + mpam_resctrl_pick_counters(); + for_each_mpam_resctrl_mon(mon, eventid) { if (!mon->class) continue; // dummy resource -- 2.43.0