lkml.org 
[lkml]   [2014]   [Jul]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/6] x86-mce: Modify CMCI storm exit to reenable instead of rediscover banks.
    Date
    From: Ewout van Bekkum <ewout@google.com>

    The CMCI storm handler previously called cmci_reenable() when exiting a
    CMCI storm. However, when entering a CMCI storm the bank ownership was
    not relinquished by the affected CPUs. The CMCIs were only disabled via
    cmci_storm_disable_banks(). The handler was updated to instead call a
    new function, cmci_storm_enable_banks(), to reenable CMCI on the already
    owned banks instead of rediscovering CMCI banks (which were still owned
    but disabled).

    Signed-off-by: Ewout van Bekkum <ewout@google.com>
    Signed-off-by: Havard Skinnemoen <hskinnemoen@google.com>
    ---
    arch/x86/kernel/cpu/mcheck/mce_intel.c | 50 ++++++++++++++++++++++------------
    1 file changed, 33 insertions(+), 17 deletions(-)

    diff --git a/arch/x86/kernel/cpu/mcheck/mce_intel.c b/arch/x86/kernel/cpu/mcheck/mce_intel.c
    index 26eb8d3..d015daf 100644
    --- a/arch/x86/kernel/cpu/mcheck/mce_intel.c
    +++ b/arch/x86/kernel/cpu/mcheck/mce_intel.c
    @@ -104,6 +104,38 @@ void mce_intel_hcpu_update(unsigned long cpu)
    per_cpu(cmci_storm_state, cpu) = CMCI_STORM_NONE;
    }

    +static void cmci_storm_disable_banks(void)
    +{
    + unsigned long flags, *owned;
    + int bank;
    + u64 val;
    +
    + spin_lock_irqsave(&cmci_discover_lock, flags);
    + owned = __get_cpu_var(mce_banks_owned);
    + for_each_set_bit(bank, owned, MAX_NR_BANKS) {
    + rdmsrl(MSR_IA32_MCx_CTL2(bank), val);
    + val &= ~MCI_CTL2_CMCI_EN;
    + wrmsrl(MSR_IA32_MCx_CTL2(bank), val);
    + }
    + spin_unlock_irqrestore(&cmci_discover_lock, flags);
    +}
    +
    +static void cmci_storm_enable_banks(void)
    +{
    + unsigned long flags, *owned;
    + int bank;
    + u64 val;
    +
    + spin_lock_irqsave(&cmci_discover_lock, flags);
    + owned = __get_cpu_var(mce_banks_owned);
    + for_each_set_bit(bank, owned, MAX_NR_BANKS) {
    + rdmsrl(MSR_IA32_MCx_CTL2(bank), val);
    + val |= MCI_CTL2_CMCI_EN;
    + wrmsrl(MSR_IA32_MCx_CTL2(bank), val);
    + }
    + spin_unlock_irqrestore(&cmci_discover_lock, flags);
    +}
    +
    unsigned long mce_intel_adjust_timer(unsigned long interval)
    {
    int r;
    @@ -132,7 +164,7 @@ unsigned long mce_intel_adjust_timer(unsigned long interval)
    */
    if (!atomic_read(&cmci_storm_on_cpus)) {
    __this_cpu_write(cmci_storm_state, CMCI_STORM_NONE);
    - cmci_reenable();
    + cmci_storm_enable_banks();
    cmci_recheck();
    }
    return cmci_poll_interval();
    @@ -145,22 +177,6 @@ unsigned long mce_intel_adjust_timer(unsigned long interval)
    }
    }

    -static void cmci_storm_disable_banks(void)
    -{
    - unsigned long flags, *owned;
    - int bank;
    - u64 val;
    -
    - spin_lock_irqsave(&cmci_discover_lock, flags);
    - owned = __get_cpu_var(mce_banks_owned);
    - for_each_set_bit(bank, owned, MAX_NR_BANKS) {
    - rdmsrl(MSR_IA32_MCx_CTL2(bank), val);
    - val &= ~MCI_CTL2_CMCI_EN;
    - wrmsrl(MSR_IA32_MCx_CTL2(bank), val);
    - }
    - spin_unlock_irqrestore(&cmci_discover_lock, flags);
    -}
    -
    static bool cmci_storm_detect(void)
    {
    unsigned int cnt = __this_cpu_read(cmci_storm_cnt);
    --
    2.0.0.526.g5318336


    \
     
     \ /
      Last update: 2014-07-09 20:41    [W:4.455 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site