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

x86,fs/resctrl: Consolidate monitoring related data from rdt_resource



The cache allocation and memory bandwidth allocation feature properties are
consolidated into struct resctrl_cache and struct resctrl_membw respectively.

In preparation for more monitoring properties that will clobber the existing
resource struct more, re-organize the monitoring specific properties to also
be in a separate structure.

Also convert "bandwidth sources" terminology to "memory transactions" to have
consistency within resctrl for related monitoring features.

  [ bp: Massage commit message. ]

Suggested-by: default avatarReinette Chatre <reinette.chatre@intel.com>
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://lore.kernel.org/cover.1757108044.git.babu.moger@amd.com
parent bebf57bf
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -107,7 +107,7 @@ u32 resctrl_arch_system_num_rmid_idx(void)
	struct rdt_resource *r = &rdt_resources_all[RDT_RESOURCE_L3].r_resctrl;

	/* RMID are independent numbers for x86. num_rmid_idx == num_rmid */
	return r->num_rmid;
	return r->mon.num_rmid;
}

struct rdt_resource *resctrl_arch_get_resource(enum resctrl_res_level l)
@@ -541,7 +541,7 @@ static void domain_add_cpu_mon(int cpu, struct rdt_resource *r)

	arch_mon_domain_online(r, d);

	if (arch_domain_mbm_alloc(r->num_rmid, hw_dom)) {
	if (arch_domain_mbm_alloc(r->mon.num_rmid, hw_dom)) {
		mon_domain_free(hw_dom);
		return;
	}
+5 −5
Original line number Diff line number Diff line
@@ -130,7 +130,7 @@ static int logical_rmid_to_physical_rmid(int cpu, int lrmid)
	if (snc_nodes_per_l3_cache == 1)
		return lrmid;

	return lrmid + (cpu_to_node(cpu) % snc_nodes_per_l3_cache) * r->num_rmid;
	return lrmid + (cpu_to_node(cpu) % snc_nodes_per_l3_cache) * r->mon.num_rmid;
}

static int __rmid_read_phys(u32 prmid, enum resctrl_event_id eventid, u64 *val)
@@ -205,7 +205,7 @@ void resctrl_arch_reset_rmid_all(struct rdt_resource *r, struct rdt_mon_domain *
			continue;
		idx = MBM_STATE_IDX(eventid);
		memset(hw_dom->arch_mbm_states[idx], 0,
		       sizeof(*hw_dom->arch_mbm_states[0]) * r->num_rmid);
		       sizeof(*hw_dom->arch_mbm_states[0]) * r->mon.num_rmid);
	}
}

@@ -344,7 +344,7 @@ int __init rdt_get_mon_l3_config(struct rdt_resource *r)

	resctrl_rmid_realloc_limit = boot_cpu_data.x86_cache_size * 1024;
	hw_res->mon_scale = boot_cpu_data.x86_cache_occ_scale / snc_nodes_per_l3_cache;
	r->num_rmid = (boot_cpu_data.x86_cache_max_rmid + 1) / snc_nodes_per_l3_cache;
	r->mon.num_rmid = (boot_cpu_data.x86_cache_max_rmid + 1) / snc_nodes_per_l3_cache;
	hw_res->mbm_width = MBM_CNTR_WIDTH_BASE;

	if (mbm_offset > 0 && mbm_offset <= MBM_CNTR_WIDTH_OFFSET_MAX)
@@ -359,7 +359,7 @@ int __init rdt_get_mon_l3_config(struct rdt_resource *r)
	 *
	 * For a 35MB LLC and 56 RMIDs, this is ~1.8% of the LLC.
	 */
	threshold = resctrl_rmid_realloc_limit / r->num_rmid;
	threshold = resctrl_rmid_realloc_limit / r->mon.num_rmid;

	/*
	 * Because num_rmid may not be a power of two, round the value
@@ -373,7 +373,7 @@ int __init rdt_get_mon_l3_config(struct rdt_resource *r)

		/* Detect list of bandwidth sources that can be tracked */
		cpuid_count(0x80000020, 3, &eax, &ebx, &ecx, &edx);
		r->mbm_cfg_mask = ecx & MAX_EVT_CONFIG_BITS;
		r->mon.mbm_cfg_mask = ecx & MAX_EVT_CONFIG_BITS;
	}

	r->mon_capable = true;
+3 −3
Original line number Diff line number Diff line
@@ -1135,7 +1135,7 @@ static int rdt_num_rmids_show(struct kernfs_open_file *of,
{
	struct rdt_resource *r = rdt_kn_parent_priv(of->kn);

	seq_printf(seq, "%d\n", r->num_rmid);
	seq_printf(seq, "%d\n", r->mon.num_rmid);

	return 0;
}
@@ -1731,9 +1731,9 @@ static int mon_config_write(struct rdt_resource *r, char *tok, u32 evtid)
	}

	/* Value from user cannot be more than the supported set of events */
	if ((val & r->mbm_cfg_mask) != val) {
	if ((val & r->mon.mbm_cfg_mask) != val) {
		rdt_last_cmd_printf("Invalid event configuration: max valid mask is 0x%02x\n",
				    r->mbm_cfg_mask);
				    r->mon.mbm_cfg_mask);
		return -EINVAL;
	}

+13 −5
Original line number Diff line number Diff line
@@ -255,38 +255,46 @@ enum resctrl_schema_fmt {
	RESCTRL_SCHEMA_RANGE,
};

/**
 * struct resctrl_mon - Monitoring related data of a resctrl resource.
 * @num_rmid:		Number of RMIDs available.
 * @mbm_cfg_mask:	Memory transactions that can be tracked when bandwidth
 *			monitoring events can be configured.
 */
struct resctrl_mon {
	int			num_rmid;
	unsigned int		mbm_cfg_mask;
};

/**
 * struct rdt_resource - attributes of a resctrl resource
 * @rid:		The index of the resource
 * @alloc_capable:	Is allocation available on this machine
 * @mon_capable:	Is monitor feature available on this machine
 * @num_rmid:		Number of RMIDs available
 * @ctrl_scope:		Scope of this resource for control functions
 * @mon_scope:		Scope of this resource for monitor functions
 * @cache:		Cache allocation related data
 * @membw:		If the component has bandwidth controls, their properties.
 * @mon:		Monitoring related data.
 * @ctrl_domains:	RCU list of all control domains for this resource
 * @mon_domains:	RCU list of all monitor domains for this resource
 * @name:		Name to use in "schemata" file.
 * @schema_fmt:		Which format string and parser is used for this schema.
 * @mbm_cfg_mask:	Bandwidth sources that can be tracked when bandwidth
 *			monitoring events can be configured.
 * @cdp_capable:	Is the CDP feature available on this resource
 */
struct rdt_resource {
	int			rid;
	bool			alloc_capable;
	bool			mon_capable;
	int			num_rmid;
	enum resctrl_scope	ctrl_scope;
	enum resctrl_scope	mon_scope;
	struct resctrl_cache	cache;
	struct resctrl_membw	membw;
	struct resctrl_mon	mon;
	struct list_head	ctrl_domains;
	struct list_head	mon_domains;
	char			*name;
	enum resctrl_schema_fmt	schema_fmt;
	unsigned int		mbm_cfg_mask;
	bool			cdp_capable;
};