mirror of
https://github.com/torvalds/linux.git
synced 2026-05-23 06:31:58 +02:00
x86/resctrl: Refactor resctrl_arch_rmid_read()
resctrl_arch_rmid_read() adjusts the value obtained from MSR_IA32_QM_CTR to account for the overflow for MBM events and apply counter scaling for all the events. This logic is common to both reading an RMID and reading a hardware counter directly. Refactor the hardware value adjustment logic into get_corrected_val() to prepare for support of reading a hardware counter. 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://lore.kernel.org/cover.1757108044.git.babu.moger@amd.com
This commit is contained in:
parent
862314fd1f
commit
7c9ac605e2
|
|
@ -217,24 +217,13 @@ static u64 mbm_overflow_count(u64 prev_msr, u64 cur_msr, unsigned int width)
|
|||
return chunks >> shift;
|
||||
}
|
||||
|
||||
int resctrl_arch_rmid_read(struct rdt_resource *r, struct rdt_mon_domain *d,
|
||||
u32 unused, u32 rmid, enum resctrl_event_id eventid,
|
||||
u64 *val, void *ignored)
|
||||
static u64 get_corrected_val(struct rdt_resource *r, struct rdt_mon_domain *d,
|
||||
u32 rmid, enum resctrl_event_id eventid, u64 msr_val)
|
||||
{
|
||||
struct rdt_hw_mon_domain *hw_dom = resctrl_to_arch_mon_dom(d);
|
||||
struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r);
|
||||
int cpu = cpumask_any(&d->hdr.cpu_mask);
|
||||
struct arch_mbm_state *am;
|
||||
u64 msr_val, chunks;
|
||||
u32 prmid;
|
||||
int ret;
|
||||
|
||||
resctrl_arch_rmid_read_context_check();
|
||||
|
||||
prmid = logical_rmid_to_physical_rmid(cpu, rmid);
|
||||
ret = __rmid_read_phys(prmid, eventid, &msr_val);
|
||||
if (ret)
|
||||
return ret;
|
||||
u64 chunks;
|
||||
|
||||
am = get_arch_mbm_state(hw_dom, rmid, eventid);
|
||||
if (am) {
|
||||
|
|
@ -246,7 +235,26 @@ int resctrl_arch_rmid_read(struct rdt_resource *r, struct rdt_mon_domain *d,
|
|||
chunks = msr_val;
|
||||
}
|
||||
|
||||
*val = chunks * hw_res->mon_scale;
|
||||
return chunks * hw_res->mon_scale;
|
||||
}
|
||||
|
||||
int resctrl_arch_rmid_read(struct rdt_resource *r, struct rdt_mon_domain *d,
|
||||
u32 unused, u32 rmid, enum resctrl_event_id eventid,
|
||||
u64 *val, void *ignored)
|
||||
{
|
||||
int cpu = cpumask_any(&d->hdr.cpu_mask);
|
||||
u64 msr_val;
|
||||
u32 prmid;
|
||||
int ret;
|
||||
|
||||
resctrl_arch_rmid_read_context_check();
|
||||
|
||||
prmid = logical_rmid_to_physical_rmid(cpu, rmid);
|
||||
ret = __rmid_read_phys(prmid, eventid, &msr_val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
*val = get_corrected_val(r, d, rmid, eventid, msr_val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user