[PATCH v1 03/14] arm_mpam: resctrl: extend the schemata list to support priority partition

Amit Singh Tomar amitsinght at marvell.com
Wed Jan 17 06:13:54 PST 2024


At the moment, "schemata" list is consist of two basic control types .i.e.
cache portion bitmap (CPBM), and memory bandwidth allocation (MBA),
represented as following under schemata file.

MB:0=0100
L3:0=ffff

Lets' extend the "schemata" list to support priority partition control,
This control is listed in following format (last column indicates the
priority value) under schemata file.

L3DSPRI:0=f

Signed-off-by: Amit Singh Tomar <amitsinght at marvell.com>
---
Changes since RFC:
		* This patch is reworked, Now in order to configure DSPRI partition control
                  dedicated schemata is used (L3DSPRI). 
---
 drivers/platform/mpam/mpam_resctrl.c |  7 +++++-
 fs/resctrl/rdtgroup.c                | 34 ++++++++++++++++++++++------
 include/linux/resctrl.h              |  3 +++
 include/linux/resctrl_types.h        |  3 +++
 4 files changed, 39 insertions(+), 8 deletions(-)

diff --git a/drivers/platform/mpam/mpam_resctrl.c b/drivers/platform/mpam/mpam_resctrl.c
index 09618d9ceb1d..6fd2bfeffa0a 100644
--- a/drivers/platform/mpam/mpam_resctrl.c
+++ b/drivers/platform/mpam/mpam_resctrl.c
@@ -729,8 +729,13 @@ static int mpam_resctrl_resource_init(struct mpam_resctrl_res *res)
 			exposed_alloc_capable = true;
 		}
 
-		if (has_ppart)
+		if (has_ppart) {
 			r->priority_cap = true;
+			if (class->props.dspri_wd > 0x10)
+				class->props.dspri_wd = 0x10;
+
+			r->dspri_data_width = (class->props.dspri_wd + 3) / 4;
+		}
 
 		/*
 		 * MBWU counters may be 'local' or 'total' depending on where
diff --git a/fs/resctrl/rdtgroup.c b/fs/resctrl/rdtgroup.c
index 12e31d4dddf6..568bb9bb7913 100644
--- a/fs/resctrl/rdtgroup.c
+++ b/fs/resctrl/rdtgroup.c
@@ -2261,7 +2261,7 @@ static int schemata_list_add(struct rdt_resource *r,
 				enum resctrl_ctrl_type ctrl_type)
 {
 	struct resctrl_schema *s;
-	const char *suffix = "";
+	const char *suffix = "", *ext_suffix = "";
 	int ret, cl;
 
 	s = kzalloc(sizeof(*s), GFP_KERNEL);
@@ -2286,12 +2286,22 @@ static int schemata_list_add(struct rdt_resource *r,
 		break;
 	}
 
-	if (ctrl_type == SCHEMA_BASIC) {
+	s->ctrl_type = ctrl_type;
+	switch (ctrl_type) {
+	case SCHEMA_DSPRI:
+		ext_suffix = "DSPRI";
+		break;
+	}
+
+	if (ctrl_type == SCHEMA_BASIC)
 		ret = snprintf(s->name, sizeof(s->name), "%s%s", r->name, suffix);
-		if (ret >= sizeof(s->name)) {
-			kfree(s);
-			return -EINVAL;
-		}
+	else
+		ret = snprintf(s->name, sizeof(s->name), "%s%s%s", r->name,
+				suffix, ext_suffix);
+
+	if (ret >= sizeof(s->name)) {
+		kfree(s);
+		return -EINVAL;
 	}
 
 	cl = strlen(s->name);
@@ -2312,7 +2322,9 @@ static int schemata_list_add(struct rdt_resource *r,
 	 * widest cbm/data_width.
 	 */
 	if (ctrl_type == SCHEMA_BASIC)
-		max_data_width = max(max_data_width, r->data_width);
+		s->max_data_width = max(max_data_width, r->data_width);
+	else
+		s->max_data_width = max(max_data_width, r->dspri_data_width);
 
 	INIT_LIST_HEAD(&s->list);
 	list_add(&s->list, &resctrl_schema_all);
@@ -2322,6 +2334,7 @@ static int schemata_list_add(struct rdt_resource *r,
 
 static int schemata_list_create(void)
 {
+	enum resctrl_ctrl_type ctrl_type;
 	enum resctrl_res_level i;
 	struct rdt_resource *r;
 	int ret = 0;
@@ -2345,6 +2358,13 @@ static int schemata_list_create(void)
 		if (ret)
 			break;
 
+		for_each_extend_ctrl_type(ctrl_type) {
+			if (ctrl_type == 1 && r->priority_cap) {
+				ret = schemata_list_add(r, CDP_NONE, SCHEMA_DSPRI);
+				if (ret)
+					break;
+			}
+		}
 	}
 
 	return ret;
diff --git a/include/linux/resctrl.h b/include/linux/resctrl.h
index d49aed80a05e..cb17c7704fd7 100644
--- a/include/linux/resctrl.h
+++ b/include/linux/resctrl.h
@@ -205,6 +205,7 @@ struct resctrl_membw {
  * @domains:		RCU list of all domains for this resource
  * @name:		Name to use in "schemata" file.
  * @data_width:		Character width of data when displaying
+ * @dspri_data_width	Character width of dspri value when displaying
  * @default_ctrl:	Specifies default cache cbm or memory B/W percent.
  * @format_str:		Per resource format string to show domain value
  * @evt_list:		List of monitoring events
@@ -223,6 +224,7 @@ struct rdt_resource {
 	struct list_head	domains;
 	char			*name;
 	int			data_width;
+	int                     dspri_data_width;
 	u32			default_ctrl;
 	const char		*format_str;
 	struct list_head	evt_list;
@@ -256,6 +258,7 @@ struct resctrl_schema {
 	enum resctrl_ctrl_type          ctrl_type;
 	struct rdt_resource		*res;
 	u32				num_closid;
+	int                             max_data_width;
 };
 
 /*
diff --git a/include/linux/resctrl_types.h b/include/linux/resctrl_types.h
index b9268ec3ba71..b1a22053d7cd 100644
--- a/include/linux/resctrl_types.h
+++ b/include/linux/resctrl_types.h
@@ -57,6 +57,9 @@ enum resctrl_res_level {
 	RDT_NUM_RESOURCES,
 };
 
+#define for_each_extend_ctrl_type(t)    \
+	for (t = SCHEMA_DSPRI; t != SCHEMA_NUM_CTRL_TYPE; t++)
+
 enum resctrl_ctrl_type {
 	SCHEMA_BASIC = 0,
 	SCHEMA_DSPRI,
-- 
2.25.1




More information about the linux-arm-kernel mailing list