[ofa-general] [PATCH 1/2] IB/core: handle race between elements in qork queues after event
Roland Dreier
rdreier at cisco.com
Tue May 20 06:53:45 PDT 2008
> > 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.
More information about the general
mailing list