Messages in this thread Patch in this message | | | Date | Thu, 15 Jun 2023 15:13:35 -0700 | Subject | Re: [PATCH v4 15/24] x86/resctrl: Allow arch to allocate memory needed in resctrl_arch_rmid_read() | From | Reinette Chatre <> |
| |
Hi James,
On 5/25/2023 11:02 AM, James Morse wrote: > Depending on the number of monitors available, Arm's MPAM may need to > allocate a monitor prior to reading the counter value. Allocating a > contended resource may involve sleeping. > > add_rmid_to_limbo() calls resctrl_arch_rmid_read() for multiple domains, > the allocation should be valid for all domains. > > __check_limbo() and mon_event_count() each make multiple calls to > resctrl_arch_rmid_read(), to avoid extra work on contended systems, > the allocation should be valid for multiple invocations of > resctrl_arch_rmid_read(). > > Add arch hooks for this allocation, which need calling before > resctrl_arch_rmid_read(). The allocated monitor is passed to > resctrl_arch_rmid_read(), then freed again afterwards. The helper > can be called on any CPU, and can sleep. > > Tested-by: Shaopeng Tan <tan.shaopeng@fujitsu.com> > Signed-off-by: James Morse <james.morse@arm.com> > ----
Note the extra "-"
> Changes since v3: > * Expanded comment. > * Removed stray header include. > * Reworded commit message. > * Made ctx a void * instead of an int. > ---
...
> diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c > index fb33100e172b..6d140018358a 100644 > --- a/arch/x86/kernel/cpu/resctrl/monitor.c > +++ b/arch/x86/kernel/cpu/resctrl/monitor.c > @@ -264,7 +264,7 @@ static u64 mbm_overflow_count(u64 prev_msr, u64 cur_msr, unsigned int width) > > int resctrl_arch_rmid_read(struct rdt_resource *r, struct rdt_domain *d, > u32 closid, u32 rmid, enum resctrl_event_id eventid, > - u64 *val) > + u64 *val, void *ignored) > { > struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r); > struct rdt_hw_domain *hw_dom = resctrl_to_arch_dom(d); > @@ -331,9 +331,14 @@ void __check_limbo(struct rdt_domain *d, bool force_free) > u32 idx_limit = resctrl_arch_system_num_rmid_idx(); > struct rmid_entry *entry; > u32 idx, cur_idx = 1; > + void *arch_mon_ctx; > bool rmid_dirty; > u64 val = 0; > > + arch_mon_ctx = resctrl_arch_mon_ctx_alloc(r, QOS_L3_OCCUP_EVENT_ID); > + if (arch_mon_ctx < 0) > + return; > +
It seems that not all has adapted to the new type.
> /* > * Skip RMID 0 and start from RMID 1 and check all the RMIDs that > * are marked as busy for occupancy < threshold. If the occupancy > @@ -347,7 +352,8 @@ void __check_limbo(struct rdt_domain *d, bool force_free) > > entry = __rmid_entry(idx); > if (resctrl_arch_rmid_read(r, d, entry->closid, entry->rmid, > - QOS_L3_OCCUP_EVENT_ID, &val)) { > + QOS_L3_OCCUP_EVENT_ID, &val, > + arch_mon_ctx)) { > rmid_dirty = true; > } else { > rmid_dirty = (val >= resctrl_rmid_realloc_threshold); > @@ -360,6 +366,8 @@ void __check_limbo(struct rdt_domain *d, bool force_free) > } > cur_idx = idx + 1; > } > + > + resctrl_arch_mon_ctx_free(r, QOS_L3_OCCUP_EVENT_ID, arch_mon_ctx); > } > > bool has_busy_rmid(struct rdt_resource *r, struct rdt_domain *d) > @@ -539,7 +547,7 @@ static int __mon_event_count(u32 closid, u32 rmid, struct rmid_read *rr) > } > > rr->err = resctrl_arch_rmid_read(rr->r, rr->d, closid, rmid, rr->evtid, > - &tval); > + &tval, rr->arch_mon_ctx); > if (rr->err) > return rr->err; > > @@ -589,7 +597,6 @@ void mon_event_count(void *info) > int ret; > > rdtgrp = rr->rgrp; > - > ret = __mon_event_count(rdtgrp->closid, rdtgrp->mon.rmid, rr); >
Stray change.
> /*
Reinette
| |