On Tue, Sep 15, 2015 at 05:37:51PM -0700, K. Y. Srinivasan wrote: > From: Olaf Hering <olaf@xxxxxxxxx> > > The callbacks in kvp, vss and fcopy code are called both from the main thread > as well as from interrupt context. If a state change is done by the main > thread it is not immediately seen by the interrupt. As a result the > state machine gets out of sync. > > Force propagation of state changes via get/set helpers with a memory barrier. > > Signed-off-by: Olaf Hering <olaf@xxxxxxxxx> > Signed-off-by: K. Y. Srinivasan <kys@xxxxxxxxxxxxx> > --- > drivers/hv/hyperv_vmbus.h | 14 ++++++++++++++ > 1 files changed, 14 insertions(+), 0 deletions(-) > > diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h > index 4b1eb6d..dee5798 100644 > --- a/drivers/hv/hyperv_vmbus.h > +++ b/drivers/hv/hyperv_vmbus.h > @@ -780,4 +780,18 @@ enum hvutil_device_state { > HVUTIL_DEVICE_DYING, /* driver unload is in progress */ > }; > > +static inline void hvutil_device_set_state(enum hvutil_device_state *p, > + enum hvutil_device_state s) > +{ > + *p = s; > + wmb(); > +} > + > +static inline enum hvutil_device_state > +hvutil_device_get_state(enum hvutil_device_state *p) > +{ > + rmb(); > + return *p; > +} > + > #endif /* _HYPERV_VMBUS_H */ This is crazy. If you need to know the state of something (pun intended) then you had better be using a lock, and not relying on a random pointer to contain a random value and be able to do something based on that. This shows the code is broken, don't paper over things by throwing in random read/write barriers, that is a HUGE flag that something bad is happening here. Just use a lock, that's what it is there for. greg k-h _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel