> > spin_lock_irqsave(&port->ah_lock, flags); > > if (port->sm_ah) > > kref_put(&port->sm_ah->ref, free_sm_ah); > > port->sm_ah = NULL; > > spin_unlock_irqrestore(&port->ah_lock, flags); > > > What happens if this happens > > # | CPU-0 | CPU-1 > | | > 1 | if (port->sm_ah) | > | kref_put(&port->sm_ah->ref, free_sm_ah); | > --+-----------------------------------------------------+----------------------- > 2 | | alloc_mad() > --+-----------------------------------------------------+----------------------- > 3 | port->sm_ah = NULL; | > > As I see it, process on CPU-1 gets a garbage sm_ah > Do you agree?
alloc_mad() must obviously take the lock when looking at port->sm_ah, and take a reference with kref_get() before dropping the lock. - R. _______________________________________________ general mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
