mirror of https://github.com/torvalds/linux.git
fs/resctrl: Update bit_usage to reflect io_alloc
The "shareable_bits" and "bit_usage" resctrl files associated with cache resources give insight into how instances of a cache is used. Update the annotated capacity bitmasks displayed by "bit_usage" to include the cache portions allocated for I/O via the "io_alloc" feature. "shareable_bits" is a global bitmask of shareable cache with I/O and can thus not present the per-domain I/O allocations possible with the "io_alloc" feature. Revise the "shareable_bits" documentation to direct users to "bit_usage" for accurate cache usage information. 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/e02a0d424129fd7f3e45822a559b1c614ae4652a.1762995456.git.babu.moger@amd.com
This commit is contained in:
parent
28fa2cce7a
commit
ac7de456a3
|
|
@ -96,12 +96,19 @@ related to allocation:
|
||||||
must be set when writing a mask.
|
must be set when writing a mask.
|
||||||
|
|
||||||
"shareable_bits":
|
"shareable_bits":
|
||||||
Bitmask of shareable resource with other executing
|
Bitmask of shareable resource with other executing entities
|
||||||
entities (e.g. I/O). User can use this when
|
(e.g. I/O). Applies to all instances of this resource. User
|
||||||
setting up exclusive cache partitions. Note that
|
can use this when setting up exclusive cache partitions.
|
||||||
some platforms support devices that have their
|
Note that some platforms support devices that have their
|
||||||
own settings for cache use which can over-ride
|
own settings for cache use which can over-ride these bits.
|
||||||
these bits.
|
|
||||||
|
When "io_alloc" is enabled, a portion of each cache instance can
|
||||||
|
be configured for shared use between hardware and software.
|
||||||
|
"bit_usage" should be used to see which portions of each cache
|
||||||
|
instance is configured for hardware use via "io_alloc" feature
|
||||||
|
because every cache instance can have its "io_alloc" bitmask
|
||||||
|
configured independently via "io_alloc_cbm".
|
||||||
|
|
||||||
"bit_usage":
|
"bit_usage":
|
||||||
Annotated capacity bitmasks showing how all
|
Annotated capacity bitmasks showing how all
|
||||||
instances of the resource are used. The legend is:
|
instances of the resource are used. The legend is:
|
||||||
|
|
@ -115,16 +122,16 @@ related to allocation:
|
||||||
"H":
|
"H":
|
||||||
Corresponding region is used by hardware only
|
Corresponding region is used by hardware only
|
||||||
but available for software use. If a resource
|
but available for software use. If a resource
|
||||||
has bits set in "shareable_bits" but not all
|
has bits set in "shareable_bits" or "io_alloc_cbm"
|
||||||
of these bits appear in the resource groups'
|
but not all of these bits appear in the resource
|
||||||
schematas then the bits appearing in
|
groups' schemata then the bits appearing in
|
||||||
"shareable_bits" but no resource group will
|
"shareable_bits" or "io_alloc_cbm" but no
|
||||||
be marked as "H".
|
resource group will be marked as "H".
|
||||||
"X":
|
"X":
|
||||||
Corresponding region is available for sharing and
|
Corresponding region is available for sharing and
|
||||||
used by hardware and software. These are the
|
used by hardware and software. These are the bits
|
||||||
bits that appear in "shareable_bits" as
|
that appear in "shareable_bits" or "io_alloc_cbm"
|
||||||
well as a resource group's allocation.
|
as well as a resource group's allocation.
|
||||||
"S":
|
"S":
|
||||||
Corresponding region is used by software
|
Corresponding region is used by software
|
||||||
and available for sharing.
|
and available for sharing.
|
||||||
|
|
|
||||||
|
|
@ -750,7 +750,7 @@ static int resctrl_io_alloc_init_cbm(struct resctrl_schema *s, u32 closid)
|
||||||
* resource. Note that if Code Data Prioritization (CDP) is enabled, the number
|
* resource. Note that if Code Data Prioritization (CDP) is enabled, the number
|
||||||
* of available CLOSIDs is reduced by half.
|
* of available CLOSIDs is reduced by half.
|
||||||
*/
|
*/
|
||||||
static u32 resctrl_io_alloc_closid(struct rdt_resource *r)
|
u32 resctrl_io_alloc_closid(struct rdt_resource *r)
|
||||||
{
|
{
|
||||||
if (resctrl_arch_get_cdp_enabled(r->rid))
|
if (resctrl_arch_get_cdp_enabled(r->rid))
|
||||||
return resctrl_arch_get_num_closid(r) / 2 - 1;
|
return resctrl_arch_get_num_closid(r) / 2 - 1;
|
||||||
|
|
|
||||||
|
|
@ -442,6 +442,7 @@ 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,
|
ssize_t resctrl_io_alloc_cbm_write(struct kernfs_open_file *of, char *buf,
|
||||||
size_t nbytes, loff_t off);
|
size_t nbytes, loff_t off);
|
||||||
|
u32 resctrl_io_alloc_closid(struct rdt_resource *r);
|
||||||
|
|
||||||
#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);
|
||||||
|
|
|
||||||
|
|
@ -1062,15 +1062,17 @@ static int rdt_bit_usage_show(struct kernfs_open_file *of,
|
||||||
|
|
||||||
cpus_read_lock();
|
cpus_read_lock();
|
||||||
mutex_lock(&rdtgroup_mutex);
|
mutex_lock(&rdtgroup_mutex);
|
||||||
hw_shareable = r->cache.shareable_bits;
|
|
||||||
list_for_each_entry(dom, &r->ctrl_domains, hdr.list) {
|
list_for_each_entry(dom, &r->ctrl_domains, hdr.list) {
|
||||||
if (sep)
|
if (sep)
|
||||||
seq_putc(seq, ';');
|
seq_putc(seq, ';');
|
||||||
|
hw_shareable = r->cache.shareable_bits;
|
||||||
sw_shareable = 0;
|
sw_shareable = 0;
|
||||||
exclusive = 0;
|
exclusive = 0;
|
||||||
seq_printf(seq, "%d=", dom->hdr.id);
|
seq_printf(seq, "%d=", dom->hdr.id);
|
||||||
for (i = 0; i < closids_supported(); i++) {
|
for (i = 0; i < closids_supported(); i++) {
|
||||||
if (!closid_allocated(i))
|
if (!closid_allocated(i) ||
|
||||||
|
(resctrl_arch_get_io_alloc_enabled(r) &&
|
||||||
|
i == resctrl_io_alloc_closid(r)))
|
||||||
continue;
|
continue;
|
||||||
ctrl_val = resctrl_arch_get_config(r, dom, i,
|
ctrl_val = resctrl_arch_get_config(r, dom, i,
|
||||||
s->conf_type);
|
s->conf_type);
|
||||||
|
|
@ -1098,6 +1100,21 @@ static int rdt_bit_usage_show(struct kernfs_open_file *of,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When the "io_alloc" feature is enabled, a portion of the cache
|
||||||
|
* is configured for shared use between hardware and software.
|
||||||
|
* Also, when CDP is enabled the CBMs of CDP_CODE and CDP_DATA
|
||||||
|
* resources are kept in sync. So, the CBMs for "io_alloc" can
|
||||||
|
* be accessed through either resource.
|
||||||
|
*/
|
||||||
|
if (resctrl_arch_get_io_alloc_enabled(r)) {
|
||||||
|
ctrl_val = resctrl_arch_get_config(r, dom,
|
||||||
|
resctrl_io_alloc_closid(r),
|
||||||
|
s->conf_type);
|
||||||
|
hw_shareable |= ctrl_val;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = r->cache.cbm_len - 1; i >= 0; i--) {
|
for (i = r->cache.cbm_len - 1; i >= 0; i--) {
|
||||||
pseudo_locked = dom->plr ? dom->plr->cbm : 0;
|
pseudo_locked = dom->plr ? dom->plr->cbm : 0;
|
||||||
hwb = test_bit(i, &hw_shareable);
|
hwb = test_bit(i, &hw_shareable);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue