lkml.org 
[lkml]   [2023]   [Mar]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v3 05/19] x86/resctrl: Allow RMID allocation to be scoped by CLOSID
    On Mon, 20 Mar 2023, James Morse wrote:

    > MPAMs RMID values are not unique unless the CLOSID is considered as well.
    >
    > alloc_rmid() expects the RMID to be an independent number.
    >
    > Pass the CLOSID in to alloc_rmid(). Use this to compare indexes when
    > allocating. If the CLOSID is not relevant to the index, this ends up
    > comparing the free RMID with itself, and the first free entry will be
    > used. With MPAM the CLOSID is included in the index, so this becomes a
    > walk of the free RMID entries, until one that matches the supplied
    > CLOSID is found.
    >
    > Tested-by: Shaopeng Tan <tan.shaopeng@fujitsu.com>
    > Signed-off-by: James Morse <james.morse@arm.com>
    > ---
    > Changes since v2;
    > * Rephrased comment in resctrl_find_free_rmid() to describe this in terms of
    > list_entry_first()
    > * Rephrased comment above alloc_rmid()
    > ---
    > arch/x86/kernel/cpu/resctrl/internal.h | 2 +-
    > arch/x86/kernel/cpu/resctrl/monitor.c | 54 +++++++++++++++++------
    > arch/x86/kernel/cpu/resctrl/pseudo_lock.c | 2 +-
    > arch/x86/kernel/cpu/resctrl/rdtgroup.c | 2 +-
    > 4 files changed, 43 insertions(+), 17 deletions(-)
    >
    > diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h
    > index 47506e2afd59..e11d9ce943d3 100644
    > --- a/arch/x86/kernel/cpu/resctrl/internal.h
    > +++ b/arch/x86/kernel/cpu/resctrl/internal.h
    > @@ -535,7 +535,7 @@ void rdtgroup_pseudo_lock_remove(struct rdtgroup *rdtgrp);
    > struct rdt_domain *get_domain_from_cpu(int cpu, struct rdt_resource *r);
    > int closids_supported(void);
    > void closid_free(int closid);
    > -int alloc_rmid(void);
    > +int alloc_rmid(u32 closid);
    > void free_rmid(u32 closid, u32 rmid);
    > int rdt_get_mon_l3_config(struct rdt_resource *r);
    > bool __init rdt_cpu_has(int flag);
    > diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c
    > index 03a7d13dd653..ca58a433c668 100644
    > --- a/arch/x86/kernel/cpu/resctrl/monitor.c
    > +++ b/arch/x86/kernel/cpu/resctrl/monitor.c
    > @@ -337,25 +337,51 @@ bool has_busy_rmid(struct rdt_resource *r, struct rdt_domain *d)
    > return find_first_bit(d->rmid_busy_llc, idx_limit) != idx_limit;
    > }
    >
    > -/*
    > - * As of now the RMIDs allocation is global.
    > - * However we keep track of which packages the RMIDs
    > - * are used to optimize the limbo list management.
    > - */
    > -int alloc_rmid(void)
    > +static struct rmid_entry *resctrl_find_free_rmid(u32 closid)
    > {
    > - struct rmid_entry *entry;
    > -
    > - lockdep_assert_held(&rdtgroup_mutex);
    > + struct rmid_entry *itr;
    > + u32 itr_idx, cmp_idx;
    >
    > if (list_empty(&rmid_free_lru))
    > - return rmid_limbo_count ? -EBUSY : -ENOSPC;
    > + return rmid_limbo_count ? ERR_PTR(-EBUSY) : ERR_PTR(-ENOSPC);
    >
    > - entry = list_first_entry(&rmid_free_lru,
    > - struct rmid_entry, list);
    > - list_del(&entry->list);
    > + list_for_each_entry(itr, &rmid_free_lru, list) {
    > + /*
    > + * get the index of this free RMID, and the index it would need
    > + * to be if it were used with this CLOSID.
    > + * If the CLOSID is irrelevant on this architecture, these will
    > + * always be the same meaning the compiler can reduce this loop
    > + * to a single list_entry_first() call.
    > + */
    > + itr_idx = resctrl_arch_rmid_idx_encode(itr->closid, itr->rmid);
    > + cmp_idx = resctrl_arch_rmid_idx_encode(closid, itr->rmid);
    >
    > - return entry->rmid;
    > + if (itr_idx == cmp_idx)
    > + return itr;
    > + }
    > +
    > + return ERR_PTR(-ENOSPC);
    > +}
    > +
    > +/*
    > + * For MPAM the RMID value is not unique, and has to be considered with
    > + * the CLOSID. The (CLOSID, RMID) pair is allocated on all domains, which
    > + * allows all domains to be managed by a single limbo list.
    > + * Each domain also has a rmid_busy_llc to reduce the work of the limbo handler.
    > + */
    > +int alloc_rmid(u32 closid)
    > +{
    > + struct rmid_entry *entry;
    > +
    > + lockdep_assert_held(&rdtgroup_mutex);
    > +
    > + entry = resctrl_find_free_rmid(closid);
    > + if (!IS_ERR(entry)) {
    > + list_del(&entry->list);
    > + return entry->rmid;
    > + }
    > +
    > + return PTR_ERR(entry);

    Reverse the if condition to make this follow the normal error handling
    pattern.


    --
    i.

    \
     
     \ /
      Last update: 2023-03-27 01:10    [W:3.435 / U:0.720 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site