[RFC PATCH 3/3] fs/resctrl: display size for scalar cache controls

From: Ben Horgan

Date: Mon Sep 21 2026 - 10:06:00 EST


resctrl allows controls specifying a minimum or maximum cache allocation
but does not display their sizes in the 'size' file.

Calculate the size of any scalar cache controls and add them to the 'size' file.

Signed-off-by: Ben Horgan <ben.horgan@xxxxxxx>
---
fs/resctrl/internal.h | 4 ++--
fs/resctrl/pseudo_lock.c | 2 +-
fs/resctrl/rdtgroup.c | 41 +++++++++++++++++++++++++++-------------
3 files changed, 31 insertions(+), 16 deletions(-)

diff --git a/fs/resctrl/internal.h b/fs/resctrl/internal.h
index 4bd09b1541c7..119f702a4f1f 100644
--- a/fs/resctrl/internal.h
+++ b/fs/resctrl/internal.h
@@ -362,8 +362,8 @@ bool rdtgroup_cbm_overlaps(struct rdt_resource_final *f, struct rdt_ctrl_domain
unsigned long cbm, int closid, bool exclusive,
struct resctrl_ctrl *ctrl);

-unsigned int rdtgroup_cbm_to_size(struct rdt_resource *r, struct resctrl_ctrl *ctrl,
- struct rdt_ctrl_domain *d, unsigned long cbm);
+unsigned int rdtgroup_cache_ctrl_to_size(struct rdt_resource *r, struct resctrl_ctrl *ctrl,
+ struct rdt_ctrl_domain *d, unsigned long ctrl_val);

enum rdtgrp_mode rdtgroup_mode_by_closid(int closid);

diff --git a/fs/resctrl/pseudo_lock.c b/fs/resctrl/pseudo_lock.c
index 17b99a075eaf..36881491d074 100644
--- a/fs/resctrl/pseudo_lock.c
+++ b/fs/resctrl/pseudo_lock.c
@@ -255,7 +255,7 @@ static int pseudo_lock_region_init(struct pseudo_lock_region *plr)
ci = get_cpu_cacheinfo_level(plr->cpu, scope);
if (ci) {
plr->line_size = ci->coherency_line_size;
- plr->size = rdtgroup_cbm_to_size(plr->f->res, ctrl, plr->d, plr->cbm);
+ plr->size = rdtgroup_cache_ctrl_to_size(plr->f->res, ctrl, plr->d, plr->cbm);
return 0;
}

diff --git a/fs/resctrl/rdtgroup.c b/fs/resctrl/rdtgroup.c
index deb47edb2e87..ab0d8d0454f6 100644
--- a/fs/resctrl/rdtgroup.c
+++ b/fs/resctrl/rdtgroup.c
@@ -1751,20 +1751,27 @@ static ssize_t rdtgroup_mode_write(struct kernfs_open_file *of,
*
* Return: Size (in bytes) of cache portion represented by CBM, 0 on failure.
*/
-unsigned int rdtgroup_cbm_to_size(struct rdt_resource *r, struct resctrl_ctrl *ctrl,
- struct rdt_ctrl_domain *d, unsigned long cbm)
+unsigned int rdtgroup_cache_ctrl_to_size(struct rdt_resource *r, struct resctrl_ctrl *ctrl,
+ struct rdt_ctrl_domain *d, unsigned long ctrl_val)
{
unsigned int size = 0;
struct cacheinfo *ci;
- int num_b;

if (WARN_ON_ONCE(r->ctrl_scope != RESCTRL_L2_CACHE && r->ctrl_scope != RESCTRL_L3_CACHE))
return size;

- num_b = bitmap_weight(&cbm, ctrl->bitmap.cbm_len);
ci = get_cpu_cacheinfo_level(cpumask_any(&d->hdr.cpu_mask), r->ctrl_scope);
- if (ci)
+ if (!ci)
+ return size;
+
+ if (ctrl->type == RESCTRL_CTRL_BITMAP) {
+ int num_b;
+
+ num_b = bitmap_weight(&ctrl_val, ctrl->bitmap.cbm_len);
size = ci->size / ctrl->bitmap.cbm_len * num_b;
+ } else {
+ size = ci->size / ctrl->scalar.resolution * ctrl->scalar.scale * ctrl_val;
+ }

return size;
}
@@ -1834,10 +1841,10 @@ static int rdtgroup_size_show(struct kernfs_open_file *of,
}
seq_printf(s, "%*s:", max_name_width,
rdtgrp->plr->f->name);
- size = rdtgroup_cbm_to_size(rdtgrp->plr->f->res,
- ctrl,
- rdtgrp->plr->d,
- rdtgrp->plr->cbm);
+ size = rdtgroup_cache_ctrl_to_size(rdtgrp->plr->f->res,
+ ctrl,
+ rdtgrp->plr->d,
+ rdtgrp->plr->cbm);
seq_printf(s, "%d=%u\n", rdtgrp->plr->d->hdr.id, size);
}
goto out;
@@ -1863,11 +1870,19 @@ static int rdtgroup_size_show(struct kernfs_open_file *of,
ctrl_val = resctrl_arch_get_config(r, ctrl, d,
closid,
type);
- if (r->rid == RDT_RESOURCE_MBA ||
- r->rid == RDT_RESOURCE_SMBA)
+ switch (r->rid) {
+ case RDT_RESOURCE_L3:
+ case RDT_RESOURCE_L2:
+ size = rdtgroup_cache_ctrl_to_size(r, ctrl, d,
+ ctrl_val);
+ break;
+ case RDT_RESOURCE_MBA:
+ case RDT_RESOURCE_SMBA:
size = ctrl_val;
- else
- size = rdtgroup_cbm_to_size(r, ctrl, d, ctrl_val);
+ break;
+ case RDT_RESOURCE_PERF_PKG:
+ size = 0;
+ }
}
seq_printf(s, "%d=%u", d->hdr.id, size);
sep = true;
--
2.43.0