cvs commit: src/sys/dev/re if_re.c
John Baldwin
jhb at FreeBSD.org
Thu Aug 18 19:42:01 GMT 2005
On Thursday 18 August 2005 02:43 pm, Maxim Sobolev wrote:
> John Baldwin wrote:
> > On Thursday 18 August 2005 10:29 am, Maxim Sobolev wrote:
> >>sobomax 2005-08-18 14:29:01 UTC
> >>
> >> FreeBSD src repository
> >>
> >> Modified files:
> >> sys/dev/re if_re.c
> >> Log:
> >> In re_shutdown() mark interface as down since otherwise we will panic
> >> if interrupt comes in later on, which can happen in some uncommon cases.
> >>
> >> Another possible fix is to call re_detach() instead of re_stop(), like
> >> ve(4) does, but I am not sure if the latter is really RTTD, so that
> >> stick with this one-liner for now.
> >>
> >> PR: kern/80005
> >> Approved by: silence on -arch, no reply from selected network gurus
> >
> > The PR reports problems while the machine is running, not a panic during
> > shutdown. I couldn't get the PR database to load the PR with the panic
> > from
>
> Sorry, it has been a typo - in fact I was reffering to kern/85005.
>
> > vr(4) yesterday. It's very unclear why clearing IFF_UP makes any
> > difference. Ah, perhaps re_intr() should be fixed to check
> > IFF_DRV_RUNNING rather than IFF_UP? Then the re_stop() in re_shutdown()
> > would be sufficient.
>
> Yes, this will help. However, I am not quite sure, what is the point to
> do interrupt processing if interface is down? Perhaps re_intr() should
> check both IFF_DRV_RUNNING and IFF_UP?
IFF_DRV_RUNNING will be clear once foo_stop() is called. I think IFF_UP is
the wrong flag actually as it might still be set in the shutdown case, but
shutdown normally calls foo_stop() so you should be able to just check
IFF_DRV_RUNNING. Note that when you down an interface, you get an ioctl that
results in foo_stop() being called from foo_ioctl() and the upper layer then
clears IFF_UP.
> > I also think that the change to vr(4) should be reverted (way too big of
> > a sledge hammer) and instead its interrupt handler can check
> > IFF_DRV_RUNNING and bail if it is clear as well.
>
> Well, see kern/85005. IMO some generic approach should be worked out and
> implemented since I think many other network drivers may be affected by
> the same problem.
I've still yet to see what the real panic is. For one thing, if the foo_stop
method does its jobs, the ethernet hardware shouldn't be generating
interrupts. The stop method should be shutting the card down (i.e. turning
off the receiver and transmitter for example). Is your ethernet driver
sharing an interrupt with another device and the other device is
interrupting? In that case, the ethernet driver would have the same panic if
you did an 'ifconfig foo0 down' and then the other device interrupted. So, I
think clearing IFF_UPP in foo_shutdown() is wrong. foo_stop() should really
be sufficient, and foo_intr() should be able to handle a spurious interrupt
while the interface is stopped without panicing since it already needs to do
so to handle the shared interrupt case.
--
John Baldwin <jhb at FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve" = http://www.FreeBSD.org
More information about the cvs-src
mailing list