[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 03/11] x86/mce: handle host LMCE
On 06/27/17 01:13 -0600, Jan Beulich wrote: > >>> Haozhong Zhang <haozhong.zhang@xxxxxxxxx> 06/26/17 11:17 AM >>> > >+/** > >+ * Append a telemetry of deferred MCE to a per-cpu pending list, > >+ * either @pending or @lmce_pending, according to rules below: > >+ * - if @pending is not empty, then the new telemetry will be > >+ * appended to @pending; > >+ * - if @pending is empty and the new telemetry is for a deferred > >+ * LMCE, then the new telemetry will be appended to @lmce_pending; > >+ * - if @pending is empty and the new telemetry is for a deferred > >+ * non-local MCE, all existing telemetries in @lmce_pending will be > >+ * moved to @pending and then the new telemetry will be appended to > >+ * @pending. > >+ * > >+ * This function must be called with MCIP bit set, so that it does not > >+ * need to worry about MC# re-occurring in this function. > >+ * > >+ * As a result, this function can preserve the mutual exclusivity > >+ * between @pending and @lmce_pending (see their comments in struct > >+ * mc_telem_cpu_ctl). > >+ * > >+ * Parameters: > >+ * @cookie: telemetry of the deferred MCE > >+ * @lmce: indicate whether the telemetry is for LMCE > >+ */ > >+void mctelem_defer(mctelem_cookie_t cookie, bool lmce) > >{ > >struct mctelem_ent *tep = COOKIE2MCTE(cookie); > >- > >- mctelem_xchg_head(&this_cpu(mctctl.pending), &tep->mcte_next, tep); > >+ struct mc_telem_cpu_ctl *mctctl = &this_cpu(mctctl); > >+ > >+ ASSERT(mctctl->pending == NULL || mctctl->lmce_pending == NULL); > >+ > >+ if (mctctl->pending) > >+ mctelem_xchg_head(&mctctl->pending, &tep->mcte_next, tep); > >+ else if (lmce) > >+ mctelem_xchg_head(&mctctl->lmce_pending, &tep->mcte_next, tep); > >+ else { > >+ if (mctctl->lmce_pending) > >+ mctelem_xchg_head(&mctctl->lmce_pending, > >+ &mctctl->pending, NULL); > > I don't think this is sufficiently proven to be safe: This may set ->pending > to > non-NULL more than once, and while your comment above considers the > producer side, it doesn't consider the consumer(s). This is even more so that > the consumer side uses potentially stale information to tell which list head > to > update. What problems do you think will be caused by setting ->pending to non-NULL more than once? The only such case is the last else branch: it corresponds to a broadcasting MC#, so all CPUs are in the exception context and no one is consuming ->pending at this moment. Haozhong _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |