]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
fs/resctrl: Introduce interface to display "io_alloc" support
authorBabu Moger <babu.moger@amd.com>
Thu, 13 Nov 2025 00:57:31 +0000 (18:57 -0600)
committerBorislav Petkov (AMD) <bp@alien8.de>
Fri, 21 Nov 2025 21:49:42 +0000 (22:49 +0100)
Introduce the "io_alloc" resctrl file to the "info" area of a cache resource,
for example /sys/fs/resctrl/info/L3/io_alloc. "io_alloc" indicates support for
the "io_alloc" feature that allows direct insertion of data from I/O
devices into the cache.

Restrict exposing support for "io_alloc" to the L3 resource that is the only
resource where this feature can be backed by AMD's L3 Smart Data Cache
Injection Allocation Enforcement (SDCIAE). With that, the "io_alloc" file is
only visible to user space if the L3 resource supports "io_alloc".

Doing so makes the file visible for all cache resources though, for example
also L2 cache (if it supports cache allocation). As a consequence, add
capability for file to report expected "enabled" and "disabled", as well as
"not supported".

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/e8b116a8f424128b227734bb1d433c14af478d90.1762995456.git.babu.moger@amd.com
Documentation/filesystems/resctrl.rst
fs/resctrl/ctrlmondata.c
fs/resctrl/internal.h
fs/resctrl/rdtgroup.c

index d7a51cae6b26fd07d41e27041a97ff1b6a5c2216..108995640ca51daafd95dfc386869ea02818e157 100644 (file)
@@ -137,6 +137,21 @@ related to allocation:
                        "1":
                              Non-contiguous 1s value in CBM is supported.
 
+"io_alloc":
+               "io_alloc" enables system software to configure the portion of
+               the cache allocated for I/O traffic. File may only exist if the
+               system supports this feature on some of its cache resources.
+
+                       "disabled":
+                             Resource supports "io_alloc" but the feature is disabled.
+                             Portions of cache used for allocation of I/O traffic cannot
+                             be configured.
+                       "enabled":
+                             Portions of cache used for allocation of I/O traffic
+                             can be configured using "io_alloc_cbm".
+                       "not supported":
+                             Support not available for this resource.
+
 Memory bandwidth(MB) subdirectory contains the following files
 with respect to allocation:
 
index 0d0ef54fc4de1fed2d38548c76dfd779ae1672c0..78a8e7b4ba242b76d11056e9c70f4d6b797ee871 100644 (file)
@@ -676,3 +676,24 @@ out:
        rdtgroup_kn_unlock(of->kn);
        return ret;
 }
+
+int resctrl_io_alloc_show(struct kernfs_open_file *of, struct seq_file *seq, void *v)
+{
+       struct resctrl_schema *s = rdt_kn_parent_priv(of->kn);
+       struct rdt_resource *r = s->res;
+
+       mutex_lock(&rdtgroup_mutex);
+
+       if (r->cache.io_alloc_capable) {
+               if (resctrl_arch_get_io_alloc_enabled(r))
+                       seq_puts(seq, "enabled\n");
+               else
+                       seq_puts(seq, "disabled\n");
+       } else {
+               seq_puts(seq, "not supported\n");
+       }
+
+       mutex_unlock(&rdtgroup_mutex);
+
+       return 0;
+}
index cf1fd82dc5a99ef2aa05be26b3e8e66b609fbe52..a18ed88893963208d942119c0faf11099423c68e 100644 (file)
@@ -426,6 +426,7 @@ int mbm_L3_assignments_show(struct kernfs_open_file *of, struct seq_file *s, voi
 
 ssize_t mbm_L3_assignments_write(struct kernfs_open_file *of, char *buf, size_t nbytes,
                                 loff_t off);
+int resctrl_io_alloc_show(struct kernfs_open_file *of, struct seq_file *seq, void *v);
 
 #ifdef CONFIG_RESCTRL_FS_PSEUDO_LOCK
 int rdtgroup_locksetup_enter(struct rdtgroup *rdtgrp);
index 41ce4b377af42834b1a899441cf22336084c88cd..c1a603bb0c798a225da3448c200839dc5aaf6a0c 100644 (file)
@@ -1947,6 +1947,12 @@ static struct rftype res_common_files[] = {
                .kf_ops         = &rdtgroup_kf_single_ops,
                .seq_show       = rdt_thread_throttle_mode_show,
        },
+       {
+               .name           = "io_alloc",
+               .mode           = 0444,
+               .kf_ops         = &rdtgroup_kf_single_ops,
+               .seq_show       = resctrl_io_alloc_show,
+       },
        {
                .name           = "max_threshold_occupancy",
                .mode           = 0644,
@@ -2138,6 +2144,20 @@ static void thread_throttle_mode_init(void)
                                 RFTYPE_CTRL_INFO | RFTYPE_RES_MB);
 }
 
+/*
+ * The resctrl file "io_alloc" is added using L3 resource. However, it results
+ * in this file being visible for *all* cache resources (eg. L2 cache),
+ * whether it supports "io_alloc" or not.
+ */
+static void io_alloc_init(void)
+{
+       struct rdt_resource *r = resctrl_arch_get_resource(RDT_RESOURCE_L3);
+
+       if (r->cache.io_alloc_capable)
+               resctrl_file_fflags_init("io_alloc", RFTYPE_CTRL_INFO |
+                                        RFTYPE_RES_CACHE);
+}
+
 void resctrl_file_fflags_init(const char *config, unsigned long fflags)
 {
        struct rftype *rft;
@@ -4409,6 +4429,8 @@ int resctrl_init(void)
 
        thread_throttle_mode_init();
 
+       io_alloc_init();
+
        ret = resctrl_mon_resource_init();
        if (ret)
                return ret;