fs/resctrl: Modify struct rdt_parse_data to pass mode and CLOSID
parse_cbm() requires resource group mode and CLOSID to validate the capacity bitmask (CBM). It is passed via struct rdtgroup in struct rdt_parse_data. The io_alloc feature also uses CBMs to indicate which portions of cache are allocated for I/O traffic. The CBMs are provided by user space and need to be validated the same as CBMs provided for general (CPU) cache allocation. parse_cbm() cannot be used as-is since io_alloc does not have rdtgroup context. Pass the resource group mode and CLOSID directly to parse_cbm() via struct rdt_parse_data, instead of through the rdtgroup struct, to facilitate calling parse_cbm() to verify the CBM of the io_alloc feature. Signed-off-by: Babu Moger <babu.moger@amd.com> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Reviewed-by: Reinette Chatre <reinette.chatre@intel.com> Link: https://patch.msgid.link/f8ec6ab5cf594d906a3fe75f56793d5fbd63f38f.1762995456.git.babu.moger@amd.com
This commit is contained in:
parent
77b6623262
commit
af1242eeca
|
|
@ -24,7 +24,8 @@
|
|||
#include "internal.h"
|
||||
|
||||
struct rdt_parse_data {
|
||||
struct rdtgroup *rdtgrp;
|
||||
u32 closid;
|
||||
enum rdtgrp_mode mode;
|
||||
char *buf;
|
||||
};
|
||||
|
||||
|
|
@ -77,8 +78,8 @@ static int parse_bw(struct rdt_parse_data *data, struct resctrl_schema *s,
|
|||
struct rdt_ctrl_domain *d)
|
||||
{
|
||||
struct resctrl_staged_config *cfg;
|
||||
u32 closid = data->rdtgrp->closid;
|
||||
struct rdt_resource *r = s->res;
|
||||
u32 closid = data->closid;
|
||||
u32 bw_val;
|
||||
|
||||
cfg = &d->staged_config[s->conf_type];
|
||||
|
|
@ -156,9 +157,10 @@ static bool cbm_validate(char *buf, u32 *data, struct rdt_resource *r)
|
|||
static int parse_cbm(struct rdt_parse_data *data, struct resctrl_schema *s,
|
||||
struct rdt_ctrl_domain *d)
|
||||
{
|
||||
struct rdtgroup *rdtgrp = data->rdtgrp;
|
||||
enum rdtgrp_mode mode = data->mode;
|
||||
struct resctrl_staged_config *cfg;
|
||||
struct rdt_resource *r = s->res;
|
||||
u32 closid = data->closid;
|
||||
u32 cbm_val;
|
||||
|
||||
cfg = &d->staged_config[s->conf_type];
|
||||
|
|
@ -171,7 +173,7 @@ static int parse_cbm(struct rdt_parse_data *data, struct resctrl_schema *s,
|
|||
* Cannot set up more than one pseudo-locked region in a cache
|
||||
* hierarchy.
|
||||
*/
|
||||
if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP &&
|
||||
if (mode == RDT_MODE_PSEUDO_LOCKSETUP &&
|
||||
rdtgroup_pseudo_locked_in_hierarchy(d)) {
|
||||
rdt_last_cmd_puts("Pseudo-locked region in hierarchy\n");
|
||||
return -EINVAL;
|
||||
|
|
@ -180,8 +182,7 @@ static int parse_cbm(struct rdt_parse_data *data, struct resctrl_schema *s,
|
|||
if (!cbm_validate(data->buf, &cbm_val, r))
|
||||
return -EINVAL;
|
||||
|
||||
if ((rdtgrp->mode == RDT_MODE_EXCLUSIVE ||
|
||||
rdtgrp->mode == RDT_MODE_SHAREABLE) &&
|
||||
if ((mode == RDT_MODE_EXCLUSIVE || mode == RDT_MODE_SHAREABLE) &&
|
||||
rdtgroup_cbm_overlaps_pseudo_locked(d, cbm_val)) {
|
||||
rdt_last_cmd_puts("CBM overlaps with pseudo-locked region\n");
|
||||
return -EINVAL;
|
||||
|
|
@ -191,14 +192,14 @@ static int parse_cbm(struct rdt_parse_data *data, struct resctrl_schema *s,
|
|||
* The CBM may not overlap with the CBM of another closid if
|
||||
* either is exclusive.
|
||||
*/
|
||||
if (rdtgroup_cbm_overlaps(s, d, cbm_val, rdtgrp->closid, true)) {
|
||||
if (rdtgroup_cbm_overlaps(s, d, cbm_val, closid, true)) {
|
||||
rdt_last_cmd_puts("Overlaps with exclusive group\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (rdtgroup_cbm_overlaps(s, d, cbm_val, rdtgrp->closid, false)) {
|
||||
if (rdtgrp->mode == RDT_MODE_EXCLUSIVE ||
|
||||
rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) {
|
||||
if (rdtgroup_cbm_overlaps(s, d, cbm_val, closid, false)) {
|
||||
if (mode == RDT_MODE_EXCLUSIVE ||
|
||||
mode == RDT_MODE_PSEUDO_LOCKSETUP) {
|
||||
rdt_last_cmd_puts("Overlaps with other group\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
@ -262,7 +263,8 @@ next:
|
|||
list_for_each_entry(d, &r->ctrl_domains, hdr.list) {
|
||||
if (d->hdr.id == dom_id) {
|
||||
data.buf = dom;
|
||||
data.rdtgrp = rdtgrp;
|
||||
data.closid = rdtgrp->closid;
|
||||
data.mode = rdtgrp->mode;
|
||||
if (parse_ctrlval(&data, s, d))
|
||||
return -EINVAL;
|
||||
if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue