mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Ben Horgan <ben.horgan@arm.com>
To: reinette.chatre@intel.com
Cc: Dave.Martin@arm.com, babu.moger@amd.com, ben.horgan@arm.com,
	bp@alien8.de, dave.hansen@linux.intel.com, fenghuay@nvidia.com,
	fustini@kernel.org, james.morse@arm.com,
	linux-kernel@vger.kernel.org, peternewman@google.com,
	tglx@linutronix.de, tony.luck@intel.com, x86@kernel.org,
	yu.c.chen@intel.com
Subject: [RFC PATCH 1/3] fs/resctrl: Add schema_name to struct resctrl_ctrl
Date: Mon, 21 Sep 2026 14:57:00 +0100	[thread overview]
Message-ID: <20260921135702.2874931-2-ben.horgan@arm.com> (raw)
In-Reply-To: <20260921135702.2874931-1-ben.horgan@arm.com>

In order to properly align the schema in the schemata and size file the
maximum of length of all the schema names needs to be
known. resctrl_resource_ctrl_max_len() makes this calculation but stops
short of actually constructing and storing the schema names. As the schema
name is based on the resource name and the schema name with some special
cases for legacy controls this leads to a lot of conditional formatting
when displaying the schema name.

Construct the schema name and save it to struct resctrl when mounting
resctrl. This makes displaying the schema name easy whilst control of the
naming stays within resctrl.

Signed-off-by: Ben Horgan <ben.horgan@arm.com>
---
 fs/resctrl/ctrlmondata.c | 51 ++++++-----------------------
 fs/resctrl/rdtgroup.c    | 69 +++++++++++++++++++++++++---------------
 include/linux/resctrl.h  |  1 +
 3 files changed, 55 insertions(+), 66 deletions(-)

diff --git a/fs/resctrl/ctrlmondata.c b/fs/resctrl/ctrlmondata.c
index 675531009136..efeb36e0db25 100644
--- a/fs/resctrl/ctrlmondata.c
+++ b/fs/resctrl/ctrlmondata.c
@@ -379,6 +379,9 @@ int resctrl_prefix_width_adjust(struct resctrl_ctrl *ctrl)
 {
 	int len;
 
+	if (resctrl_ctrl_is_default(ctrl))
+		return max_name_width;
+
 	len = max_name_width - 1 - strlen(resctrl_ctrl_name_str(ctrl->name));
 	if (len < 0)
 		return 0;
@@ -456,33 +459,6 @@ static struct resctrl_ctrl *resctrl_resource_ctrl_get(struct rdt_resource *r,
 	return NULL;
 }
 
-/*
- * Return length needed to display longest control suffix.
- * Add 1 for the "_" character when control name exists.
- */
-size_t resctrl_resource_ctrl_max_len(struct rdt_resource *r)
-{
-	struct resctrl_ctrl *ctrl, *em_ctrl;
-	size_t total = 0;
-	size_t len;
-
-	for_each_resource_ctrl(ctrl,r) {
-		/* Remove duplicate code. */
-		len = strlen(resctrl_ctrl_name_str(ctrl->name));
-		if (len)
-			total = max(total, 1 + len);
-		if (list_empty(&ctrl->emulated_by))
-			continue;
-		list_for_each_entry(em_ctrl, &ctrl->emulated_by, entry) {
-			len = strlen(resctrl_ctrl_name_str(em_ctrl->name));
-			if (len)
-				total = max(total, 1 + len);
-		}
-	}
-
-	return total;
-}
-
 static int rdtgroup_parse_ctrl(char *ctrlname, char *tok,
 			       struct rdtgroup *rdtgrp)
 {
@@ -595,14 +571,8 @@ static void show_doms(struct seq_file *s, struct rdt_resource_final *f,
 	/* Walking ctrl->domains, ensure it can't race with cpuhp */
 	lockdep_assert_cpus_held();
 
-	if (print_ctrl) {
-		if (resctrl_ctrl_is_default(ctrl)) {
-			seq_printf(s, "%*s:", max_name_width, f->name);
-		} else {
-			seq_printf(s, "%*s_%s:", resctrl_prefix_width_adjust(ctrl),
-				   f->name, resctrl_ctrl_name_str(ctrl->name));
-		}
-	}
+	if (print_ctrl)
+		seq_printf(s, "%*s:", max_name_width, ctrl->schema_name);
 	list_for_each_entry_rcu(dom, &ctrl->domains, hdr.list, lockdep_is_cpus_held()) {
 		if (sep)
 			seq_puts(s, ";");
@@ -638,18 +608,17 @@ int rdtgroup_schemata_show(struct kernfs_open_file *of,
 	if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) {
 		list_for_each_entry(f, &rdt_resource_final_all, list) {
 			for_each_enabled_ctrl(ctrl, f->res)
-				seq_printf(s, "%s%s%s:uninitialized\n", f->name,
-					   resctrl_ctrl_is_default(ctrl) ? "" : "_",
-					   resctrl_ctrl_is_default(ctrl) ?
-					    "" : resctrl_ctrl_name_str(ctrl->name));
+				seq_printf(s, "%*s:uninitialized\n",
+					   max_name_width, ctrl->schema_name);
 		}
 	} else if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED) {
 		if (!rdtgrp->plr->d) {
 			rdt_last_cmd_puts("Cache domain offline\n");
 			ret = -ENODEV;
 		} else {
-			seq_printf(s, "%s:%d=%x\n",
-				   rdtgrp->plr->f->res->name,
+			ctrl = resctrl_resource_ctrl_get_default(f->res);
+			seq_printf(s, "%*s:%d=%x\n",
+				   max_name_width, ctrl->schema_name,
 				   rdtgrp->plr->d->hdr.id,
 				   rdtgrp->plr->cbm);
 		}
diff --git a/fs/resctrl/rdtgroup.c b/fs/resctrl/rdtgroup.c
index 416b73c57016..deb47edb2e87 100644
--- a/fs/resctrl/rdtgroup.c
+++ b/fs/resctrl/rdtgroup.c
@@ -1850,13 +1850,7 @@ static int rdtgroup_size_show(struct kernfs_open_file *of,
 		type = f->conf_type;
 		for_each_enabled_ctrl(ctrl, r) {
 			sep = false;
-			if (resctrl_ctrl_is_default(ctrl)) {
-				seq_printf(s, "%*s:", max_name_width, f->name);
-			} else {
-				seq_printf(s, "%*s_%s:", resctrl_prefix_width_adjust(ctrl),
-					   f->name,
-					   resctrl_ctrl_name_str(ctrl->name));
-			}
+			seq_printf(s, "%*s:", max_name_width, ctrl->schema_name);
 			list_for_each_entry_rcu(d, &ctrl->domains, hdr.list, lockdep_is_cpus_held()) {
 				if (sep)
 					seq_putc(s, ';');
@@ -3375,11 +3369,28 @@ static int rdt_enable_ctx(struct rdt_fs_context *ctx)
 	return ret;
 }
 
+static void update_max_name_width(struct rdt_resource *r, char *name)
+{
+	int cl = strlen(name);
+
+	/*
+	 * If CDP is supported by this resource, but not enabled,
+	 * include the suffix. This ensures the tabular format of the
+	 * schemata file does not change between mounts of the filesystem.
+	 */
+	if (r->cdp_capable && !resctrl_arch_get_cdp_enabled(r))
+		cl += 4;
+
+	if (cl > max_name_width)
+		max_name_width = cl;
+}
+
 static int final_resources_list_add(struct rdt_resource *r, enum resctrl_conf_type type)
 {
+	struct resctrl_ctrl *ctrl, *em_ctrl;
 	struct rdt_resource_final *f;
 	const char *suffix = "";
-	int ret, cl;
+	int ret;
 
 	f = kzalloc_obj(*f);
 	if (!f)
@@ -3409,24 +3420,32 @@ static int final_resources_list_add(struct rdt_resource *r, enum resctrl_conf_ty
 		return -EINVAL;
 	}
 
-	cl = strlen(f->name);
-
-	/*
-	 * Maintain tabular format by taking into account the names of all
-	 * the resource's controls.
-	 */
-	cl += resctrl_resource_ctrl_max_len(f->res);
-
-	/*
-	 * If CDP is supported by this resource, but not enabled,
-	 * include the suffix. This ensures the tabular format of the
-	 * schemata file does not change between mounts of the filesystem.
-	 */
-	if (r->cdp_capable && !resctrl_arch_get_cdp_enabled(r))
-		cl += 4;
+	for_each_resource_ctrl(ctrl, r) {
+		if (resctrl_ctrl_is_default(ctrl)) {
+			ret = snprintf(ctrl->schema_name, sizeof(ctrl->schema_name),
+				       "%s", f->name);
+		} else {
+			ret = snprintf(ctrl->schema_name, sizeof(ctrl->schema_name),
+				       "%s_%s", f->name, resctrl_ctrl_name_str(ctrl->name));
+		}
+		if (ret >= sizeof(ctrl->schema_name)) {
+			kfree(f);
+			return -EINVAL;
+		}
+		update_max_name_width(r, ctrl->schema_name);
 
-	if (cl > max_name_width)
-		max_name_width = cl;
+		if (list_empty(&ctrl->emulated_by))
+			continue;
+		list_for_each_entry(em_ctrl, &ctrl->emulated_by, entry) {
+			ret = snprintf(em_ctrl->schema_name, sizeof(em_ctrl->schema_name),
+				       "%s_%s", f->name, resctrl_ctrl_name_str(em_ctrl->name));
+			if (ret >= sizeof(em_ctrl->schema_name)) {
+				kfree(f);
+				return -EINVAL;
+			}
+			update_max_name_width(r, ctrl->schema_name);
+		}
+	}
 
 	INIT_LIST_HEAD(&f->list);
 	list_add(&f->list, &rdt_resource_final_all);
diff --git a/include/linux/resctrl.h b/include/linux/resctrl.h
index 54fec07bd173..5be8991d45eb 100644
--- a/include/linux/resctrl.h
+++ b/include/linux/resctrl.h
@@ -437,6 +437,7 @@ struct resctrl_ctrl {
 	struct list_head	domains;
 	enum resctrl_ctrl_type	type;
 	enum resctrl_ctrl_name	name;
+	char			schema_name[32];
 	union {
 		struct resctrl_ctrl_bitmap	bitmap;
 		struct resctrl_ctrl_scalar	scalar;
-- 
2.43.0


  reply	other threads:[~2026-09-21 13:57 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-04  5:26 [RFC v2] arm,x86,fs/resctrl: Generic schema description Proof of Concept Reinette Chatre
2026-08-05 16:59 ` Ben Horgan
2026-08-05 23:57   ` Reinette Chatre
2026-08-06 17:04     ` Luck, Tony
2026-08-06 17:11       ` Reinette Chatre
2026-08-07 14:14         ` Moger, Babu
2026-08-07 15:35           ` Reinette Chatre
2026-08-07 18:33             ` Moger, Babu
2026-08-07 22:53               ` Reinette Chatre
2026-08-10 18:52                 ` Babu Moger
2026-08-11  4:06                   ` Reinette Chatre
2026-08-11 14:59                     ` Babu Moger
2026-08-11 15:30                       ` Reinette Chatre
2026-08-11 16:09                         ` Babu Moger
2026-08-24 14:40                 ` Ben Horgan
2026-08-24 18:07                   ` Reinette Chatre
2026-08-25 15:20                     ` Ben Horgan
2026-08-07 15:35           ` Chen, Yu C
2026-08-07 17:57             ` Moger, Babu
2026-08-10  2:05 ` Chen, Yu C
2026-08-10 15:53   ` Reinette Chatre
2026-08-10 17:23     ` Chen, Yu C
2026-08-10 18:09       ` Reinette Chatre
2026-08-11  3:49         ` Chen, Yu C
2026-08-13 13:59           ` Chen Yu
2026-08-13 15:19             ` Reinette Chatre
2026-08-18 16:02               ` Chen Yu
2026-08-18 17:10                 ` Reinette Chatre
2026-09-14  2:49         ` Chen Yu
2026-09-18 23:11           ` Reinette Chatre
2026-09-21  5:13             ` Chen, Yu C
2026-09-21 15:01               ` Reinette Chatre
2026-09-22  3:19                 ` Chen, Yu C
2026-09-21 16:21               ` Luck, Tony
2026-08-10  2:55 ` Fenghua Yu
2026-08-10  3:02   ` Chen, Yu C
2026-08-10  3:25     ` Fenghua Yu
2026-08-10  5:24       ` Chen, Yu C
2026-08-10 15:53   ` Reinette Chatre
2026-08-17 15:09     ` Reinette Chatre
2026-09-11 10:09     ` Ben Horgan
2026-09-18 22:47       ` Reinette Chatre
2026-09-21 10:22         ` Ben Horgan
2026-09-21 16:06           ` Reinette Chatre
2026-09-21 16:53             ` Ben Horgan
2026-09-21 13:56 ` [RFC PATCH 0/3] Suggestions for cache scalar controls Ben Horgan
2026-09-21 13:57   ` Ben Horgan [this message]
2026-09-21 13:57   ` [RFC PATCH 2/3] fs/resctrl: Use correct schema name in bw_validate() last_cmd_status messages Ben Horgan
2026-09-21 13:57   ` [RFC PATCH 3/3] fs/resctrl: display size for scalar cache controls Ben Horgan
2026-09-21 14:08   ` [RFC PATCH 0/3] Suggestions for cache scalar controls Ben Horgan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260921135702.2874931-2-ben.horgan@arm.com \
    --to=ben.horgan@arm.com \
    --cc=Dave.Martin@arm.com \
    --cc=babu.moger@amd.com \
    --cc=bp@alien8.de \
    --cc=dave.hansen@linux.intel.com \
    --cc=fenghuay@nvidia.com \
    --cc=fustini@kernel.org \
    --cc=james.morse@arm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=peternewman@google.com \
    --cc=reinette.chatre@intel.com \
    --cc=tglx@linutronix.de \
    --cc=tony.luck@intel.com \
    --cc=x86@kernel.org \
    --cc=yu.c.chen@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®