> > On Mon, 27 Mar 2017, kan.li...@intel.com wrote: > > + > > + if (val) > > + msr_set_bit_on_cpus(cpu_possible_mask, > MSR_IA32_DEBUGCTLMSR, DEBUGCTLMSR_FREEZE_WHILE_SMM_BIT); > > + else > > + msr_clear_bit_on_cpus(cpu_possible_mask, > MSR_IA32_DEBUGCTLMSR, > > +DEBUGCTLMSR_FREEZE_WHILE_SMM_BIT); > > This is still not protected against CPU hotplug. What's so hard about: > > get_online_cpus(); > > if (val) { > msr_set_bit_on_cpus(cpu_online_mask, > MSR_IA32_DEBUGCTLMSR, > DEBUGCTLMSR_FREEZE_WHILE_SMM_BIT); > } else { > msr_clear_bit_on_cpus(cpu_online_mask, > MSR_IA32_DEBUGCTLMSR, > > DEBUGCTLMSR_FREEZE_WHILE_SMM_BIT); > } > > put_online_cpus(); > > Aside of that, when this is set to SMI freeze, what causes a CPU which > comes online after that point to set the bit as well? Nothing AFAICT. > >
I've patched the intel_pmu_cpu_starting. I think it guarantees that the new online CPU is set. @@ -3174,6 +3174,11 @@ static void intel_pmu_cpu_starting(int cpu) cpuc->lbr_sel = NULL; + if (x86_pmu.attr_freeze_on_smi) + msr_set_bit_on_cpu(cpu, MSR_IA32_DEBUGCTLMSR, DEBUGCTLMSR_FREEZE_WHILE_SMM_BIT); + else + msr_clear_bit_on_cpu(cpu, MSR_IA32_DEBUGCTLMSR, DEBUGCTLMSR_FREEZE_WHILE_SMM_BIT); + if (!cpuc->shared_regs) return; Thanks, Kan