On Fri, 2023-02-10 at 00:50 +0100, Thomas Gleixner wrote: > On Thu, Feb 09 2023 at 20:32, Usama Arif wrote: > > On 09/02/2023 18:31, Thomas Gleixner wrote: > > > > first_cpu = cpumask_first(cpu_online_mask); > > > > smp_call_function_single(first_cpu, mtrr_save_fixed_ranges, NULL, 1); > > > > > > So why is this relevant after the initial bringup? The BP MTRRs have > > > been saved already above, no? > > > > > > > I will let David confirm if this is correct and why he did it, but this > > is what I thought while reviewing before posting v4: > > > > - At initial boot (system_state < SYSTEM_RUNNING), when mtrr_save_state > > is called in do_cpu_up at roughly the same time so MTRR is going to be > > the same, we can just save it once and then reuse for other secondary > > cores as it wouldn't have changed for the rest of the do_cpu_up calls. > > > > - When the system is running and you offline and then online a CPU, you > > want to make sure that hotplugged CPU gets the current MTRR (which might > > have changed since boot?), incase the MTRR has changed after the system > > has been booted, you save the MTRR of the first online CPU. When the > > hotplugged CPU runs its initialisation code, its fixed-range MTRRs will > > be updated with the newly saved fixed-range MTRRs. > > I knew that already :) But seriously: > > If the MTRRs are changed post boot then the cached values want to be > updated too. They are, aren't they? The only way we come out of mtrr_save_state() without calling mtrr_save_fixed_ranges() — either directly or via smp_call_function_single() — is if they've already been saved once *and* system_state < SYSTEM_RUNNING. I suppose we could make that clearer by moving the definition of the mtrr_saved flags inside the if (system_state < SYSTEM_RUNNING) block? @@ -721,11 +721,20 @@ void __init mtrr_bp_init(void) */ void mtrr_save_state(void) { int first_cpu; if (!mtrr_enabled()) return; + if (system_state < SYSTEM_RUNNING) { + static bool mtrr_saved; + if (!mtrr_saved) { + mtrr_save_fixed_ranges(NULL); + mtrr_saved = true; + } + return; + } + first_cpu = cpumask_first(cpu_online_mask); smp_call_function_single(first_cpu, mtrr_save_fixed_ranges, NULL, 1); }
Attachment:
smime.p7s
Description: S/MIME cryptographic signature