]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
fs/resctrl: Modify struct rdt_parse_data to pass mode and CLOSID
authorBabu Moger <babu.moger@amd.com>
Thu, 13 Nov 2025 00:57:34 +0000 (18:57 -0600)
committerBorislav Petkov (AMD) <bp@alien8.de>
Sat, 22 Nov 2025 12:10:12 +0000 (13:10 +0100)
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
fs/resctrl/ctrlmondata.c

index 1ac89b107e6f12cf2a7e8e3e13293b916490b030..c43bedea70d7a1357128afb3a13d8d6c94e8e196 100644 (file)
@@ -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) {