[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