mirror of https://github.com/torvalds/linux.git
fs/resctrl: Introduce interface to modify io_alloc capacity bitmasks
The io_alloc feature in resctrl enables system software to configure the portion of the cache allocated for I/O traffic. When supported, the io_alloc_cbm file in resctrl provides access to capacity bitmasks (CBMs) allocated for I/O devices. Enable users to modify io_alloc CBMs by writing to the io_alloc_cbm resctrl file when the io_alloc feature is enabled. Mirror the CBMs between CDP_CODE and CDP_DATA when CDP is enabled to present consistent I/O allocation information to user space. 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/67609641b03ccfba18a8ee0bf9dbd1f3dcbecda3.1762995456.git.babu.moger@amd.com
This commit is contained in:
parent
af1242eeca
commit
28fa2cce7a
|
|
@ -196,6 +196,18 @@ related to allocation:
|
||||||
# cat /sys/fs/resctrl/info/L3/io_alloc_cbm
|
# cat /sys/fs/resctrl/info/L3/io_alloc_cbm
|
||||||
0=ffff;1=ffff
|
0=ffff;1=ffff
|
||||||
|
|
||||||
|
CBMs can be configured by writing to the interface.
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
# echo 1=ff > /sys/fs/resctrl/info/L3/io_alloc_cbm
|
||||||
|
# cat /sys/fs/resctrl/info/L3/io_alloc_cbm
|
||||||
|
0=ffff;1=00ff
|
||||||
|
|
||||||
|
# echo "0=ff;1=f" > /sys/fs/resctrl/info/L3/io_alloc_cbm
|
||||||
|
# cat /sys/fs/resctrl/info/L3/io_alloc_cbm
|
||||||
|
0=00ff;1=000f
|
||||||
|
|
||||||
When CDP is enabled "io_alloc_cbm" associated with the CDP_DATA and CDP_CODE
|
When CDP is enabled "io_alloc_cbm" associated with the CDP_DATA and CDP_CODE
|
||||||
resources may reflect the same values. For example, values read from and
|
resources may reflect the same values. For example, values read from and
|
||||||
written to /sys/fs/resctrl/info/L3DATA/io_alloc_cbm may be reflected by
|
written to /sys/fs/resctrl/info/L3DATA/io_alloc_cbm may be reflected by
|
||||||
|
|
|
||||||
|
|
@ -864,3 +864,96 @@ int resctrl_io_alloc_cbm_show(struct kernfs_open_file *of, struct seq_file *seq,
|
||||||
cpus_read_unlock();
|
cpus_read_unlock();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int resctrl_io_alloc_parse_line(char *line, struct rdt_resource *r,
|
||||||
|
struct resctrl_schema *s, u32 closid)
|
||||||
|
{
|
||||||
|
enum resctrl_conf_type peer_type;
|
||||||
|
struct rdt_parse_data data;
|
||||||
|
struct rdt_ctrl_domain *d;
|
||||||
|
char *dom = NULL, *id;
|
||||||
|
unsigned long dom_id;
|
||||||
|
|
||||||
|
next:
|
||||||
|
if (!line || line[0] == '\0')
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
dom = strsep(&line, ";");
|
||||||
|
id = strsep(&dom, "=");
|
||||||
|
if (!dom || kstrtoul(id, 10, &dom_id)) {
|
||||||
|
rdt_last_cmd_puts("Missing '=' or non-numeric domain\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
dom = strim(dom);
|
||||||
|
list_for_each_entry(d, &r->ctrl_domains, hdr.list) {
|
||||||
|
if (d->hdr.id == dom_id) {
|
||||||
|
data.buf = dom;
|
||||||
|
data.mode = RDT_MODE_SHAREABLE;
|
||||||
|
data.closid = closid;
|
||||||
|
if (parse_cbm(&data, s, d))
|
||||||
|
return -EINVAL;
|
||||||
|
/*
|
||||||
|
* Keep io_alloc CLOSID's CBM of CDP_CODE and CDP_DATA
|
||||||
|
* in sync.
|
||||||
|
*/
|
||||||
|
if (resctrl_arch_get_cdp_enabled(r->rid)) {
|
||||||
|
peer_type = resctrl_peer_type(s->conf_type);
|
||||||
|
memcpy(&d->staged_config[peer_type],
|
||||||
|
&d->staged_config[s->conf_type],
|
||||||
|
sizeof(d->staged_config[0]));
|
||||||
|
}
|
||||||
|
goto next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t resctrl_io_alloc_cbm_write(struct kernfs_open_file *of, char *buf,
|
||||||
|
size_t nbytes, loff_t off)
|
||||||
|
{
|
||||||
|
struct resctrl_schema *s = rdt_kn_parent_priv(of->kn);
|
||||||
|
struct rdt_resource *r = s->res;
|
||||||
|
u32 io_alloc_closid;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
/* Valid input requires a trailing newline */
|
||||||
|
if (nbytes == 0 || buf[nbytes - 1] != '\n')
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
buf[nbytes - 1] = '\0';
|
||||||
|
|
||||||
|
cpus_read_lock();
|
||||||
|
mutex_lock(&rdtgroup_mutex);
|
||||||
|
rdt_last_cmd_clear();
|
||||||
|
|
||||||
|
if (!r->cache.io_alloc_capable) {
|
||||||
|
rdt_last_cmd_printf("io_alloc is not supported on %s\n", s->name);
|
||||||
|
ret = -ENODEV;
|
||||||
|
goto out_unlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!resctrl_arch_get_io_alloc_enabled(r)) {
|
||||||
|
rdt_last_cmd_printf("io_alloc is not enabled on %s\n", s->name);
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto out_unlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
io_alloc_closid = resctrl_io_alloc_closid(r);
|
||||||
|
|
||||||
|
rdt_staged_configs_clear();
|
||||||
|
ret = resctrl_io_alloc_parse_line(buf, r, s, io_alloc_closid);
|
||||||
|
if (ret)
|
||||||
|
goto out_clear_configs;
|
||||||
|
|
||||||
|
ret = resctrl_arch_update_domains(r, io_alloc_closid);
|
||||||
|
|
||||||
|
out_clear_configs:
|
||||||
|
rdt_staged_configs_clear();
|
||||||
|
out_unlock:
|
||||||
|
mutex_unlock(&rdtgroup_mutex);
|
||||||
|
cpus_read_unlock();
|
||||||
|
|
||||||
|
return ret ?: nbytes;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -440,6 +440,8 @@ ssize_t resctrl_io_alloc_write(struct kernfs_open_file *of, char *buf,
|
||||||
const char *rdtgroup_name_by_closid(u32 closid);
|
const char *rdtgroup_name_by_closid(u32 closid);
|
||||||
int resctrl_io_alloc_cbm_show(struct kernfs_open_file *of, struct seq_file *seq,
|
int resctrl_io_alloc_cbm_show(struct kernfs_open_file *of, struct seq_file *seq,
|
||||||
void *v);
|
void *v);
|
||||||
|
ssize_t resctrl_io_alloc_cbm_write(struct kernfs_open_file *of, char *buf,
|
||||||
|
size_t nbytes, loff_t off);
|
||||||
|
|
||||||
#ifdef CONFIG_RESCTRL_FS_PSEUDO_LOCK
|
#ifdef CONFIG_RESCTRL_FS_PSEUDO_LOCK
|
||||||
int rdtgroup_locksetup_enter(struct rdtgroup *rdtgrp);
|
int rdtgroup_locksetup_enter(struct rdtgroup *rdtgrp);
|
||||||
|
|
|
||||||
|
|
@ -1973,9 +1973,10 @@ static struct rftype res_common_files[] = {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "io_alloc_cbm",
|
.name = "io_alloc_cbm",
|
||||||
.mode = 0444,
|
.mode = 0644,
|
||||||
.kf_ops = &rdtgroup_kf_single_ops,
|
.kf_ops = &rdtgroup_kf_single_ops,
|
||||||
.seq_show = resctrl_io_alloc_cbm_show,
|
.seq_show = resctrl_io_alloc_cbm_show,
|
||||||
|
.write = resctrl_io_alloc_cbm_write,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "max_threshold_occupancy",
|
.name = "max_threshold_occupancy",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue