On Fri, Nov 16, 2018 at 08:54:32PM +0000, Moger, Babu wrote: > Initialize the resource functions that are different between the > vendors. Some features are initialized differently between the vendors. > Add _intel suffix to Intel specific functions. > > For example, MBA feature varies significantly between Intel and AMD. > Separate the initialization of these resource functions. That way we > can easily add AMD's functions later. > > Signed-off-by: Babu Moger <babu.moger@xxxxxxx> > --- > arch/x86/kernel/cpu/resctrl.c | 34 +++++++++++++++++++---- > arch/x86/kernel/cpu/resctrl.h | 8 ++++-- > arch/x86/kernel/cpu/resctrl_ctrlmondata.c | 4 +-- > 3 files changed, 37 insertions(+), 9 deletions(-) > > diff --git a/arch/x86/kernel/cpu/resctrl.c b/arch/x86/kernel/cpu/resctrl.c > index 18c8222f326c..eeb7e0e4883e 100644 > --- a/arch/x86/kernel/cpu/resctrl.c > +++ b/arch/x86/kernel/cpu/resctrl.c > @@ -57,7 +57,8 @@ int max_name_width, max_data_width; > bool rdt_alloc_capable; > > static void > -mba_wrmsr(struct rdt_domain *d, struct msr_param *m, struct rdt_resource *r); > +mba_wrmsr_intel(struct rdt_domain *d, struct msr_param *m, > + struct rdt_resource *r); > static void > cat_wrmsr(struct rdt_domain *d, struct msr_param *m, struct rdt_resource *r); > > @@ -171,10 +172,7 @@ struct rdt_resource rdt_resources_all[] = { > .rid = RDT_RESOURCE_MBA, > .name = "MB", > .domains = domain_init(RDT_RESOURCE_MBA), > - .msr_base = IA32_MBA_THRTL_BASE, > - .msr_update = mba_wrmsr, > .cache_level = 3, > - .parse_ctrlval = parse_bw, > .format_str = "%d=%*u", > .fflags = RFTYPE_RES_MB, > }, > @@ -356,7 +354,8 @@ u32 delay_bw_map(unsigned long bw, struct rdt_resource *r) > } > > static void > -mba_wrmsr(struct rdt_domain *d, struct msr_param *m, struct rdt_resource *r) > +mba_wrmsr_intel(struct rdt_domain *d, struct msr_param *m, > + struct rdt_resource *r) > { > unsigned int i; > > @@ -873,6 +872,25 @@ static __init bool get_rdt_resources(void) > return (rdt_mon_capable || rdt_alloc_capable); > } > > +static __init void rdt_init_res_defs_intel(void) > +{ > + struct rdt_resource *r; > + > + for_each_rdt_resource(r) { > + if (r->rid == RDT_RESOURCE_MBA) { > + r->msr_base = IA32_MBA_THRTL_BASE; > + r->msr_update = mba_wrmsr_intel; > + r->parse_ctrlval = parse_bw_intel; > + } > + } > +} > + > +static __init void rdt_init_res_defs(void) > +{ > + if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) > + rdt_init_res_defs_intel(); > +} So I'm wondering: instead of having mba_wrmsr_intel() and mba_wrmsr_amd() and adding those per-vendor initialization functions, why don't you push down the vendor differentiation into mba_wrmsr()? Then in that function you do if (vendor == X86_VENDOR_INTEL) __mba_wrmsr_intel(); else if (vendor == X86_VENDOR_AMD) __mba_wrmsr_amd(); and so on and then you don't have to do any of that initialization dance here and the struct rdt_resource assignment for the MBA will remain nicely similar to the other ones... Hmmm? -- Regards/Gruss, Boris. Good mailing practices for 400: avoid top-posting and trim the reply.