cvs commit: src/sys/dev/fxp if_fxp.c
Maxime Henrion
mux at freebsd.org
Tue Apr 8 11:08:50 PDT 2003
Maxime Henrion wrote:
> Nate Lawson wrote:
> > On Tue, 8 Apr 2003, Maxime Henrion wrote:
> > > Modified files:
> > > sys/dev/fxp if_fxp.c
> > > Log:
> > > Fix the hangs people have been seeing. For some reason, the
> > > atomic operation change caused this, so backout it until I
> > > can figure out what's wrong with it.
> > >
> > > Revision Changes Path
> > > 1.163 +7 -11 src/sys/dev/fxp/if_fxp.c
> >
> > Thank you.
> >
> > > - atomic_clear_32((u_int32_t *)&last->tx_cb->cb_status,
> > > - htobe32(bswap16(FXP_CB_COMMAND_S)));
> > > -
> > > + atomic_clear_short(&sc->fxp_desc.tx_last->tx_cb->cb_command,
> > > + FXP_CB_COMMAND_S);
> > > +#else
> > > + sc->fxp_desc.tx_last->tx_cb->cb_command &= ~FXP_CB_COMMAND_S;
> > > +#endif /*__alpha__*/
> >
> > Um, are each of those cases semantically equivalent?
>
> Yes they are. The only difference, and that's probably where the
> problem lies, is that we are now rewriting (but not changing) cb_status.
> The cb_status word is probably mapped to a register in the fxp(4) card
> and thus rewriting it might not be safe.
That's indeed the problem. We shouldn't touch cb_status at all or it
will acknowledge interrupts. The __alpha__ "fix" was actually needed
because since alpha can't access memory in 16-bit granularity, the
compiler used a 32-bit operation and thus was touching cb_status which
cause the hang if done at a bad time. So my atomic change just extended
the problem to all architectures instead of just __alpha__.
In short, we actually don't need atomicity at all here and this use of
atomic_clear_short() was very confusing. It's actually still confusing
since I can't figure out how this could have worked anyway, and the
commit log says that this fix was tested. However, atomic_clear_short()
will also end up using 32-bit instructions.
Cheers,
Maxime
More information about the cvs-src
mailing list