diff options
author | phk <phk@FreeBSD.org> | 2003-12-25 22:14:25 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2003-12-25 22:14:25 +0000 |
commit | 373c3cc2673a9f0b5b1736e5d3659488232b7794 (patch) | |
tree | 8869b71a698b8793086e480969cd6c830023c502 /sys/pci | |
parent | 0c849a91f98fd719022adbdb4618575ccb9fcfbe (diff) | |
download | FreeBSD-src-373c3cc2673a9f0b5b1736e5d3659488232b7794.zip FreeBSD-src-373c3cc2673a9f0b5b1736e5d3659488232b7794.tar.gz |
Vastly improve performance of IRQ handling on stopped interfaces with
this driver by introducing a flag saying we already stopped the device.
On my Soekris net4801, this took a ping -i 0.001 from spending 80% of
time in interrupt handling to 10% (approx numbers).
This was a particular problem for the net4801 because the tree
interfaces share the same interrupt, but it would be a problem for
any configuration where an unused if_sis interface shares an interrupt
with a busy device.
Other drivers may have similar problems.
Thanks to: Luigi
Diffstat (limited to 'sys/pci')
-rw-r--r-- | sys/pci/if_sis.c | 4 | ||||
-rw-r--r-- | sys/pci/if_sisreg.h | 1 |
2 files changed, 5 insertions, 0 deletions
diff --git a/sys/pci/if_sis.c b/sys/pci/if_sis.c index 0db8747..7e15dae 100644 --- a/sys/pci/if_sis.c +++ b/sys/pci/if_sis.c @@ -2044,6 +2044,7 @@ sis_init(xsc) * Cancel pending I/O and free all RX/TX buffers. */ sis_stop(sc); + sc->sis_stopped = 0; #ifdef notyet if (sc->sis_type == SIS_TYPE_83815 && sc->sis_srr >= NS_SRR_16A) { @@ -2379,6 +2380,8 @@ sis_stop(sc) register int i; struct ifnet *ifp; + if (sc->sis_stopped) + return; SIS_LOCK(sc); ifp = &sc->arpcom.ac_if; ifp->if_timer = 0; @@ -2431,6 +2434,7 @@ sis_stop(sc) bzero(sc->sis_ldata.sis_tx_list, sizeof(sc->sis_ldata.sis_tx_list)); + sc->sis_stopped = 1; SIS_UNLOCK(sc); return; diff --git a/sys/pci/if_sisreg.h b/sys/pci/if_sisreg.h index e39bd08..aebc2af 100644 --- a/sys/pci/if_sisreg.h +++ b/sys/pci/if_sisreg.h @@ -470,6 +470,7 @@ struct sis_softc { bus_dma_tag_t sis_tag; struct sis_ring_data sis_cdata; struct callout sis_stat_ch; + int sis_stopped; #ifdef DEVICE_POLLING int rxcycles; #endif |