]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
x86/mce: Convert threshold_bank.cpus from atomic_t to refcount_t
authorElena Reshetova <elena.reshetova@intel.com>
Fri, 19 May 2017 09:39:13 +0000 (11:39 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Sun, 21 May 2017 19:55:13 +0000 (21:55 +0200)
The refcount_t type and corresponding API should be used instead
of atomic_t when the variable is used as a reference counter. This
allows to avoid accidental refcounter overflows that might lead to
use-after-free situations.

Suggested-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Elena Reshetova <elena.reshetova@intel.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Hans Liljestrand <ishkamiel@gmail.com>
Reviewed-by: David Windsor <dwindsor@gmail.com>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Yazen Ghannam <Yazen.Ghannam@amd.com>
Cc: linux-edac <linux-edac@vger.kernel.org>
Link: http://lkml.kernel.org/r/1492695536-5947-1-git-send-email-elena.reshetova@intel.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/x86/include/asm/amd_nb.h
arch/x86/kernel/cpu/mcheck/mce_amd.c

index 00c88a01301dc2978cc39828e9589761e235d5a2..da181ad1d5f8c36cd226b7ca080ea859a2b52f83 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <linux/ioport.h>
 #include <linux/pci.h>
+#include <linux/refcount.h>
 
 struct amd_nb_bus_dev_range {
        u8 bus;
@@ -55,7 +56,7 @@ struct threshold_bank {
        struct threshold_block  *blocks;
 
        /* initialized to the number of CPUs on the node sharing this bank */
-       atomic_t                cpus;
+       refcount_t              cpus;
 };
 
 struct amd_northbridge {
index 6e4a047e4b684b0feeeeba851b850c9baebb552f..41439ab4110264e715f9f17df223216a84c8915d 100644 (file)
@@ -1202,7 +1202,7 @@ static int threshold_create_bank(unsigned int cpu, unsigned int bank)
                                goto out;
 
                        per_cpu(threshold_banks, cpu)[bank] = b;
-                       atomic_inc(&b->cpus);
+                       refcount_inc(&b->cpus);
 
                        err = __threshold_add_blocks(b);
 
@@ -1225,7 +1225,7 @@ static int threshold_create_bank(unsigned int cpu, unsigned int bank)
        per_cpu(threshold_banks, cpu)[bank] = b;
 
        if (is_shared_bank(bank)) {
-               atomic_set(&b->cpus, 1);
+               refcount_set(&b->cpus, 1);
 
                /* nb is already initialized, see above */
                if (nb) {
@@ -1289,7 +1289,7 @@ static void threshold_remove_bank(unsigned int cpu, int bank)
                goto free_out;
 
        if (is_shared_bank(bank)) {
-               if (!atomic_dec_and_test(&b->cpus)) {
+               if (!refcount_dec_and_test(&b->cpus)) {
                        __threshold_remove_blocks(b);
                        per_cpu(threshold_banks, cpu)[bank] = NULL;
                        return;