summaryrefslogtreecommitdiffstats
path: root/sys/pci
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2003-12-25 22:14:25 +0000
committerphk <phk@FreeBSD.org>2003-12-25 22:14:25 +0000
commit373c3cc2673a9f0b5b1736e5d3659488232b7794 (patch)
tree8869b71a698b8793086e480969cd6c830023c502 /sys/pci
parent0c849a91f98fd719022adbdb4618575ccb9fcfbe (diff)
downloadFreeBSD-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.c4
-rw-r--r--sys/pci/if_sisreg.h1
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
OpenPOWER on IntegriCloud