diff options
Diffstat (limited to 'arch/x86/kernel/cpu/resctrl/monitor.c')
| -rw-r--r-- | arch/x86/kernel/cpu/resctrl/monitor.c | 50 | 
1 files changed, 33 insertions, 17 deletions
diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c index 57e4bb695ff9..c9f0f3d63f75 100644 --- a/arch/x86/kernel/cpu/resctrl/monitor.c +++ b/arch/x86/kernel/cpu/resctrl/monitor.c @@ -174,7 +174,7 @@ void __check_limbo(struct rdt_domain *d, bool force_free)  	struct rdt_resource *r;  	u32 crmid = 1, nrmid; -	r = &rdt_resources_all[RDT_RESOURCE_L3]; +	r = &rdt_resources_all[RDT_RESOURCE_L3].r_resctrl;  	/*  	 * Skip RMID 0 and start from RMID 1 and check all the RMIDs that @@ -232,7 +232,7 @@ static void add_rmid_to_limbo(struct rmid_entry *entry)  	int cpu;  	u64 val; -	r = &rdt_resources_all[RDT_RESOURCE_L3]; +	r = &rdt_resources_all[RDT_RESOURCE_L3].r_resctrl;  	entry->busy = 0;  	cpu = get_cpu(); @@ -287,6 +287,7 @@ static u64 mbm_overflow_count(u64 prev_msr, u64 cur_msr, unsigned int width)  static u64 __mon_event_count(u32 rmid, struct rmid_read *rr)  { +	struct rdt_hw_resource *hw_res = resctrl_to_arch_res(rr->r);  	struct mbm_state *m;  	u64 chunks, tval; @@ -304,6 +305,12 @@ static u64 __mon_event_count(u32 rmid, struct rmid_read *rr)  	case QOS_L3_MBM_LOCAL_EVENT_ID:  		m = &rr->d->mbm_local[rmid];  		break; +	default: +		/* +		 * Code would never reach here because an invalid +		 * event id would fail the __rmid_read. +		 */ +		return RMID_VAL_ERROR;  	}  	if (rr->first) { @@ -312,7 +319,7 @@ static u64 __mon_event_count(u32 rmid, struct rmid_read *rr)  		return 0;  	} -	chunks = mbm_overflow_count(m->prev_msr, tval, rr->r->mbm_width); +	chunks = mbm_overflow_count(m->prev_msr, tval, hw_res->mbm_width);  	m->chunks += chunks;  	m->prev_msr = tval; @@ -327,7 +334,7 @@ static u64 __mon_event_count(u32 rmid, struct rmid_read *rr)   */  static void mbm_bw_count(u32 rmid, struct rmid_read *rr)  { -	struct rdt_resource *r = &rdt_resources_all[RDT_RESOURCE_L3]; +	struct rdt_hw_resource *hw_res = resctrl_to_arch_res(rr->r);  	struct mbm_state *m = &rr->d->mbm_local[rmid];  	u64 tval, cur_bw, chunks; @@ -335,8 +342,8 @@ static void mbm_bw_count(u32 rmid, struct rmid_read *rr)  	if (tval & (RMID_VAL_ERROR | RMID_VAL_UNAVAIL))  		return; -	chunks = mbm_overflow_count(m->prev_bw_msr, tval, rr->r->mbm_width); -	cur_bw = (get_corrected_mbm_count(rmid, chunks) * r->mon_scale) >> 20; +	chunks = mbm_overflow_count(m->prev_bw_msr, tval, hw_res->mbm_width); +	cur_bw = (get_corrected_mbm_count(rmid, chunks) * hw_res->mon_scale) >> 20;  	if (m->delta_comp)  		m->delta_bw = abs(cur_bw - m->prev_bw); @@ -415,6 +422,8 @@ static void update_mba_bw(struct rdtgroup *rgrp, struct rdt_domain *dom_mbm)  {  	u32 closid, rmid, cur_msr, cur_msr_val, new_msr_val;  	struct mbm_state *pmbm_data, *cmbm_data; +	struct rdt_hw_resource *hw_r_mba; +	struct rdt_hw_domain *hw_dom_mba;  	u32 cur_bw, delta_bw, user_bw;  	struct rdt_resource *r_mba;  	struct rdt_domain *dom_mba; @@ -424,7 +433,8 @@ static void update_mba_bw(struct rdtgroup *rgrp, struct rdt_domain *dom_mbm)  	if (!is_mbm_local_enabled())  		return; -	r_mba = &rdt_resources_all[RDT_RESOURCE_MBA]; +	hw_r_mba = &rdt_resources_all[RDT_RESOURCE_MBA]; +	r_mba = &hw_r_mba->r_resctrl;  	closid = rgrp->closid;  	rmid = rgrp->mon.rmid;  	pmbm_data = &dom_mbm->mbm_local[rmid]; @@ -434,11 +444,16 @@ static void update_mba_bw(struct rdtgroup *rgrp, struct rdt_domain *dom_mbm)  		pr_warn_once("Failure to get domain for MBA update\n");  		return;  	} +	hw_dom_mba = resctrl_to_arch_dom(dom_mba);  	cur_bw = pmbm_data->prev_bw; -	user_bw = dom_mba->mbps_val[closid]; +	user_bw = resctrl_arch_get_config(r_mba, dom_mba, closid, CDP_NONE);  	delta_bw = pmbm_data->delta_bw; -	cur_msr_val = dom_mba->ctrl_val[closid]; +	/* +	 * resctrl_arch_get_config() chooses the mbps/ctrl value to return +	 * based on is_mba_sc(). For now, reach into the hw_dom. +	 */ +	cur_msr_val = hw_dom_mba->ctrl_val[closid];  	/*  	 * For Ctrl groups read data from child monitor groups. @@ -473,9 +488,9 @@ static void update_mba_bw(struct rdtgroup *rgrp, struct rdt_domain *dom_mbm)  		return;  	} -	cur_msr = r_mba->msr_base + closid; +	cur_msr = hw_r_mba->msr_base + closid;  	wrmsrl(cur_msr, delay_bw_map(new_msr_val, r_mba)); -	dom_mba->ctrl_val[closid] = new_msr_val; +	hw_dom_mba->ctrl_val[closid] = new_msr_val;  	/*  	 * Delta values are updated dynamically package wise for each @@ -537,7 +552,7 @@ void cqm_handle_limbo(struct work_struct *work)  	mutex_lock(&rdtgroup_mutex); -	r = &rdt_resources_all[RDT_RESOURCE_L3]; +	r = &rdt_resources_all[RDT_RESOURCE_L3].r_resctrl;  	d = container_of(work, struct rdt_domain, cqm_limbo.work);  	__check_limbo(d, false); @@ -573,7 +588,7 @@ void mbm_handle_overflow(struct work_struct *work)  	if (!static_branch_likely(&rdt_mon_enable_key))  		goto out_unlock; -	r = &rdt_resources_all[RDT_RESOURCE_L3]; +	r = &rdt_resources_all[RDT_RESOURCE_L3].r_resctrl;  	d = container_of(work, struct rdt_domain, mbm_over.work);  	list_for_each_entry(prgrp, &rdt_all_groups, rdtgroup_list) { @@ -670,15 +685,16 @@ static void l3_mon_evt_init(struct rdt_resource *r)  int rdt_get_mon_l3_config(struct rdt_resource *r)  {  	unsigned int mbm_offset = boot_cpu_data.x86_cache_mbm_width_offset; +	struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r);  	unsigned int cl_size = boot_cpu_data.x86_cache_size;  	int ret; -	r->mon_scale = boot_cpu_data.x86_cache_occ_scale; +	hw_res->mon_scale = boot_cpu_data.x86_cache_occ_scale;  	r->num_rmid = boot_cpu_data.x86_cache_max_rmid + 1; -	r->mbm_width = MBM_CNTR_WIDTH_BASE; +	hw_res->mbm_width = MBM_CNTR_WIDTH_BASE;  	if (mbm_offset > 0 && mbm_offset <= MBM_CNTR_WIDTH_OFFSET_MAX) -		r->mbm_width += mbm_offset; +		hw_res->mbm_width += mbm_offset;  	else if (mbm_offset > MBM_CNTR_WIDTH_OFFSET_MAX)  		pr_warn("Ignoring impossible MBM counter offset\n"); @@ -692,7 +708,7 @@ int rdt_get_mon_l3_config(struct rdt_resource *r)  	resctrl_cqm_threshold = cl_size * 1024 / r->num_rmid;  	/* h/w works in units of "boot_cpu_data.x86_cache_occ_scale" */ -	resctrl_cqm_threshold /= r->mon_scale; +	resctrl_cqm_threshold /= hw_res->mon_scale;  	ret = dom_data_init(r);  	if (ret)  | 
