[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[xen master] x86/mcheck: fix mca_allbanks updating



commit 532988dccc197bc4fe700ebceffad95f2f4c7541
Author:     Soham Dandapat <soham.dandapat@xxxxxxx>
AuthorDate: Tue Sep 9 08:18:11 2025 +0200
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Tue Sep 9 08:18:11 2025 +0200

    x86/mcheck: fix mca_allbanks updating
    
    In mca_cap_init function,the mcabanks_alloc allocates and
    initializes an mca_banks structure for managing MCA banks,
    setting up a bank map and storing the specified or default number
    of banks.
    
    After this we will call mcabanks_set(i, mca_allbanks);
    The mcabanks_set function sets a specific bit in the bank_map of
    an mca_banks structure, provided the structure, its bank_map, and
    the bit index are valid.
    
    At the end, we will call
    mcabanks_free(xchg(&mca_allbanks, all));
    This function is thread safe and does below:
       1. Atomically exchanges the value of "mca_allbanks" with "all"
       2. Returns the old value that was previously in "mca_allbanks"
    So, when we will call mcabanks_free , that will free the memory.
    
    The problem is that mcabanks_set(i, mca_allbanks) function is updating
    mca_allbanks which will be freed via mcabanks_free later. This means
    new mca_allbanks instance("all") will never get chance to update
    it's bank_map.
    
    Due to this when we will collect log from mcheck_mca_logout function ,
    the condition "if ( !mcabanks_test(i, bankmask) )" will always fails
    and MCA logs will not be collected for any bank.
    
    The fix is to solve this problem.
    
    Fixes: 560cf418c845 ("x86/mcheck: allow varying bank counts per CPU")
    Signed-off-by: Soham Dandapat <soham.dandapat@xxxxxxx>
    Reviewed-by: Jason Andryuk <jason.andryuk@xxxxxxx>
    Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
---
 xen/arch/x86/cpu/mcheck/mce.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/xen/arch/x86/cpu/mcheck/mce.c b/xen/arch/x86/cpu/mcheck/mce.c
index bbc0d24732..9277781bff 100644
--- a/xen/arch/x86/cpu/mcheck/mce.c
+++ b/xen/arch/x86/cpu/mcheck/mce.c
@@ -664,7 +664,7 @@ static int mca_cap_init(bool bsp)
         if ( !all )
             return -ENOMEM;
         for ( i = 0; i < nr; i++ )
-            mcabanks_set(i, mca_allbanks);
+            mcabanks_set(i, all);
         mcabanks_free(xchg(&mca_allbanks, all));
     }
 
--
generated by git-patchbot for /home/xen/git/xen.git#master



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.