Commit 48068e56 authored by Babu Moger's avatar Babu Moger Committed by Borislav Petkov (AMD)
Browse files

fs/resctrl: Introduce interface to display "io_alloc" support



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: default avatarBabu Moger <babu.moger@amd.com>
Signed-off-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: default avatarReinette Chatre <reinette.chatre@intel.com>
Link: https://patch.msgid.link/e8b116a8f424128b227734bb1d433c14af478d90.1762995456.git.babu.moger@amd.com
parent 556d2892
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -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:

+21 −0
Original line number Diff line number Diff line
@@ -676,3 +676,24 @@ int rdtgroup_mondata_show(struct seq_file *m, void *arg)
	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;
}
+1 −0
Original line number Diff line number Diff line
@@ -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);
+22 −0
Original line number Diff line number Diff line
@@ -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;