diff options
Diffstat (limited to 'arch/x86/kernel/cpu/resctrl/ctrlmondata.c')
| -rw-r--r-- | arch/x86/kernel/cpu/resctrl/ctrlmondata.c | 75 | 
1 files changed, 52 insertions, 23 deletions
diff --git a/arch/x86/kernel/cpu/resctrl/ctrlmondata.c b/arch/x86/kernel/cpu/resctrl/ctrlmondata.c index 87666275eed9..1dafbdc5ac31 100644 --- a/arch/x86/kernel/cpu/resctrl/ctrlmondata.c +++ b/arch/x86/kernel/cpu/resctrl/ctrlmondata.c @@ -61,6 +61,7 @@ int parse_bw(struct rdt_parse_data *data, struct resctrl_schema *s,  	     struct rdt_domain *d)  {  	struct resctrl_staged_config *cfg; +	u32 closid = data->rdtgrp->closid;  	struct rdt_resource *r = s->res;  	unsigned long bw_val; @@ -72,6 +73,12 @@ int parse_bw(struct rdt_parse_data *data, struct resctrl_schema *s,  	if (!bw_validate(data->buf, &bw_val, r))  		return -EINVAL; + +	if (is_mba_sc(r)) { +		d->mbps_val[closid] = bw_val; +		return 0; +	} +  	cfg->new_ctrl = bw_val;  	cfg->have_new_ctrl = true; @@ -261,14 +268,13 @@ static u32 get_config_index(u32 closid, enum resctrl_conf_type type)  static bool apply_config(struct rdt_hw_domain *hw_dom,  			 struct resctrl_staged_config *cfg, u32 idx, -			 cpumask_var_t cpu_mask, bool mba_sc) +			 cpumask_var_t cpu_mask)  {  	struct rdt_domain *dom = &hw_dom->d_resctrl; -	u32 *dc = !mba_sc ? hw_dom->ctrl_val : hw_dom->mbps_val; -	if (cfg->new_ctrl != dc[idx]) { +	if (cfg->new_ctrl != hw_dom->ctrl_val[idx]) {  		cpumask_set_cpu(cpumask_any(&dom->cpu_mask), cpu_mask); -		dc[idx] = cfg->new_ctrl; +		hw_dom->ctrl_val[idx] = cfg->new_ctrl;  		return true;  	} @@ -276,6 +282,27 @@ static bool apply_config(struct rdt_hw_domain *hw_dom,  	return false;  } +int resctrl_arch_update_one(struct rdt_resource *r, struct rdt_domain *d, +			    u32 closid, enum resctrl_conf_type t, u32 cfg_val) +{ +	struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r); +	struct rdt_hw_domain *hw_dom = resctrl_to_arch_dom(d); +	u32 idx = get_config_index(closid, t); +	struct msr_param msr_param; + +	if (!cpumask_test_cpu(smp_processor_id(), &d->cpu_mask)) +		return -EINVAL; + +	hw_dom->ctrl_val[idx] = cfg_val; + +	msr_param.res = r; +	msr_param.low = idx; +	msr_param.high = idx + 1; +	hw_res->msr_update(d, &msr_param, r); + +	return 0; +} +  int resctrl_arch_update_domains(struct rdt_resource *r, u32 closid)  {  	struct resctrl_staged_config *cfg; @@ -284,14 +311,12 @@ int resctrl_arch_update_domains(struct rdt_resource *r, u32 closid)  	enum resctrl_conf_type t;  	cpumask_var_t cpu_mask;  	struct rdt_domain *d; -	bool mba_sc;  	int cpu;  	u32 idx;  	if (!zalloc_cpumask_var(&cpu_mask, GFP_KERNEL))  		return -ENOMEM; -	mba_sc = is_mba_sc(r);  	msr_param.res = NULL;  	list_for_each_entry(d, &r->domains, list) {  		hw_dom = resctrl_to_arch_dom(d); @@ -301,7 +326,7 @@ int resctrl_arch_update_domains(struct rdt_resource *r, u32 closid)  				continue;  			idx = get_config_index(closid, t); -			if (!apply_config(hw_dom, cfg, idx, cpu_mask, mba_sc)) +			if (!apply_config(hw_dom, cfg, idx, cpu_mask))  				continue;  			if (!msr_param.res) { @@ -315,11 +340,7 @@ int resctrl_arch_update_domains(struct rdt_resource *r, u32 closid)  		}  	} -	/* -	 * Avoid writing the control msr with control values when -	 * MBA software controller is enabled -	 */ -	if (cpumask_empty(cpu_mask) || mba_sc) +	if (cpumask_empty(cpu_mask))  		goto done;  	cpu = get_cpu();  	/* Update resource control msr on this CPU if it's in cpu_mask. */ @@ -406,6 +427,14 @@ ssize_t rdtgroup_schemata_write(struct kernfs_open_file *of,  	list_for_each_entry(s, &resctrl_schema_all, list) {  		r = s->res; + +		/* +		 * Writes to mba_sc resources update the software controller, +		 * not the control MSR. +		 */ +		if (is_mba_sc(r)) +			continue; +  		ret = resctrl_arch_update_domains(r, rdtgrp->closid);  		if (ret)  			goto out; @@ -433,9 +462,7 @@ u32 resctrl_arch_get_config(struct rdt_resource *r, struct rdt_domain *d,  	struct rdt_hw_domain *hw_dom = resctrl_to_arch_dom(d);  	u32 idx = get_config_index(closid, type); -	if (!is_mba_sc(r)) -		return hw_dom->ctrl_val[idx]; -	return hw_dom->mbps_val[idx]; +	return hw_dom->ctrl_val[idx];  }  static void show_doms(struct seq_file *s, struct resctrl_schema *schema, int closid) @@ -450,8 +477,12 @@ static void show_doms(struct seq_file *s, struct resctrl_schema *schema, int clo  		if (sep)  			seq_puts(s, ";"); -		ctrl_val = resctrl_arch_get_config(r, dom, closid, -						   schema->conf_type); +		if (is_mba_sc(r)) +			ctrl_val = dom->mbps_val[closid]; +		else +			ctrl_val = resctrl_arch_get_config(r, dom, closid, +							   schema->conf_type); +  		seq_printf(s, r->format_str, dom->id, max_data_width,  			   ctrl_val);  		sep = true; @@ -518,7 +549,6 @@ void mon_event_read(struct rmid_read *rr, struct rdt_resource *r,  int rdtgroup_mondata_show(struct seq_file *m, void *arg)  {  	struct kernfs_open_file *of = m->private; -	struct rdt_hw_resource *hw_res;  	u32 resid, evtid, domid;  	struct rdtgroup *rdtgrp;  	struct rdt_resource *r; @@ -538,8 +568,7 @@ int rdtgroup_mondata_show(struct seq_file *m, void *arg)  	domid = md.u.domid;  	evtid = md.u.evtid; -	hw_res = &rdt_resources_all[resid]; -	r = &hw_res->r_resctrl; +	r = &rdt_resources_all[resid].r_resctrl;  	d = rdt_find_domain(r, domid, NULL);  	if (IS_ERR_OR_NULL(d)) {  		ret = -ENOENT; @@ -548,12 +577,12 @@ int rdtgroup_mondata_show(struct seq_file *m, void *arg)  	mon_event_read(&rr, r, d, rdtgrp, evtid, false); -	if (rr.val & RMID_VAL_ERROR) +	if (rr.err == -EIO)  		seq_puts(m, "Error\n"); -	else if (rr.val & RMID_VAL_UNAVAIL) +	else if (rr.err == -EINVAL)  		seq_puts(m, "Unavailable\n");  	else -		seq_printf(m, "%llu\n", rr.val * hw_res->mon_scale); +		seq_printf(m, "%llu\n", rr.val);  out:  	rdtgroup_kn_unlock(of->kn);  |