Messages in this thread Patch in this message | | | From | James Morse <> | Subject | [PATCH v1 11/20] x86/resctrl: Calculate bandwidth from the total bytes counter | Date | Thu, 29 Jul 2021 22:36:01 +0000 |
| |
mbm_bw_count() maintains its own copy of prev_msr to allow it to calculate the bandwidth as the number of chunks counted since the last time mbm_bw_count() was invoked.
The prev_msr and chunks values are in a format specific to the architecture. MPAM's monitor scaling can be enabled for some counters and not others. If the value is changed once the bandwidth counter passes some threshold, the prev_msr values need to be converted to the new scale. Having two prev_msr values is a hindrance to moving this logic behind an architecture specific function that returns the counters number of bytes.
Change mbm_bw_count() to calculate the total number of bytes the counter has seen in the same way as __mon_event_count(), then calculate the bandwidth from that. prev_bw_msr is replaced by prev_bw_chunks, the chunks value from the last time mbm_bw_count() was invoked.
Signed-off-by: James Morse <james.morse@arm.com> --- arch/x86/kernel/cpu/resctrl/internal.h | 4 ++-- arch/x86/kernel/cpu/resctrl/monitor.c | 15 ++++++++++----- 2 files changed, 12 insertions(+), 7 deletions(-)
diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h index 1b07e49564cf..0a5721e1cc07 100644 --- a/arch/x86/kernel/cpu/resctrl/internal.h +++ b/arch/x86/kernel/cpu/resctrl/internal.h @@ -289,7 +289,7 @@ struct rftype { * struct mbm_state - status for each MBM counter in each domain * @chunks: Total data moved (multiply by rdt_group.mon_scale to get bytes) * @prev_msr: Value of IA32_QM_CTR for this RMID last time we read it - * @prev_bw_msr:Value of previous IA32_QM_CTR for bandwidth counting + * @prev_bw_chunks: Previous chunks value read when for bandwidth calculation * @prev_bw: The most recent bandwidth in MBps * @delta_bw: Difference between the current and previous bandwidth * @delta_comp: Indicates whether to compute the delta_bw @@ -297,7 +297,7 @@ struct rftype { struct mbm_state { u64 chunks; u64 prev_msr; - u64 prev_bw_msr; + u64 prev_bw_chunks; u32 prev_bw; u32 delta_bw; bool delta_comp; diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c index b178329d3661..af60e154f0ed 100644 --- a/arch/x86/kernel/cpu/resctrl/monitor.c +++ b/arch/x86/kernel/cpu/resctrl/monitor.c @@ -316,7 +316,7 @@ static int __mon_event_count(u32 rmid, struct rmid_read *rr) if (rr->first) { memset(m, 0, sizeof(struct mbm_state)); - m->prev_bw_msr = m->prev_msr = tval; + m->prev_bw_chunks = m->prev_msr = tval; return 0; } @@ -337,20 +337,25 @@ 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 tval, cur_bw, chunks; + u64 tval, cur_bw, chunks, bw_chunks; tval = __rmid_read(rmid, rr->evtid); if (tval & (RMID_VAL_ERROR | RMID_VAL_UNAVAIL)) return; - 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; + chunks = mbm_overflow_count(m->prev_msr, tval, hw_res->mbm_width); + m->chunks += chunks; + m->prev_msr = tval; + bw_chunks = get_corrected_mbm_count(rmid, m->chunks); + + cur_bw = (bw_chunks - m->prev_bw_chunks) * hw_res->mon_scale; + cur_bw >>= 20; if (m->delta_comp) m->delta_bw = abs(cur_bw - m->prev_bw); m->delta_comp = false; m->prev_bw = cur_bw; - m->prev_bw_msr = tval; + m->prev_bw_chunks = bw_chunks; } /* -- 2.30.2
| |