From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.13]) (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 6413232D432 for ; Thu, 4 Dec 2025 20:54:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.13 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764881690; cv=none; b=lyLCHViMboN0kkV9mjaFCFyY0sGB5lyqCkQr5z/dN+nt9rvsb6xUxVKkp4REtdwM3F/jjq0p4tQdSfsCvEJCr0B1xyVfdB8UQUAu2+I+0N7vRRk/3Pv3xd7AORy9kjerhTULtGEk3mNOjIPznpUQr5NCMPcoIZpzTC/foFJgqpQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764881690; c=relaxed/simple; bh=HL2ho3E1T6eXXqytACxTDdFzlnxmn2vkjFpSYn+ew2Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Q5A0oaVfSBKD31nMa/xp1rveu4GIQH9OGj7LcJyNoGI1la86CQQ9wHY5pIu+rM6jLpLHUK9zywjfpNHZGge17DXZGQATvhGwb2erv+gcJAFb/eavlF5+roEkiuntN7YowCPwn06E5Guu/4dI8Qg1WLSKQjWKc0Mt9U+QCKbmQCQ= 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=FyHozmz4; arc=none smtp.client-ip=192.198.163.13 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="FyHozmz4" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1764881687; x=1796417687; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=HL2ho3E1T6eXXqytACxTDdFzlnxmn2vkjFpSYn+ew2Q=; b=FyHozmz4Hfexf2zR6I4ZowS2qioCHzTK3j0nLPr5Id/quehxl7CH5p8b nJKl0C+uD7r5a6yRM2aT9fIIT3TQPrPzO6T2QIU2TVS8qdKQevlqMUegD 2DLkFrU0uN6b89gaYW4122YQpcLjMLutGxlHfJxm7CnhUjB52toBnp9nX 7U3toOKQl8lpcHwGYUO9AXazpcVfFBAwgMQdW+fOJUrHfYTTBNZyyFZKt 86dOvuKWg9vpIYD6K49OW2MjTEC7RAGPUoNMWf97N3uNpZNkrzt7n9lWZ rBnyN/0BP7On0eO0oA8LSwv2tUN3imO+Vb7IY6C2WCePXvcCnnkO4+VKE A==; X-CSE-ConnectionGUID: XpnzHYxKTnukLtKaYoXd/w== X-CSE-MsgGUID: tk6QsiwlSOKpU023/KDW1Q== X-IronPort-AV: E=McAfee;i="6800,10657,11632"; a="69511108" X-IronPort-AV: E=Sophos;i="6.20,250,1758610800"; d="scan'208";a="69511108" Received: from orviesa002.jf.intel.com ([10.64.159.142]) by fmvoesa107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Dec 2025 12:54:34 -0800 X-CSE-ConnectionGUID: Jy846jq2RbafxmGAk0r/Qg== X-CSE-MsgGUID: vXaCT4IfQ3ui9xOHCqLL1Q== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.20,250,1758610800"; d="scan'208";a="225752901" Received: from mgerlach-mobl1.amr.corp.intel.com (HELO agluck-desk3.intel.com) ([10.124.220.165]) by orviesa002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Dec 2025 12:54:33 -0800 From: Tony Luck To: Fenghua Yu , Reinette Chatre , Maciej Wieczor-Retman , Peter Newman , James Morse , Babu Moger , Drew Fustini , Dave Martin , Chen Yu Cc: x86@kernel.org, linux-kernel@vger.kernel.org, patches@lists.linux.dev, Tony Luck Subject: [PATCH v15 31/32] x86/resctrl: Add debugfs files to show telemetry aggregator status Date: Thu, 4 Dec 2025 12:54:01 -0800 Message-ID: <20251204205404.12763-32-tony.luck@intel.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20251204205404.12763-1-tony.luck@intel.com> References: <20251204205404.12763-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: 8bit Each telemetry aggregator provides three status registers at the top end of MMIO space after all the per-RMID per-event counters: data_loss_count: This counts the number of times that this aggregator failed to accumulate a counter value supplied by a CPU core. data_loss_timestamp: This is a "timestamp" from a free running 25MHz uncore timer indicating when the most recent data loss occurred. last_update_timestamp: Another 25MHz timestamp indicating when the most recent counter update was successfully applied. Create files in /sys/kernel/debug/resctrl/info/PERF_PKG_MON/x86_64/ to display the value of each of these status registers for each aggregator in each enabled event group. The prefix for each file name describes the type of aggregator, the guid, which package it is located on, and an opaque instance number to provide a unique file name when there are multiple aggregators on a package. The suffix is one of the three strings listed above. An example name is: energy_0x26696143_pkg0_agg2_data_loss_count These files are removed along with all other debugfs entries by the call to debugfs_remove_recursive() in resctrl_exit(). Signed-off-by: Tony Luck Reviewed-by: Reinette Chatre --- arch/x86/kernel/cpu/resctrl/internal.h | 2 + arch/x86/kernel/cpu/resctrl/core.c | 2 + arch/x86/kernel/cpu/resctrl/intel_aet.c | 60 +++++++++++++++++++++++++ 3 files changed, 64 insertions(+) diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h index df09091f7c6c..e538174fe193 100644 --- a/arch/x86/kernel/cpu/resctrl/internal.h +++ b/arch/x86/kernel/cpu/resctrl/internal.h @@ -236,6 +236,7 @@ void __exit intel_aet_exit(void); int intel_aet_read_event(int domid, u32 rmid, void *arch_priv, u64 *val); void intel_aet_mon_domain_setup(int cpu, int id, struct rdt_resource *r, struct list_head *add_pos); +void intel_aet_add_debugfs(void); bool intel_aet_option(bool force_off, char *tok); #else static inline bool intel_aet_get_events(void) { return false; } @@ -247,6 +248,7 @@ static inline int intel_aet_read_event(int domid, u32 rmid, void *arch_priv, u64 static inline void intel_aet_mon_domain_setup(int cpu, int id, struct rdt_resource *r, struct list_head *add_pos) { } +static inline void intel_aet_add_debugfs(void) { } static inline bool intel_aet_option(bool force_off, char *tok) { return false; } #endif diff --git a/arch/x86/kernel/cpu/resctrl/core.c b/arch/x86/kernel/cpu/resctrl/core.c index 829633bc54e5..62e96aad060d 100644 --- a/arch/x86/kernel/cpu/resctrl/core.c +++ b/arch/x86/kernel/cpu/resctrl/core.c @@ -788,6 +788,8 @@ void resctrl_arch_pre_mount(void) domain_add_cpu_mon(cpu, r); mutex_unlock(&domain_list_lock); cpus_read_unlock(); + + intel_aet_add_debugfs(); } enum { diff --git a/arch/x86/kernel/cpu/resctrl/intel_aet.c b/arch/x86/kernel/cpu/resctrl/intel_aet.c index 2e68c6baf9b2..693820b9c155 100644 --- a/arch/x86/kernel/cpu/resctrl/intel_aet.c +++ b/arch/x86/kernel/cpu/resctrl/intel_aet.c @@ -15,8 +15,11 @@ #include #include #include +#include +#include #include #include +#include #include #include #include @@ -29,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -226,6 +230,46 @@ static bool all_regions_have_sufficient_rmid(struct event_group *e, struct pmt_f return ret; } +static int status_read(void *priv, u64 *val) +{ + void __iomem *info = (void __iomem *)priv; + + *val = readq(info); + + return 0; +} + +DEFINE_SIMPLE_ATTRIBUTE(status_fops, status_read, NULL, "%llu\n"); + +static void make_status_files(struct dentry *dir, struct event_group *e, u8 pkg, + int instance, void *info_end) +{ + char name[80]; + + sprintf(name, "%s_0x%x_pkg%u_agg%d_data_loss_count", e->pfname, e->guid, pkg, instance); + debugfs_create_file(name, 0400, dir, info_end - 24, &status_fops); + + sprintf(name, "%s_0x%x_pkg%u_agg%d_data_loss_timestamp", e->pfname, e->guid, pkg, instance); + debugfs_create_file(name, 0400, dir, info_end - 16, &status_fops); + + sprintf(name, "%s_0x%x_pkg%u_agg%d_last_update_timestamp", e->pfname, e->guid, pkg, instance); + debugfs_create_file(name, 0400, dir, info_end - 8, &status_fops); +} + +static void create_debug_event_status_files(struct dentry *dir, struct event_group *e) +{ + struct pmt_feature_group *p = e->pfg; + void *info_end; + + for (int i = 0; i < p->count; i++) { + if (!p->regions[i].addr) + continue; + info_end = (void __force *)p->regions[i].addr + e->mmio_size; + make_status_files(dir, e, p->regions[i].plat_info.package_id, + i, info_end); + } +} + static bool enable_events(struct event_group *e, struct pmt_feature_group *p) { struct rdt_resource *r = &rdt_resources_all[RDT_RESOURCE_PERF_PKG].r_resctrl; @@ -410,3 +454,19 @@ void intel_aet_mon_domain_setup(int cpu, int id, struct rdt_resource *r, kfree(d); } } + +void intel_aet_add_debugfs(void) +{ + struct rdt_resource *r = &rdt_resources_all[RDT_RESOURCE_PERF_PKG].r_resctrl; + struct event_group **peg; + struct dentry *infodir; + + infodir = resctrl_debugfs_mon_info_arch_mkdir(r); + + if (IS_ERR_OR_NULL(infodir)) + return; + + for_each_event_group(peg) + if ((*peg)->pfg) + create_debug_event_status_files(infodir, *peg); +} -- 2.51.1