From nobody Mon Feb 9 19:26:50 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.20]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9644B235377 for ; Fri, 21 Mar 2025 23:16:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.20 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742598990; cv=none; b=j1ihALqMYeHlf2FPZCP7bG/EINnHJcUsjKxbCIXoyIV0/aM15+LnlTbZb0t0irdTfLdEHN6U/H/VcaFEp/nFTEiinNX8zMo7IxjnNWNGt7+HpyQlAXmEFlDD6zAm9dXCKkx35zLTK9ubxGNvtuBF88WC0CYgMLcMmNCJNHQp/qk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742598990; c=relaxed/simple; bh=BR6sWBYhLeThHSd8a037VGUJ8PncGE9yf9kQ19l3VcM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Sp90ZFFlXVcKi47BHTKULazpoLJv9MTx2BISVv6OjsK6pUdNDD1d7m7Ck41fsPGdBpm/pI0klN0Z9OtL+H8nBmucxlPUW5MG1RWcJQmc7La9tc2Zg1enJBLb2aswquWdMh+YblLicktLCDGBE3+MQax3uGC3iFgV2q9wzRk6kkw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=AUzNKA5S; arc=none smtp.client-ip=198.175.65.20 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="AUzNKA5S" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1742598989; x=1774134989; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=BR6sWBYhLeThHSd8a037VGUJ8PncGE9yf9kQ19l3VcM=; b=AUzNKA5S9N0YH3SwHnWPMVCtGj3G5QM6mUOIFrr6G0csGUZOFcgeHXIC AcWp4RGowRdDz8ws0ePNQsCj2EZsIntYcLuuR1dXtWYtp4wO2t5Ox9sKN 1ozgPb1QqRBTPXOYTnXPQ+lgP7lPRDW8F8iY8U5P9b1TBQxHOtSYBSre5 YMFPAnzOtDBiXcScnkfMHmon//FXvhGniP1q1U2qPxiTQUUG5/AA8WZDX PqMS8kvEEQc+SVZrz3MYqVTfcmeD6zI2hHIRVSEJMc37/5Ntmpf7uT/+/ E7PAG+cCbSecRCKCNDcnDq7KLyI2rppI5MF0v69MvKrqFeWkWYKa5SvPc Q==; X-CSE-ConnectionGUID: cA8JFWbgQuCqf5PN75xRug== X-CSE-MsgGUID: fRd7Wh4rRyiqY3X+x+wRXg== X-IronPort-AV: E=McAfee;i="6700,10204,11380"; a="43604633" X-IronPort-AV: E=Sophos;i="6.14,266,1736841600"; d="scan'208";a="43604633" Received: from orviesa003.jf.intel.com ([10.64.159.143]) by orvoesa112.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Mar 2025 16:16:24 -0700 X-CSE-ConnectionGUID: rThT7eakTeGuDAPmGIyFIA== X-CSE-MsgGUID: qtszo6s7SHqERPEChTqo0g== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.14,266,1736841600"; d="scan'208";a="128354327" Received: from agluck-desk3.sc.intel.com ([172.25.222.70]) by ORVIESA003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Mar 2025 16:16:24 -0700 From: Tony Luck To: Fenghua Yu , Reinette Chatre , Maciej Wieczor-Retman , Peter Newman , James Morse , Babu Moger , Drew Fustini , Dave Martin Cc: linux-kernel@vger.kernel.org, patches@lists.linux.dev, Tony Luck Subject: [PATCH v2 13/16] x86/resctrl: Add code to display core telemetry events Date: Fri, 21 Mar 2025 16:16:03 -0700 Message-ID: <20250321231609.57418-14-tony.luck@intel.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250321231609.57418-1-tony.luck@intel.com> References: <20250321231609.57418-1-tony.luck@intel.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" These can be read from any CPU. Rely on the smp_call*() functions picking the current CPU when given a free choice from cpu_online_mask. There may be multiple devices tracking each package, so scan all of them and add up counters. Output format depends on the data type. Either a 63 bit integer, or a fixed point decimal. Signed-off-by: Tony Luck --- include/linux/resctrl.h | 3 ++ fs/resctrl/internal.h | 4 +- arch/x86/kernel/cpu/resctrl/intel_aet.c | 53 +++++++++++++++++++++++++ fs/resctrl/ctrlmondata.c | 23 ++++++++++- fs/resctrl/monitor.c | 23 +++++++++-- 5 files changed, 100 insertions(+), 6 deletions(-) diff --git a/include/linux/resctrl.h b/include/linux/resctrl.h index 999e0802a26e..e900764393f4 100644 --- a/include/linux/resctrl.h +++ b/include/linux/resctrl.h @@ -532,8 +532,11 @@ void resctrl_exit(void); =20 #ifdef CONFIG_INTEL_AET_RESCTRL void rdt_get_intel_aet_mount(void); +bool intel_aet_read_event(int domid, int rmid, int evtid, u64 *val, bool *= fptype); #else static inline void rdt_get_intel_aet_mount(void) { } +static inline bool intel_aet_read_event(int domid, int rmid, int evtid, u6= 4 *val, + bool *fptype) { return false; } #endif =20 #endif /* _RESCTRL_H */ diff --git a/fs/resctrl/internal.h b/fs/resctrl/internal.h index f5a698b49e97..4d65a781034e 100644 --- a/fs/resctrl/internal.h +++ b/fs/resctrl/internal.h @@ -98,6 +98,7 @@ struct mon_data { * domains in @r sharing L3 @ci.id * @evtid: Which monitor event to read. * @first: Initialize MBM counter when true. + * @fptype:If true indicates @val is in 46.18 fixed point format * @ci: Cacheinfo for L3. Only set when @d is NULL. Used when summing d= omains. * @err: Error encountered when reading counter. * @val: Returned value of event counter. If @rgrp is a parent resource = group, @@ -112,6 +113,7 @@ struct rmid_read { struct rdt_mon_domain *d; unsigned int evtid; bool first; + bool fptype; struct cacheinfo *ci; int err; u64 val; @@ -343,7 +345,7 @@ int rdtgroup_mondata_show(struct seq_file *m, void *arg= ); =20 void mon_event_read(struct rmid_read *rr, struct rdt_resource *r, struct rdt_mon_domain *d, struct rdtgroup *rdtgrp, - cpumask_t *cpumask, int evtid, int first); + const cpumask_t *cpumask, int evtid, int first); =20 int resctrl_mon_resource_init(void); =20 diff --git a/arch/x86/kernel/cpu/resctrl/intel_aet.c b/arch/x86/kernel/cpu/= resctrl/intel_aet.c index bab8e4de26b3..41ebb2ee9b41 100644 --- a/arch/x86/kernel/cpu/resctrl/intel_aet.c +++ b/arch/x86/kernel/cpu/resctrl/intel_aet.c @@ -357,3 +357,56 @@ void rdt_get_intel_aet_mount(void) r->mon_capable =3D false; } } + +#define VALID_BIT BIT_ULL(63) +#define DATA_BITS GENMASK_ULL(62, 0) + +/* + * Walk the array of telemetry groups on a specific package. + * Read and sum values for a specific counter (described by + * guid and offset). + * Return failure (~0x0ull) if any counter isn't valid. + */ +static u64 scan_pmt_devs(int package, int guid, int offset) +{ + u64 rval, val; + int ndev =3D 0; + + rval =3D 0; + + for (int i =3D 0; i < pkg_info[package].count; i++) { + if (pkg_info[package].regions[i].guid !=3D guid) + continue; + ndev++; + val =3D readq(pkg_info[package].regions[i].addr + offset); + + if (!(val & VALID_BIT)) + return ~0ull; + rval +=3D val & DATA_BITS; + } + + return ndev ? rval : ~0ull; +} + +/* + * Read counter for an event on a domain (summing all aggregators + * on the domain). + */ +bool intel_aet_read_event(int domid, int rmid, int evtid, u64 *val, bool *= fptype) +{ + u64 evtcount; + int offset; + + if (rmid >=3D EVT_NUM_RMIDS(evtid)) + return false; + + offset =3D rmid * EVT_STRIDE(evtid); + offset +=3D EVT_OFFSET(evtid); + evtcount =3D scan_pmt_devs(domid, EVT_GUID(evtid), offset); + *fptype =3D evtid =3D=3D PMT_EVENT_ENERGY || evtid =3D=3D PMT_EVENT_ACTIV= ITY; + + if (evtcount !=3D ~0ull || *val =3D=3D 0) + *val +=3D evtcount; + + return evtcount !=3D ~0ull; +} diff --git a/fs/resctrl/ctrlmondata.c b/fs/resctrl/ctrlmondata.c index d56b78450a99..5612f5f64574 100644 --- a/fs/resctrl/ctrlmondata.c +++ b/fs/resctrl/ctrlmondata.c @@ -548,7 +548,7 @@ struct rdt_domain_hdr *resctrl_find_domain(struct list_= head *h, int id, =20 void mon_event_read(struct rmid_read *rr, struct rdt_resource *r, struct rdt_mon_domain *d, struct rdtgroup *rdtgrp, - cpumask_t *cpumask, int evtid, int first) + const cpumask_t *cpumask, int evtid, int first) { int cpu; =20 @@ -585,6 +585,21 @@ void mon_event_read(struct rmid_read *rr, struct rdt_r= esource *r, resctrl_arch_mon_ctx_free(r, evtid, rr->arch_mon_ctx); } =20 +#define NUM_FRAC_BITS 18 +#define FRAC_MASK GENMASK(NUM_FRAC_BITS - 1, 0) + +static void show_fp_value(struct seq_file *m, u64 val) +{ + u64 frac; + + frac =3D val & FRAC_MASK; + frac =3D frac * 1000000; + frac +=3D 1ul << (NUM_FRAC_BITS - 1); + frac >>=3D NUM_FRAC_BITS; + + seq_printf(m, "%llu.%06llu\n", val >> NUM_FRAC_BITS, frac); +} + int rdtgroup_mondata_show(struct seq_file *m, void *arg) { struct kernfs_open_file *of =3D m->private; @@ -594,6 +609,7 @@ int rdtgroup_mondata_show(struct seq_file *m, void *arg) u32 resid, evtid, domid; struct rdtgroup *rdtgrp; struct rdt_resource *r; + const cpumask_t *mask; struct mon_data *md; int ret =3D 0; =20 @@ -642,7 +658,8 @@ int rdtgroup_mondata_show(struct seq_file *m, void *arg) goto out; } d =3D container_of(hdr, struct rdt_mon_domain, hdr); - mon_event_read(&rr, r, d, rdtgrp, &d->hdr.cpu_mask, evtid, false); + mask =3D (resid =3D=3D RDT_RESOURCE_L3) ? &d->hdr.cpu_mask : cpu_online_= mask; + mon_event_read(&rr, r, d, rdtgrp, mask, evtid, false); } =20 checkresult: @@ -651,6 +668,8 @@ int rdtgroup_mondata_show(struct seq_file *m, void *arg) seq_puts(m, "Error\n"); else if (rr.err =3D=3D -EINVAL) seq_puts(m, "Unavailable\n"); + else if (rr.fptype) + show_fp_value(m, rr.val); else seq_printf(m, "%llu\n", rr.val); =20 diff --git a/fs/resctrl/monitor.c b/fs/resctrl/monitor.c index 3fe21dcf0fde..f4049ae5344c 100644 --- a/fs/resctrl/monitor.c +++ b/fs/resctrl/monitor.c @@ -447,6 +447,24 @@ static void mbm_bw_count(u32 closid, u32 rmid, struct = rmid_read *rr) m->prev_bw =3D cur_bw; } =20 +static int mon_event_count_one_group(int closid, int rmid, struct rmid_rea= d *rr) +{ + bool ret; + + switch (rr->r->rid) { + case RDT_RESOURCE_L3: + rr->fptype =3D false; + return __mon_event_count(closid, rmid, rr); + case RDT_RESOURCE_INTEL_AET: + ret =3D intel_aet_read_event(rr->d->hdr.id, rmid, rr->evtid, &rr->val, &= rr->fptype); + if (!ret) + rr->err =3D -EINVAL; + return ret ? 0 : -EINVAL; + } + + return -EINVAL; +} + /* * This is scheduled by mon_event_read() to read the CQM/MBM counters * on a domain. @@ -460,7 +478,7 @@ void mon_event_count(void *info) =20 rdtgrp =3D rr->rgrp; =20 - ret =3D __mon_event_count(rdtgrp->closid, rdtgrp->mon.rmid, rr); + ret =3D mon_event_count_one_group(rdtgrp->closid, rdtgrp->mon.rmid, rr); =20 /* * For Ctrl groups read data from child monitor groups and @@ -471,8 +489,7 @@ void mon_event_count(void *info) =20 if (rdtgrp->type =3D=3D RDTCTRL_GROUP) { list_for_each_entry(entry, head, mon.crdtgrp_list) { - if (__mon_event_count(entry->closid, entry->mon.rmid, - rr) =3D=3D 0) + if (mon_event_count_one_group(entry->closid, entry->mon.rmid, rr) =3D= =3D 0) ret =3D 0; } } --=20 2.48.1