[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 03/11] x86/mce: handle host LMCE
>>> On 03.07.17 at 05:46, <haozhong.zhang@xxxxxxxxx> wrote: > @@ -454,6 +455,7 @@ void mcheck_cmn_handler(const struct cpu_user_regs *regs) > uint64_t gstatus; > mctelem_cookie_t mctc = NULL; > struct mca_summary bs; > + bool wait, lmce; Considering the code being replaced as well as ... > @@ -462,6 +464,8 @@ void mcheck_cmn_handler(const struct cpu_user_regs *regs) > sizeof(long) * BITS_TO_LONGS(clear_bank->num)); > } > mctc = mcheck_mca_logout(MCA_MCE_SCAN, bankmask, &bs, clear_bank); > + lmce = bs.lmce; > + wait = mce_broadcast && !lmce; ... this, I think the former variable would better be named "broadcast" (or "bcast"). Same in mce_softirq() then, of course. > @@ -497,16 +501,16 @@ void mcheck_cmn_handler(const struct cpu_user_regs > *regs) > } > mce_spin_unlock(&mce_logout_lock); > > - mce_barrier_enter(&mce_trap_bar, mce_broadcast); > + mce_barrier_enter(&mce_trap_bar, wait); > if ( mctc != NULL && mce_urgent_action(regs, mctc)) > cpumask_set_cpu(smp_processor_id(), &mce_fatal_cpus); > - mce_barrier_exit(&mce_trap_bar, mce_broadcast); > + mce_barrier_exit(&mce_trap_bar, wait); > > /* > * Wait until everybody has processed the trap. > */ > - mce_barrier_enter(&mce_trap_bar, mce_broadcast); > - if (atomic_read(&severity_cpu) == smp_processor_id()) > + mce_barrier_enter(&mce_trap_bar, wait); > + if (lmce || atomic_read(&severity_cpu) == smp_processor_id()) > { Considering the brace placement you'd really want blanks inside the if() parens, but this file is so badly mixed in style that I wouldn't insist. The alternative would be to move the brace up - that would perhaps match up better with at least the "majority" of style. > void mctelem_process_deferred(unsigned int cpu, > - int (*fn)(mctelem_cookie_t)) > + int (*fn)(mctelem_cookie_t), > + bool lmce) > { > struct mctelem_ent *tep; > struct mctelem_ent *head, *prev; > + struct mc_telem_cpu_ctl *mctctl = &per_cpu(mctctl, cpu); > int ret; > > /* > * First, unhook the list of telemetry structures, and > * hook it up to the processing list head for this CPU. > + * > + * If @lmce is true and a non-local MC# occurs before the > + * following atomic exchange, @lmce will not hold after > + * resumption, because all telemetries in @lmce_pending on > + * @cpu are moved to @pending on @cpu in mcheck_cmn_handler(). > + * In such a case, no telemetries will be handled in this > + * function after resumption. Another round of MCE softirq, > + * which was raised by above mcheck_cmn_handler(), will handle > + * those moved telemetries in @pending on @cpu. > + * > + * If another MC# occurs after the following atomic exchange, > + * it will be handled by another round of MCE softirq. This restates what the earlier paragraph of the comment already says. With these taken care of Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |