Skip to content

Commit c24f5ea

Browse files
James Morsebp3tk0v
authored andcommitted
x86/resctrl: Use schema type to determine how to parse schema values
Resctrl's architecture code gets to specify a function pointer that is used when parsing schema entries. This is expected to be one of two helpers from the filesystem code. Setting this function pointer allows the architecture code to change the ABI resctrl presents to user-space, and forces resctrl to expose these helpers. Instead, add a schema format enum to choose which schema parser to use. This allows the helpers to be made static and the structs used for passing arguments moved out of shared headers. Signed-off-by: James Morse <james.morse@arm.com> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Reviewed-by: Shaopeng Tan <tan.shaopeng@jp.fujitsu.com> Reviewed-by: Tony Luck <tony.luck@intel.com> Reviewed-by: Reinette Chatre <reinette.chatre@intel.com> Reviewed-by: Fenghua Yu <fenghuay@nvidia.com> Reviewed-by: Babu Moger <babu.moger@amd.com> Tested-by: Carl Worth <carl@os.amperecomputing.com> # arm64 Tested-by: Shaopeng Tan <tan.shaopeng@jp.fujitsu.com> Tested-by: Peter Newman <peternewman@google.com> Tested-by: Amit Singh Tomar <amitsinght@marvell.com> # arm64 Tested-by: Shanker Donthineni <sdonthineni@nvidia.com> # arm64 Tested-by: Babu Moger <babu.moger@amd.com> Link: https://lore.kernel.org/r/20250311183715.16445-5-james.morse@arm.com
1 parent 131dab1 commit c24f5ea

4 files changed

Lines changed: 43 additions & 24 deletions

File tree

arch/x86/kernel/cpu/resctrl/core.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ struct rdt_hw_resource rdt_resources_all[RDT_NUM_RESOURCES] = {
7272
.mon_scope = RESCTRL_L3_CACHE,
7373
.ctrl_domains = ctrl_domain_init(RDT_RESOURCE_L3),
7474
.mon_domains = mon_domain_init(RDT_RESOURCE_L3),
75-
.parse_ctrlval = parse_cbm,
75+
.schema_fmt = RESCTRL_SCHEMA_BITMAP,
7676
.format_str = "%d=%0*x",
7777
},
7878
.msr_base = MSR_IA32_L3_CBM_BASE,
@@ -85,7 +85,7 @@ struct rdt_hw_resource rdt_resources_all[RDT_NUM_RESOURCES] = {
8585
.name = "L2",
8686
.ctrl_scope = RESCTRL_L2_CACHE,
8787
.ctrl_domains = ctrl_domain_init(RDT_RESOURCE_L2),
88-
.parse_ctrlval = parse_cbm,
88+
.schema_fmt = RESCTRL_SCHEMA_BITMAP,
8989
.format_str = "%d=%0*x",
9090
},
9191
.msr_base = MSR_IA32_L2_CBM_BASE,
@@ -98,7 +98,7 @@ struct rdt_hw_resource rdt_resources_all[RDT_NUM_RESOURCES] = {
9898
.name = "MB",
9999
.ctrl_scope = RESCTRL_L3_CACHE,
100100
.ctrl_domains = ctrl_domain_init(RDT_RESOURCE_MBA),
101-
.parse_ctrlval = parse_bw,
101+
.schema_fmt = RESCTRL_SCHEMA_RANGE,
102102
.format_str = "%d=%*u",
103103
},
104104
},
@@ -109,7 +109,7 @@ struct rdt_hw_resource rdt_resources_all[RDT_NUM_RESOURCES] = {
109109
.name = "SMBA",
110110
.ctrl_scope = RESCTRL_L3_CACHE,
111111
.ctrl_domains = ctrl_domain_init(RDT_RESOURCE_SMBA),
112-
.parse_ctrlval = parse_bw,
112+
.schema_fmt = RESCTRL_SCHEMA_RANGE,
113113
.format_str = "%d=%*u",
114114
},
115115
},

arch/x86/kernel/cpu/resctrl/ctrlmondata.c

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,15 @@
2323

2424
#include "internal.h"
2525

26+
struct rdt_parse_data {
27+
struct rdtgroup *rdtgrp;
28+
char *buf;
29+
};
30+
31+
typedef int (ctrlval_parser_t)(struct rdt_parse_data *data,
32+
struct resctrl_schema *s,
33+
struct rdt_ctrl_domain *d);
34+
2635
/*
2736
* Check whether MBA bandwidth percentage value is correct. The value is
2837
* checked against the minimum and max bandwidth values specified by the
@@ -64,8 +73,8 @@ static bool bw_validate(char *buf, u32 *data, struct rdt_resource *r)
6473
return true;
6574
}
6675

67-
int parse_bw(struct rdt_parse_data *data, struct resctrl_schema *s,
68-
struct rdt_ctrl_domain *d)
76+
static int parse_bw(struct rdt_parse_data *data, struct resctrl_schema *s,
77+
struct rdt_ctrl_domain *d)
6978
{
7079
struct resctrl_staged_config *cfg;
7180
u32 closid = data->rdtgrp->closid;
@@ -143,8 +152,8 @@ static bool cbm_validate(char *buf, u32 *data, struct rdt_resource *r)
143152
* Read one cache bit mask (hex). Check that it is valid for the current
144153
* resource type.
145154
*/
146-
int parse_cbm(struct rdt_parse_data *data, struct resctrl_schema *s,
147-
struct rdt_ctrl_domain *d)
155+
static int parse_cbm(struct rdt_parse_data *data, struct resctrl_schema *s,
156+
struct rdt_ctrl_domain *d)
148157
{
149158
struct rdtgroup *rdtgrp = data->rdtgrp;
150159
struct resctrl_staged_config *cfg;
@@ -210,6 +219,7 @@ static int parse_line(char *line, struct resctrl_schema *s,
210219
struct rdtgroup *rdtgrp)
211220
{
212221
enum resctrl_conf_type t = s->conf_type;
222+
ctrlval_parser_t *parse_ctrlval = NULL;
213223
struct resctrl_staged_config *cfg;
214224
struct rdt_resource *r = s->res;
215225
struct rdt_parse_data data;
@@ -220,6 +230,18 @@ static int parse_line(char *line, struct resctrl_schema *s,
220230
/* Walking r->domains, ensure it can't race with cpuhp */
221231
lockdep_assert_cpus_held();
222232

233+
switch (r->schema_fmt) {
234+
case RESCTRL_SCHEMA_BITMAP:
235+
parse_ctrlval = &parse_cbm;
236+
break;
237+
case RESCTRL_SCHEMA_RANGE:
238+
parse_ctrlval = &parse_bw;
239+
break;
240+
}
241+
242+
if (WARN_ON_ONCE(!parse_ctrlval))
243+
return -EINVAL;
244+
223245
if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP &&
224246
(r->rid == RDT_RESOURCE_MBA || r->rid == RDT_RESOURCE_SMBA)) {
225247
rdt_last_cmd_puts("Cannot pseudo-lock MBA resource\n");
@@ -240,7 +262,7 @@ static int parse_line(char *line, struct resctrl_schema *s,
240262
if (d->hdr.id == dom_id) {
241263
data.buf = dom;
242264
data.rdtgrp = rdtgrp;
243-
if (r->parse_ctrlval(&data, s, d))
265+
if (parse_ctrlval(&data, s, d))
244266
return -EINVAL;
245267
if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) {
246268
cfg = &d->staged_config[t];

arch/x86/kernel/cpu/resctrl/internal.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -459,11 +459,6 @@ static inline bool is_mbm_event(int e)
459459
e <= QOS_L3_MBM_LOCAL_EVENT_ID);
460460
}
461461

462-
struct rdt_parse_data {
463-
struct rdtgroup *rdtgrp;
464-
char *buf;
465-
};
466-
467462
/**
468463
* struct rdt_hw_resource - arch private attributes of a resctrl resource
469464
* @r_resctrl: Attributes of the resource used directly by resctrl.
@@ -500,11 +495,6 @@ static inline struct rdt_hw_resource *resctrl_to_arch_res(struct rdt_resource *r
500495
return container_of(r, struct rdt_hw_resource, r_resctrl);
501496
}
502497

503-
int parse_cbm(struct rdt_parse_data *data, struct resctrl_schema *s,
504-
struct rdt_ctrl_domain *d);
505-
int parse_bw(struct rdt_parse_data *data, struct resctrl_schema *s,
506-
struct rdt_ctrl_domain *d);
507-
508498
extern struct mutex rdtgroup_mutex;
509499

510500
extern struct rdt_hw_resource rdt_resources_all[];

include/linux/resctrl.h

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,6 @@ struct resctrl_membw {
183183
u32 *mb_map;
184184
};
185185

186-
struct rdt_parse_data;
187186
struct resctrl_schema;
188187

189188
enum resctrl_scope {
@@ -192,6 +191,16 @@ enum resctrl_scope {
192191
RESCTRL_L3_NODE,
193192
};
194193

194+
/**
195+
* enum resctrl_schema_fmt - The format user-space provides for a schema.
196+
* @RESCTRL_SCHEMA_BITMAP: The schema is a bitmap in hex.
197+
* @RESCTRL_SCHEMA_RANGE: The schema is a decimal number.
198+
*/
199+
enum resctrl_schema_fmt {
200+
RESCTRL_SCHEMA_BITMAP,
201+
RESCTRL_SCHEMA_RANGE,
202+
};
203+
195204
/**
196205
* struct rdt_resource - attributes of a resctrl resource
197206
* @rid: The index of the resource
@@ -208,7 +217,7 @@ enum resctrl_scope {
208217
* @data_width: Character width of data when displaying
209218
* @default_ctrl: Specifies default cache cbm or memory B/W percent.
210219
* @format_str: Per resource format string to show domain value
211-
* @parse_ctrlval: Per resource function pointer to parse control values
220+
* @schema_fmt: Which format string and parser is used for this schema.
212221
* @evt_list: List of monitoring events
213222
* @cdp_capable: Is the CDP feature available on this resource
214223
*/
@@ -227,9 +236,7 @@ struct rdt_resource {
227236
int data_width;
228237
u32 default_ctrl;
229238
const char *format_str;
230-
int (*parse_ctrlval)(struct rdt_parse_data *data,
231-
struct resctrl_schema *s,
232-
struct rdt_ctrl_domain *d);
239+
enum resctrl_schema_fmt schema_fmt;
233240
struct list_head evt_list;
234241
bool cdp_capable;
235242
};

0 commit comments

Comments
 (0)