On Tue, Aug 14, 2018 at 03:17:35PM -0700, Michal Wnukowski wrote: > /* Update dbbuf and return true if an MMIO is required */ > static bool nvme_dbbuf_update_and_check_event(u16 value, u32 *dbbuf_db, > - volatile u32 *dbbuf_ei) > + u32 *dbbuf_ei) > { > if (dbbuf_db) { > u16 old_value; > @@ -306,6 +306,12 @@ static bool nvme_dbbuf_update_and_check_event(u16 value, > u32 *dbbuf_db, > old_value = *dbbuf_db; > *dbbuf_db = value; > > + /* > + * Ensure that the doorbell is updated before reading > + * the EventIdx from memory > + */ > + mb(); > + > if (!nvme_dbbuf_need_event(*dbbuf_ei, value, old_value)) > return false; > }
You just want to ensure the '*dbbuf_db = value' isn't reordered, right? The order dependency might be more obvious if done as: WRITE_ONCE(*dbbuf_db, value); if (!nvme_dbbuf_need_event(READ_ONCE(*dbbuf_ei), value, old_value)) return false; And 'volatile' is again redundant.