From 8ca0f6042487d3cf77fd45d0954aca444b20f878 Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Tue, 24 Jul 2012 20:47:22 +0800 Subject: [PATCH] bnx: Dispatch state timer to the same CPU as MSI/legacy interrupt CPU Mainly avoid possible serializer contention --- sys/dev/netif/bnx/if_bnx.c | 7 ++++++- sys/dev/netif/bnx/if_bnxvar.h | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/sys/dev/netif/bnx/if_bnx.c b/sys/dev/netif/bnx/if_bnx.c index 6d7048c1e5..9217e45677 100644 --- a/sys/dev/netif/bnx/if_bnx.c +++ b/sys/dev/netif/bnx/if_bnx.c @@ -2151,6 +2151,8 @@ bnx_attach(device_t dev) ifp->if_cpuid = rman_get_cpuid(sc->bnx_irq); KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus); + sc->bnx_stat_cpuid = ifp->if_cpuid; + return(0); fail: bnx_detach(dev); @@ -2700,6 +2702,8 @@ bnx_tick(void *xsc) lwkt_serialize_enter(ifp->if_serializer); + KKASSERT(mycpuid == sc->bnx_stat_cpuid); + bnx_stats_update_regs(sc); if (sc->bnx_flags & BNX_FLAG_TBI) { @@ -3062,7 +3066,8 @@ bnx_init(void *xsc) ifp->if_flags |= IFF_RUNNING; ifp->if_flags &= ~IFF_OACTIVE; - callout_reset(&sc->bnx_stat_timer, hz, bnx_tick, sc); + callout_reset_bycpu(&sc->bnx_stat_timer, hz, bnx_tick, sc, + sc->bnx_stat_cpuid); } /* diff --git a/sys/dev/netif/bnx/if_bnxvar.h b/sys/dev/netif/bnx/if_bnxvar.h index 5cbd26402d..9ad9c4e5c0 100644 --- a/sys/dev/netif/bnx/if_bnxvar.h +++ b/sys/dev/netif/bnx/if_bnxvar.h @@ -239,6 +239,7 @@ struct bnx_softc { int bnx_txcnt; int bnx_link; int bnx_link_evt; + int bnx_stat_cpuid; struct callout bnx_stat_timer; struct sysctl_ctx_list bnx_sysctl_ctx; -- 2.15.1