diff options
author | 2022-09-02 15:48:29 +0000 | |
---|---|---|
committer | 2022-09-23 14:25:05 +0200 | |
commit | f7b1843eca6fe295ba0c71fc02a3291954078f2b (patch) | |
tree | 7b336d7b8a0a40a54c3bfa67ed8092b6e8acb4e3 /arch/x86/kernel/cpu/resctrl/monitor.c | |
parent | x86/resctrl: Add resctrl_rmid_realloc_limit to abstract x86's boot_cpu_data (diff) | |
download | wireguard-linux-f7b1843eca6fe295ba0c71fc02a3291954078f2b.tar.xz wireguard-linux-f7b1843eca6fe295ba0c71fc02a3291954078f2b.zip |
x86/resctrl: Make resctrl_arch_rmid_read() return values in bytes
resctrl_arch_rmid_read() returns a value in chunks, as read from the
hardware. This needs scaling to bytes by mon_scale, as provided by
the architecture code.
Now that resctrl_arch_rmid_read() performs the overflow and corrections
itself, it may as well return a value in bytes directly. This allows
the accesses to the architecture specific 'hw' structure to be removed.
Move the mon_scale conversion into resctrl_arch_rmid_read().
mbm_bw_count() is updated to calculate bandwidth from bytes.
Signed-off-by: James Morse <james.morse@arm.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Jamie Iles <quic_jiles@quicinc.com>
Reviewed-by: Shaopeng Tan <tan.shaopeng@fujitsu.com>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Tested-by: Xin Hao <xhao@linux.alibaba.com>
Tested-by: Shaopeng Tan <tan.shaopeng@fujitsu.com>
Tested-by: Cristian Marussi <cristian.marussi@arm.com>
Link: https://lore.kernel.org/r/20220902154829.30399-22-james.morse@arm.com
Diffstat (limited to 'arch/x86/kernel/cpu/resctrl/monitor.c')
-rw-r--r-- | arch/x86/kernel/cpu/resctrl/monitor.c | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c index 8d15568d7121..efe0c30d3a12 100644 --- a/arch/x86/kernel/cpu/resctrl/monitor.c +++ b/arch/x86/kernel/cpu/resctrl/monitor.c @@ -16,6 +16,7 @@ */ #include <linux/module.h> +#include <linux/sizes.h> #include <linux/slab.h> #include <asm/cpu_device_id.h> @@ -189,7 +190,7 @@ int resctrl_arch_rmid_read(struct rdt_resource *r, struct rdt_domain *d, struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r); struct rdt_hw_domain *hw_dom = resctrl_to_arch_dom(d); struct arch_mbm_state *am; - u64 msr_val; + u64 msr_val, chunks; if (!cpumask_test_cpu(smp_processor_id(), &d->cpu_mask)) return -EINVAL; @@ -214,12 +215,14 @@ int resctrl_arch_rmid_read(struct rdt_resource *r, struct rdt_domain *d, if (am) { am->chunks += mbm_overflow_count(am->prev_msr, msr_val, hw_res->mbm_width); - *val = get_corrected_mbm_count(rmid, am->chunks); + chunks = get_corrected_mbm_count(rmid, am->chunks); am->prev_msr = msr_val; } else { - *val = msr_val; + chunks = msr_val; } + *val = chunks * hw_res->mon_scale; + return 0; } @@ -232,7 +235,6 @@ int resctrl_arch_rmid_read(struct rdt_resource *r, struct rdt_domain *d, void __check_limbo(struct rdt_domain *d, bool force_free) { struct rdt_resource *r = &rdt_resources_all[RDT_RESOURCE_L3].r_resctrl; - struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r); struct rmid_entry *entry; u32 crmid = 1, nrmid; bool rmid_dirty; @@ -255,7 +257,6 @@ void __check_limbo(struct rdt_domain *d, bool force_free) QOS_L3_OCCUP_EVENT_ID, &val)) { rmid_dirty = true; } else { - val *= hw_res->mon_scale; rmid_dirty = (val >= resctrl_rmid_realloc_threshold); } @@ -299,7 +300,6 @@ int alloc_rmid(void) static void add_rmid_to_limbo(struct rmid_entry *entry) { struct rdt_resource *r = &rdt_resources_all[RDT_RESOURCE_L3].r_resctrl; - struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r); struct rdt_domain *d; int cpu, err; u64 val = 0; @@ -311,7 +311,6 @@ static void add_rmid_to_limbo(struct rmid_entry *entry) err = resctrl_arch_rmid_read(r, d, entry->rmid, QOS_L3_OCCUP_EVENT_ID, &val); - val *= hw_res->mon_scale; if (err || val <= resctrl_rmid_realloc_threshold) continue; } @@ -403,15 +402,14 @@ static int __mon_event_count(u32 rmid, struct rmid_read *rr) */ static void mbm_bw_count(u32 rmid, struct rmid_read *rr) { - struct rdt_hw_resource *hw_res = resctrl_to_arch_res(rr->r); struct mbm_state *m = &rr->d->mbm_local[rmid]; - u64 cur_bw, chunks, cur_chunks; + u64 cur_bw, bytes, cur_bytes; - cur_chunks = rr->val; - chunks = cur_chunks - m->prev_bw_chunks; - m->prev_bw_chunks = cur_chunks; + cur_bytes = rr->val; + bytes = cur_bytes - m->prev_bw_bytes; + m->prev_bw_bytes = cur_bytes; - cur_bw = (chunks * hw_res->mon_scale) >> 20; + cur_bw = bytes / SZ_1M; if (m->delta_comp) m->delta_bw = abs(cur_bw - m->prev_bw); |