Message ID | 20250425083442.2390017-1-xin@zytor.com |
---|---|
Headers | show |
Series | MSR code cleanup part one | expand |
On Sat, 26 Apr 2025, Xin Li wrote: > On 4/25/2025 8:45 AM, Ilpo Järvinen wrote: > > To me this looks really a random set of source files, maybe it helped some > > build success but it's hard for me to review this because there are still > > cases that depend on indirect include chains. > > > > Could you just look into solving all missing msr.h includes instead > > as clearly some are still missing after 3 pre-existing ones and you adding > > it into 3 files: > > > > $ git grep -e rdmsr -e wrmsr -l drivers/platform/x86/ > > drivers/platform/x86/intel/ifs/core.c > > drivers/platform/x86/intel/ifs/load.c > > drivers/platform/x86/intel/ifs/runtest.c > > drivers/platform/x86/intel/pmc/cnp.c > > drivers/platform/x86/intel/pmc/core.c > > drivers/platform/x86/intel/speed_select_if/isst_if_common.c > > drivers/platform/x86/intel/speed_select_if/isst_if_mbox_msr.c > > drivers/platform/x86/intel/speed_select_if/isst_tpmi_core.c > > drivers/platform/x86/intel/tpmi_power_domains.c > > drivers/platform/x86/intel/turbo_max_3.c > > drivers/platform/x86/intel/uncore-frequency/uncore-frequency.c > > drivers/platform/x86/intel_ips.c > > > > $ git grep -e 'msr.h' -l drivers/platform/x86/ > > drivers/platform/x86/intel/pmc/core.c > > drivers/platform/x86/intel/tpmi_power_domains.c > > drivers/platform/x86/intel_ips.c > > I think you want me to add all necessary direct inclusions, right? For asm/msr.h yes, as it seems you're altering the inclusion paths and all non-direct includes have a chance of breaking so it seems prudent to just convert them into direct includes. > This is the right thing to do, and I did try it but gave up later. > > I will do it in the next iteration as you asked. But I want to make my > points: > > 1) It's not just two patterns {rd,wr}msr, there are a lot of definitions > in <asm/msr.h> and we need to cover all of them: I know and I don't expect you to get it 100% perfect, but taking a major step into the right direction would be way better than build testing one configuration and see what blows up and fix only those. In this particular case, the amount of includes seemed really subpar with many users lacking the include. > struct msr_info > struct msr_regs_info > struct saved_msr > struct saved_msrs Could be shortened to -e 'struct msr' -e 'struct saved_msr'. > {read,write}_msr > rdpmc > .*msr.*_on_cpu Well, my pattern already caught rdmsr.*on_cpu and wrmsr.*on_cpu. For the other patterns, I don't see those at all under drivers/platform/x86/ but I think when one typically implies the others tend appear as well so this might not be as hard as it seems. > 2) Once all necessary direct inclusions are in place, it's easy to > overlook adding a header inclusion in practice, especially if the > build passes. Besides we often forget to remove a header when a > definition is removed. In other words, direct inclusion is hard to > maintain. This is true as well but we should still try to move towards the right state affairs even if we will not get it near 100% until there's a real tool that relentlessly keeps exposing such human oversight. And do I try to check also includes whenever I remember while reviewing patches (which requires some effort as they are not visible in the code context and might not appear in a patch at all). > 3) Some random kernel configuration combinations can cause the current > kernel build to fail. I hit one in x86 UML. Yes, which why direct including is much better than relying on fragile indirects. > We all know Ingo is the best person to discuss this with :). While my > understanding of the header inclusion issue may be inaccurate or > outdated. > > So for me, using "make allyesconfig" is a practical method for a quick > local build check, plus I always send my patches to Intel LKP. Even with LKP, randconfig builds may still require many tests to find issues. > There probably wants a script that identifies all files that reference a > definition in a header thus need to include it explicitly. And indirect > includes should be zapped. Sadly, the clang based include-what-you-use tool is not yet there for the kernel AFAIK.
On 4/25/2025 4:34 PM, Xin Li (Intel) wrote: > hpa found that pmu_msr_write() is actually a completely pointless > function [1]: all it does is shuffle some arguments, then calls > pmu_msr_chk_emulated() and if it returns true AND the emulated flag > is clear then does *exactly the same thing* that the calling code > would have done if pmu_msr_write() itself had returned true. And > pmu_msr_read() does the equivalent stupidity. > > Remove the calls to native_{read,write}_msr{,_safe}() within > pmu_msr_{read,write}(). Instead reuse the existing calling code > that decides whether to call native_{read,write}_msr{,_safe}() based > on the return value from pmu_msr_{read,write}(). Consequently, > eliminate the need to pass an error pointer to pmu_msr_{read,write}(). > > While at it, refactor pmu_msr_write() to take the MSR value as a u64 > argument, replacing the current dual u32 arguments, because the dual > u32 arguments were only used to call native_write_msr{,_safe}(), which > has now been removed. > > [1]: https://lore.kernel.org/lkml/0ec48b84-d158-47c6-b14c-3563fd14bcc4@zytor.com/ > > Suggested-by: H. Peter Anvin (Intel) <hpa@zytor.com> > Sign-off-by: Xin Li (Intel) <xin@zytor.com> > --- > > Change in v3: > *) Rename pmu_msr_{read,write}() to pmu_msr_{read,write}_emulated() > (Dapeng Mi). > *) Fix a pmu_msr_read() callsite with wrong arguments (Dapeng Mi). > --- > arch/x86/xen/enlighten_pv.c | 8 ++++++-- > arch/x86/xen/pmu.c | 27 ++++----------------------- > arch/x86/xen/xen-ops.h | 4 ++-- > 3 files changed, 12 insertions(+), 27 deletions(-) > > diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c > index 846b5737d320..61e51a970f3c 100644 > --- a/arch/x86/xen/enlighten_pv.c > +++ b/arch/x86/xen/enlighten_pv.c > @@ -1090,7 +1090,7 @@ static u64 xen_do_read_msr(unsigned int msr, int *err) > { > u64 val = 0; /* Avoid uninitialized value for safe variant. */ > > - if (pmu_msr_read(msr, &val, err)) > + if (pmu_msr_read_emulated(msr, &val)) > return val; > > if (err) > @@ -1132,6 +1132,8 @@ static void set_seg(unsigned int which, unsigned int low, unsigned int high, > static void xen_do_write_msr(unsigned int msr, unsigned int low, > unsigned int high, int *err) > { > + u64 val; > + > switch (msr) { > case MSR_FS_BASE: > set_seg(SEGBASE_FS, low, high, err); > @@ -1158,7 +1160,9 @@ static void xen_do_write_msr(unsigned int msr, unsigned int low, > break; > > default: > - if (!pmu_msr_write(msr, low, high, err)) { > + val = (u64)high << 32 | low; > + > + if (!pmu_msr_write_emulated(msr, val)) { > if (err) > *err = native_write_msr_safe(msr, low, high); > else > diff --git a/arch/x86/xen/pmu.c b/arch/x86/xen/pmu.c > index 9c1682af620a..b6557f2d1a2e 100644 > --- a/arch/x86/xen/pmu.c > +++ b/arch/x86/xen/pmu.c > @@ -313,37 +313,18 @@ static bool pmu_msr_chk_emulated(unsigned int msr, uint64_t *val, bool is_read, > return true; > } > > -bool pmu_msr_read(unsigned int msr, uint64_t *val, int *err) > +bool pmu_msr_read_emulated(u32 msr, u64 *val) > { > bool emulated; > > - if (!pmu_msr_chk_emulated(msr, val, true, &emulated)) > - return false; > - > - if (!emulated) { > - *val = err ? native_read_msr_safe(msr, err) > - : native_read_msr(msr); > - } > - > - return true; > + return pmu_msr_chk_emulated(msr, val, true, &emulated) && emulated; > } > > -bool pmu_msr_write(unsigned int msr, uint32_t low, uint32_t high, int *err) > +bool pmu_msr_write_emulated(u32 msr, u64 val) > { > - uint64_t val = ((uint64_t)high << 32) | low; > bool emulated; > > - if (!pmu_msr_chk_emulated(msr, &val, false, &emulated)) > - return false; > - > - if (!emulated) { > - if (err) > - *err = native_write_msr_safe(msr, low, high); > - else > - native_write_msr(msr, low, high); > - } > - > - return true; > + return pmu_msr_chk_emulated(msr, &val, false, &emulated) && emulated; > } > > static u64 xen_amd_read_pmc(int counter) > diff --git a/arch/x86/xen/xen-ops.h b/arch/x86/xen/xen-ops.h > index 735f58780704..163e03e33089 100644 > --- a/arch/x86/xen/xen-ops.h > +++ b/arch/x86/xen/xen-ops.h > @@ -274,8 +274,8 @@ void xen_pmu_finish(int cpu); > static inline void xen_pmu_init(int cpu) {} > static inline void xen_pmu_finish(int cpu) {} > #endif > -bool pmu_msr_read(unsigned int msr, uint64_t *val, int *err); > -bool pmu_msr_write(unsigned int msr, uint32_t low, uint32_t high, int *err); > +bool pmu_msr_read_emulated(u32 msr, u64 *val); > +bool pmu_msr_write_emulated(u32 msr, u64 val); > int pmu_apic_update(uint32_t reg); > u64 xen_read_pmc(int counter); > Reviewed-by: Dapeng Mi <dapeng1.mi@linux.intel.com>
On 4/27/2025 2:21 AM, Mi, Dapeng wrote:
> Reviewed-by: Dapeng Mi<dapeng1.mi@linux.intel.com>
Thanks!
I just sent out v4, so unless a v5 is needed, leave it to our x86
maintainers.