This fixes a major bug in the Sun GEM Ether 
driver's netpoll implementation.  When both polled 
and interrupt driven i/o are used simultaneously, 
for example when using kgdb over Ether with active 
NFS mounts, a condition easily arises where the bug 
is hit.

The problem is that gem_poll() expects an rx softnet_data 
structure to have been allocated (via __netif_rx_schedule()) 
prior to its being called.  The existing gem driver code 
uses gem_interrupt() to set things up for gem_poll(), 
but unfortunately, gem_interrupt() doesn't know about 
this, and so doesn't allocate the required structure 
when it finds no bits set in the interrupt status 
register.  gem_poll() then move on its way and tries to 
delete the non-existent softnet_data structure.


Signed-off-by: Geoff Levand <[EMAIL PROTECTED]>


--- orig/drivers/net/sungem.c
+++ mod/drivers/net/sungem.c
@@ -945,12 +945,12 @@
        
        if (netif_rx_schedule_prep(dev)) {
                u32 gem_status = readl(gp->regs + GREG_STAT);
+               gp->status = gem_status;
 
-               if (gem_status == 0) {
+               if ((gem_status & ~GREG_STAT_TXNR) == 0) {
                        spin_unlock_irqrestore(&gp->lock, flags);
                        return IRQ_NONE;
                }
-               gp->status = gem_status;
                gem_disable_ints(gp);
                __netif_rx_schedule(dev);
        }
@@ -970,7 +970,8 @@
        /* gem_interrupt is safe to reentrance so no need
         * to disable_irq here.
         */
-       gem_interrupt(dev->irq, dev, NULL);
+       if(gem_interrupt(dev->irq, dev, NULL) == IRQ_NONE)
+               __netif_rx_schedule(dev);
 }
 #endif
 


-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to