On Thu, 30 Jun 2011, David Gwynne wrote:

> > This driver is filled with bad juju.  This changes all the waitoks to not 
> > ok, so they are interrupt safe.  It already appears to handle the failure 
> > case.  The rwlock is also totally unsafe and unnecessary.
> 
> the issue is that bnx_init is called from softclock when it looks like bnx 
> doesnt get any interrupts (so it doesnt do tx completions). i assumed 
> bnx_init was only called from the ioctl paths which have process context.
> 
> this diff is also unsafe because you still init the pool with the nointr 
> allocator, but you're trying to fix the code so bnx_alloc_pkts via bnx_init 
> is ok to call from interrupt context.
> 
> a simpler fix would be to have bnx_watchdog use the system workq to call 
> bnx_init to reset the chip.

as you wish...  :) I agree it's much simpler.  Still needs testing.

Index: if_bnx.c
===================================================================
RCS file: /home/tedu/cvs/src/sys/dev/pci/if_bnx.c,v
retrieving revision 1.95
diff -u -r1.95 if_bnx.c
--- if_bnx.c    22 Jun 2011 16:44:27 -0000      1.95
+++ if_bnx.c    30 Jun 2011 00:25:38 -0000
@@ -5125,7 +5125,7 @@
 
        /* DBRUN(BNX_FATAL, bnx_breakpoint(sc)); */
 
-       bnx_init(sc);
+       workq_add_task(NULL, 0, (workq_fn)bnx_init, sc, NULL);
 
        ifp->if_oerrors++;
 }

Reply via email to