lkml.org 
[lkml]   [2023]   [May]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[patch v3 10/36] [patch V2 10/38] x86/cpu/cacheinfo: Remove cpu_callout_mask dependency
    Date
    From: Thomas Gleixner <tglx@linutronix.de>

    cpu_callout_mask is used for the stop machine based MTRR/PAT init.

    In preparation of moving the BP/AP synchronization to the core hotplug
    code, use a private CPU mask for cacheinfo and manage it in the
    starting/dying hotplug state.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Michael Kelley <mikelley@microsoft.com>


    ---
    arch/x86/kernel/cpu/cacheinfo.c | 21 +++++++++++++++++----
    1 file changed, 17 insertions(+), 4 deletions(-)
    ---

    --- a/arch/x86/kernel/cpu/cacheinfo.c
    +++ b/arch/x86/kernel/cpu/cacheinfo.c
    @@ -39,6 +39,8 @@ DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t
    /* Shared L2 cache maps */
    DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_l2c_shared_map);

    +static cpumask_var_t cpu_cacheinfo_mask;
    +
    /* Kernel controls MTRR and/or PAT MSRs. */
    unsigned int memory_caching_control __ro_after_init;

    @@ -1172,8 +1174,10 @@ void cache_bp_restore(void)
    cache_cpu_init();
    }

    -static int cache_ap_init(unsigned int cpu)
    +static int cache_ap_online(unsigned int cpu)
    {
    + cpumask_set_cpu(cpu, cpu_cacheinfo_mask);
    +
    if (!memory_caching_control || get_cache_aps_delayed_init())
    return 0;

    @@ -1191,11 +1195,17 @@ static int cache_ap_init(unsigned int cp
    * lock to prevent MTRR entry changes
    */
    stop_machine_from_inactive_cpu(cache_rendezvous_handler, NULL,
    - cpu_callout_mask);
    + cpu_cacheinfo_mask);

    return 0;
    }

    +static int cache_ap_offline(unsigned int cpu)
    +{
    + cpumask_clear_cpu(cpu, cpu_cacheinfo_mask);
    + return 0;
    +}
    +
    /*
    * Delayed cache initialization for all AP's
    */
    @@ -1210,9 +1220,12 @@ void cache_aps_init(void)

    static int __init cache_ap_register(void)
    {
    + zalloc_cpumask_var(&cpu_cacheinfo_mask, GFP_KERNEL);
    + cpumask_set_cpu(smp_processor_id(), cpu_cacheinfo_mask);
    +
    cpuhp_setup_state_nocalls(CPUHP_AP_CACHECTRL_STARTING,
    "x86/cachectrl:starting",
    - cache_ap_init, NULL);
    + cache_ap_online, cache_ap_offline);
    return 0;
    }
    -core_initcall(cache_ap_register);
    +early_initcall(cache_ap_register);

    \
     
     \ /
      Last update: 2023-05-08 21:45    [W:6.185 / U:0.968 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site