Skip to content

Commit

Permalink
fs/resctrl: group the resource control types for schemata list
Browse files Browse the repository at this point in the history
At the moment, resource control group support the basic control features
(that can be applied to system resources like cache, and Memory)
such as CAT (Cache Allocation Technology), and MBA (Memory Bandwidth
Allocation).

Apart from these basic controls, System can support other controls that
does not directly affect the allocation of memory-system resources.
Instead, it has an effect on conflicts that arise during access to
resources, such as Priority partitioning found on ARM MPAM.

In order to support control types of different nature, lets divide them
into different groups, already existing control features (CAT, and MBA)
is grouped under basic schemata type .i.e. SCHEMATA_BASIC, and to support
priority partition (the downstream priority one), it is placed under
SCHEMA_DSPRI control type. These control type is associated with list(s)
of schemata.

Signed-off-by: Amit Singh Tomar <amitsinght@marvell.com>
  • Loading branch information
Amit Singh Tomar committed Jan 1, 2024
1 parent b04a157 commit 71ac4cc
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 10 deletions.
26 changes: 16 additions & 10 deletions fs/resctrl/rdtgroup.c
Original file line number Diff line number Diff line change
Expand Up @@ -2256,7 +2256,9 @@ static int rdt_enable_ctx(struct rdt_fs_context *ctx)
return ret;
}

static int schemata_list_add(struct rdt_resource *r, enum resctrl_conf_type type)
static int schemata_list_add(struct rdt_resource *r,
enum resctrl_conf_type type,
enum resctrl_ctrl_type ctrl_type)
{
struct resctrl_schema *s;
const char *suffix = "";
Expand Down Expand Up @@ -2284,10 +2286,12 @@ static int schemata_list_add(struct rdt_resource *r, enum resctrl_conf_type type
break;
}

ret = snprintf(s->name, sizeof(s->name), "%s%s", r->name, suffix);
if (ret >= sizeof(s->name)) {
kfree(s);
return -EINVAL;
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;
}
}

cl = strlen(s->name);
Expand All @@ -2300,14 +2304,15 @@ static int schemata_list_add(struct rdt_resource *r, enum resctrl_conf_type type
if (r->cdp_capable && !resctrl_arch_get_cdp_enabled(r->rid))
cl += 4;

if (cl > max_name_width)
if (cl > max_name_width && ctrl_type == SCHEMA_BASIC)
max_name_width = cl;

/*
* Choose a width for the resource data based on the resource that has
* widest cbm/data_width.
*/
max_data_width = max(max_data_width, r->data_width);
if (ctrl_type == SCHEMA_BASIC)
max_data_width = max(max_data_width, r->data_width);

INIT_LIST_HEAD(&s->list);
list_add(&s->list, &resctrl_schema_all);
Expand All @@ -2328,17 +2333,18 @@ static int schemata_list_create(void)
continue;

if (resctrl_arch_get_cdp_enabled(r->rid)) {
ret = schemata_list_add(r, CDP_CODE);
ret = schemata_list_add(r, CDP_CODE, SCHEMA_BASIC);
if (ret)
break;

ret = schemata_list_add(r, CDP_DATA);
ret = schemata_list_add(r, CDP_DATA, SCHEMA_BASIC);
} else {
ret = schemata_list_add(r, CDP_NONE);
ret = schemata_list_add(r, CDP_NONE, SCHEMA_BASIC);
}

if (ret)
break;

}

return ret;
Expand Down
1 change: 1 addition & 0 deletions include/linux/resctrl.h
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,7 @@ struct resctrl_schema {
struct list_head list;
char name[8];
enum resctrl_conf_type conf_type;
enum resctrl_ctrl_type ctrl_type;
struct rdt_resource *res;
u32 num_closid;
};
Expand Down
6 changes: 6 additions & 0 deletions include/linux/resctrl_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,12 @@ enum resctrl_res_level {
RDT_NUM_RESOURCES,
};

enum resctrl_ctrl_type {
SCHEMA_BASIC = 0,
SCHEMA_DSPRI,
SCHEMA_NUM_CTRL_TYPE
};

#define CDP_NUM_TYPES (CDP_DATA + 1)

/*
Expand Down

0 comments on commit 71ac4cc

Please sign in to comment.