Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756838AbbEVITq (ORCPT ); Fri, 22 May 2015 04:19:46 -0400 Received: from mga01.intel.com ([192.55.52.88]:51160 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756167AbbEVITm (ORCPT ); Fri, 22 May 2015 04:19:42 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.13,474,1427785200"; d="asc'?scan'208";a="698774739" Date: Fri, 22 May 2015 17:12:47 -0400 From: "Chen, Gong" To: Borislav Petkov Cc: tony.luck@intel.com, linux-kernel@vger.kernel.org Subject: Re: [PATCH 4/4 Rebase] x86, MCE: Avoid potential deadlock in MCE context Message-ID: <20150522211247.GB4930@gchen.bj.intel.com> References: <1432150538-3120-1-git-send-email-gong.chen@linux.intel.com> <1432150538-3120-5-git-send-email-gong.chen@linux.intel.com> <20150520092800.GB3645@pd.tnic> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="Y7xTucakfITjPcLV" Content-Disposition: inline In-Reply-To: <20150520092800.GB3645@pd.tnic> X-PGP-Key-ID: A43922C7 User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 7892 Lines: 228 --Y7xTucakfITjPcLV Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Wed, May 20, 2015 at 11:28:00AM +0200, Borislav Petkov wrote: > Date: Wed, 20 May 2015 11:28:00 +0200 > From: Borislav Petkov > To: "Chen, Gong" , tony.luck@intel.com > Cc: linux-kernel@vger.kernel.org > Subject: Re: [PATCH 4/4 Rebase] x86, MCE: Avoid potential deadlock in MCE > context > User-Agent: Mutt/1.5.23 (2014-03-12) >=20 > On Wed, May 20, 2015 at 03:35:38PM -0400, Chen, Gong wrote: > > Printing in MCE context is a no-no, currently, as printk is not > > NMI-safe. If some of the notifiers on the MCE chain call *printk*, we > > may deadlock. In order to avoid that, delay printk into process context > > to fix it. > >=20 > > Background info at: https://lkml.org/lkml/2014/6/27/26 > >=20 > > Reported-by: Xie XiuQi > > Signed-off-by: Chen, Gong > > Link: http://lkml.kernel.org/r/1406797523-28710-6-git-send-email-gong.c= hen@linux.intel.com > > [ Boris: rewrite a bit. ] > > Signed-off-by: Borislav Petkov > > --- > > arch/x86/include/asm/mce.h | 1 + > > arch/x86/kernel/cpu/mcheck/mce-apei.c | 2 +- > > arch/x86/kernel/cpu/mcheck/mce.c | 8 ++++++-- > > arch/x86/kernel/cpu/mcheck/mce_intel.c | 1 - > > arch/x86/kernel/cpu/mcheck/therm_throt.c | 1 + > > arch/x86/kernel/cpu/mcheck/threshold.c | 1 + > > 6 files changed, 10 insertions(+), 4 deletions(-) >=20 > .... >=20 > > diff --git a/arch/x86/kernel/cpu/mcheck/therm_throt.c b/arch/x86/kernel= /cpu/mcheck/therm_throt.c > > index 1af51b1586d7..2733f275237d 100644 > > --- a/arch/x86/kernel/cpu/mcheck/therm_throt.c > > +++ b/arch/x86/kernel/cpu/mcheck/therm_throt.c > > @@ -427,6 +427,7 @@ static inline void __smp_thermal_interrupt(void) > > { > > inc_irq_stat(irq_thermal_count); > > smp_thermal_vector(); > > + mce_queue_irq_work(); >=20 > Hmm, at a second glance, this looks wrong. I think we should do that > call in intel_thermal_interrupt(). >=20 > > asmlinkage __visible void smp_thermal_interrupt(struct pt_regs *regs) > > diff --git a/arch/x86/kernel/cpu/mcheck/threshold.c b/arch/x86/kernel/c= pu/mcheck/threshold.c > > index 7245980186ee..d695faa234eb 100644 > > --- a/arch/x86/kernel/cpu/mcheck/threshold.c > > +++ b/arch/x86/kernel/cpu/mcheck/threshold.c > > @@ -22,6 +22,7 @@ static inline void __smp_threshold_interrupt(void) > > { > > inc_irq_stat(irq_threshold_count); > > mce_threshold_vector(); > > + mce_queue_irq_work(); >=20 > Same here. >=20 > mce_queue_irq_work() call should be issued in both AMD and Intel > threshold handlers but not in the generic one which is unlikely to queue > any MCE... >=20 > Right? >=20 Since AMD doesn't queue any MCE, it should definitely only cover Intel. Please check out following patch: ----8<---- =46rom: "Chen, Gong" Date: Fri, 22 May 2015 17:02:50 -0400 Subject: [PATCH 4/4 rebase v2] x86, MCE: Avoid potential deadlock in MCE co= ntext Printing in MCE context is a no-no, currently, as printk is not NMI-safe. If some of the notifiers on the MCE chain call *printk*, we may deadlock. In order to avoid that, delay printk into process context to fix it. Background info at: https://lkml.org/lkml/2014/6/27/26 v2 -> v1: move mce_queue_irq_work call into Intel specific logic Reported-by: Xie XiuQi Signed-off-by: Chen, Gong Link: http://lkml.kernel.org/r/1406797523-28710-6-git-send-email-gong.chen@= linux.intel.com [ Boris: rewrite a bit. ] Signed-off-by: Borislav Petkov --- arch/x86/include/asm/mce.h | 1 + arch/x86/kernel/cpu/mcheck/mce-apei.c | 2 +- arch/x86/kernel/cpu/mcheck/mce.c | 8 ++++++-- arch/x86/kernel/cpu/mcheck/mce_intel.c | 2 +- arch/x86/kernel/cpu/mcheck/therm_throt.c | 2 ++ 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h index d16f983f46f5..781432dd8123 100644 --- a/arch/x86/include/asm/mce.h +++ b/arch/x86/include/asm/mce.h @@ -198,6 +198,7 @@ enum mcp_flags { bool machine_check_poll(enum mcp_flags flags, mce_banks_t *b); =20 int mce_notify_irq(void); +void mce_queue_irq_work(void); =20 DECLARE_PER_CPU(struct mce, injectm); =20 diff --git a/arch/x86/kernel/cpu/mcheck/mce-apei.c b/arch/x86/kernel/cpu/mc= heck/mce-apei.c index a1aef9533154..380e3ac8fb62 100644 --- a/arch/x86/kernel/cpu/mcheck/mce-apei.c +++ b/arch/x86/kernel/cpu/mcheck/mce-apei.c @@ -57,7 +57,7 @@ void apei_mce_report_mem_error(int severity, struct cper_= sec_mem_err *mem_err) =20 m.addr =3D mem_err->physical_addr; mce_log(&m); - mce_notify_irq(); + mce_queue_irq_work(); } EXPORT_SYMBOL_GPL(apei_mce_report_mem_error); =20 diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/= mce.c index b369b5fcda1d..a3be97961e22 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c @@ -156,7 +156,7 @@ void mce_log(struct mce *mce) /* Emit the trace record: */ trace_mce_record(mce); =20 - atomic_notifier_call_chain(&x86_mce_decoder_chain, 0, mce); + mce_genpool_add(mce); =20 mce->finished =3D 0; wmb(); @@ -486,6 +486,11 @@ static void mce_irq_work_cb(struct irq_work *entry) mce_schedule_work(); } =20 +void mce_queue_irq_work(void) +{ + irq_work_queue(&mce_irq_work); +} + static void mce_report_event(struct pt_regs *regs) { if (regs->flags & (X86_VM_MASK|X86_EFLAGS_IF)) { @@ -1105,7 +1110,6 @@ void do_machine_check(struct pt_regs *regs, long erro= r_code) /* assuming valid severity level !=3D 0 */ m.severity =3D severity; m.usable_addr =3D mce_usable_address(&m); - mce_genpool_add(&m); =20 mce_log(&m); =20 diff --git a/arch/x86/kernel/cpu/mcheck/mce_intel.c b/arch/x86/kernel/cpu/m= check/mce_intel.c index b4a41cf030ed..3392002e2911 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_intel.c +++ b/arch/x86/kernel/cpu/mcheck/mce_intel.c @@ -216,7 +216,7 @@ static void intel_threshold_interrupt(void) return; =20 machine_check_poll(MCP_TIMESTAMP, this_cpu_ptr(&mce_banks_owned)); - mce_notify_irq(); + mce_queue_irq_work(); } =20 /* diff --git a/arch/x86/kernel/cpu/mcheck/therm_throt.c b/arch/x86/kernel/cpu= /mcheck/therm_throt.c index 1af51b1586d7..809a1e8f7fbd 100644 --- a/arch/x86/kernel/cpu/mcheck/therm_throt.c +++ b/arch/x86/kernel/cpu/mcheck/therm_throt.c @@ -413,6 +413,8 @@ static void intel_thermal_interrupt(void) POWER_LIMIT_EVENT, PACKAGE_LEVEL); } + + mce_queue_irq_work(); } =20 static void unexpected_thermal_interrupt(void) --=20 2.3.2 --Y7xTucakfITjPcLV Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJVX5vOAAoJEI01n1+kOSLHh6MP/jKpUFdZQvZpG+cdQTtJw7KI i4fW7qScXnqS+Fd0Rov2ELWLx6tLCUlrKzeNZ5XdbcPkFltTc/eDd6HZz0ldQlxx cIRV7ulJoZWRTDBKRCBKhPa3kk+4Ml4auddgi2Komf8U/14evqRm0QT/E2c3IUFR 49U81O8Zx78iTPeDWrjpEZIaAUvleWk68LC0SWZciOGE/p4WhFSAm16LIUuPlXip jjWl6Fygmnh8c6CDyfdGDxEczrTTLwSwcWT/9P0cyA9g8xpg5TmS7dm6K9Lz8Er0 XUd6ZXflN09szpMFSNUoXqv8MtCAkW1atwtyuX9yOT+ldkp1fadjGdgMtrqXo/wl C3NmA3YOMiDxULpvDw+jocLlnxeJBNcObl8iQE/aA5FEiCv91kL9fVEhsWiCL3It khuulePMiON63ePWKbVTVb/4dkGzmEUqUg0p2qw3x/hxKxL1YocURwSq+/V+T3Fi 9qxcrRMK/xgK5Zoq7kFRsvh14hz/yleqKuJzt05JZkL3sPINpOsY5lf5nkLbgWpB zSRCdarjyHcaI0cXhDUWFoBhRYrNMVr2mFjuvt6P+68BWxlbEfD36TRq6+WyZnrb LAEoVHG3LlSdXkCfbci8KohZwT4/kvGB58/JqsyCqSQNfiFybDqAaAUK+zJbVeSy m1H/AIZumE0kN3046U7d =n0iG -----END PGP SIGNATURE----- --Y7xTucakfITjPcLV-- -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/