Message ID | 20220301094608.118879-3-ammarfaizi2@gnuweeb.org |
---|---|
State | New |
Headers | show |
Series | Two x86 fixes | expand |
On Mon, Mar 07, 2022 at 07:27:44AM +0700, Ammar Faizi wrote: > On 3/3/22 9:32 AM, Ammar Faizi wrote: > > It looks like this now. Yazen, Alviro, please review the > > following patch. If you think it looks good, I will submit > > it for the v5. > > > > From 91a447f837d502b7a040cd68f333fb98f4b941d9 Mon Sep 17 00:00:00 2001 > > From: Ammar Faizi <ammarfaizi2@gnuweeb.org> > > Date: Thu, 3 Mar 2022 09:22:17 +0700 > > Subject: [PATCH v5 2/2] x86/MCE/AMD: Fix memory leak when `threshold_create_bank()` fails > > > > In mce_threshold_create_device(), if threshold_create_bank() fails, the > > @bp will be leaked, because mce_threshold_remove_device() will not free > > the @bp. It only frees the @bp when we've already written the @bp to > > the @threshold_banks per-CPU variable, but at the point, we haven't. > > > > Fix this by extracting the cleanup part into a new static function > > _mce_threshold_remove_device(), then use it from create/remove device > > function. Also, eliminate the "goto out_err". Just early return inside > > the loop if we fail. > > The commit message should use passive voice: no "I" or "we". Otherwise, I think the patch looks good. Thanks, Yazen
On 3/10/22 3:55 AM, Yazen Ghannam wrote: > The commit message should use passive voice: no "I" or "we". > > Otherwise, I think the patch looks good. Fixed in the v5 revision, thanks! Link: https://lore.kernel.org/lkml/20220310015306.445359-1-ammarfaizi2@gnuweeb.org/
diff --git a/arch/x86/kernel/cpu/mce/amd.c b/arch/x86/kernel/cpu/mce/amd.c index 9f4b508886dd..a5ef161facd9 100644 --- a/arch/x86/kernel/cpu/mce/amd.c +++ b/arch/x86/kernel/cpu/mce/amd.c @@ -1346,19 +1346,23 @@ int mce_threshold_create_device(unsigned int cpu) if (!bp) return -ENOMEM; + /* + * If we fail, mce_threshold_remove_device() will free the @bp + * via @threshold_banks. + */ + this_cpu_write(threshold_banks, bp); + for (bank = 0; bank < numbanks; ++bank) { if (!(this_cpu_read(bank_map) & (1 << bank))) continue; err = threshold_create_bank(bp, cpu, bank); - if (err) - goto out_err; + if (err) { + mce_threshold_remove_device(cpu); + return err; + } } - this_cpu_write(threshold_banks, bp); if (thresholding_irq_en) mce_threshold_vector = amd_threshold_interrupt; return 0; -out_err: - mce_threshold_remove_device(cpu); - return err; }