Re: [PATCH v6 13/20] x86/split_lock: Enable split lock detection by default

From: Fenghua Yu
Date: Tue Apr 09 2019 - 20:10:23 EST


On Thu, Apr 04, 2019 at 08:07:57PM +0200, Thomas Gleixner wrote:
> On Wed, 3 Apr 2019, Fenghua Yu wrote:
>
> > +static void init_split_lock_detect(struct cpuinfo_x86 *c)
> > +{
> > + if (cpu_has(c, X86_FEATURE_SPLIT_LOCK_DETECT)) {
> > + u32 l, h;
> > +
> > + mutex_lock(&split_lock_detect_mutex);
> > + rdmsr(MSR_TEST_CTL, l, h);
> > + l = new_sp_test_ctl_val(l);
> > + wrmsr(MSR_TEST_CTL, l, h);
> > + show_split_lock_detection_info();
> > + mutex_unlock(&split_lock_detect_mutex);
> > + }
> > +}
> > +
> > static void early_init_intel(struct cpuinfo_x86 *c)
> > {
> > u64 misc_enable;
> >
> > + init_split_lock_detect(c);
>
> so we have in early boot:
>
> early_cpu_init()
> early_identify_cpu()
> this_cpu->c_early_init(c)
> early_init_intel() {
> init_split_lock_detect();
> }
> ....
> cpu_set_core_cap_bits(c)
> set(FEATURE_SPLIT_LOCK)
>
> I don't have to understand how init_split_lock_detect() will magically see
> the feature bit which gets set afterwards, right?

early_init_intel() is called twice on the boot CPU. Besides it's called
in earl_cpu_init(), it's also called in:
identify_boot_cpu()
identify_cpu()
init_intel()
early_init_intel()
init_split_lock_detect();

It's true that init_split_lock_detect() doesn't see the feature bit when
it's called for the first time in early_cpu_init(). But it sees the feature
bit when it's called for the second time in identify_boot_cpu().

So is init_split_lock_detect() in the right place?

Thanks.

-Fenghua