Reduce ifnet.if_serializer contention on output path:
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Wed, 14 May 2008 11:59:24 +0000 (11:59 +0000)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Wed, 14 May 2008 11:59:24 +0000 (11:59 +0000)
commit9db4b353edaae5cb8914ed55a1403419e6d3f724
treeda4b346a0b014f93b01400727371dad3bc8b8439
parent367431cff39e8b0baef6f3272beb2adf9197c18e
Reduce ifnet.if_serializer contention on output path:
- Push ifnet.if_serializer holding down into each ifnet.if_output implementation
- Add a serializer into ifaltq, which is used to protect send queue instead of
  its parent's if_serializer.  This change has following implication:
  o  On output path, enqueueing packets and calling ifnet.if_start are decoupled
  o  In device drivers, poll->dev_encap_ok->dequeue operation sequence is no
     longer safe, instead dequeue->dev_encap_fail->prepend should be used
  This serializer will be held by using lwkt_serialize_adaptive_enter()
- Add altq_started field into ifaltq, which is used to interlock the calling
  of its parent's if_start, to reduce ifnet.if_serializer contention.
  if_devstart(), a helper function which utilizes ifaltq.altq_started, is added
  to reduce code duplication in ethernet device drivers.
- Add if_cpuid into ifnet.  This field indicates on which CPU device driver's
  interrupt will happen.
- Add ifq_dispatch().  This function will try to hold ifnet.if_serializer in
  order to call ifnet.if_start.  If this attempt fails, this function will
  schedule ifnet.if_start to be called on CPU located by ifnet.if_start_cpuid
  if_start_nmsg, which is per-CPU netmsg, is added to ifnet to facilitate
  ifnet.if_start scheduling.  ifq_dispatch() is called by ether_output_frame()
  currently
- Use ifq_classic_ functions, if altq is not enabled
- Fix various device drivers bugs in their if_start implementation
- Add ktr for ifq classic enqueue and dequeue
- Add ktr for ifnet.if_start
129 files changed:
sys/conf/options
sys/config/LINT
sys/contrib/ipfilter/netinet/ip_fil.c
sys/dev/netif/acx/if_acx.c
sys/dev/netif/an/if_an.c
sys/dev/netif/an/if_an_isa.c
sys/dev/netif/an/if_an_pccard.c
sys/dev/netif/an/if_an_pci.c
sys/dev/netif/ath/ath/if_ath.c
sys/dev/netif/aue/if_aue.c
sys/dev/netif/axe/if_axe.c
sys/dev/netif/bce/if_bce.c
sys/dev/netif/bfe/if_bfe.c
sys/dev/netif/bge/if_bge.c
sys/dev/netif/bwi/if_bwi.c
sys/dev/netif/cs/if_cs.c
sys/dev/netif/cue/if_cue.c
sys/dev/netif/dc/if_dc.c
sys/dev/netif/de/if_de.c
sys/dev/netif/ed/if_ed.c
sys/dev/netif/ed/if_ed_isa.c
sys/dev/netif/ed/if_ed_pccard.c
sys/dev/netif/ed/if_ed_pci.c
sys/dev/netif/em/if_em.c
sys/dev/netif/ep/if_ep.c
sys/dev/netif/ep/if_ep_eisa.c
sys/dev/netif/ep/if_ep_isa.c
sys/dev/netif/ep/if_ep_pccard.c
sys/dev/netif/et/if_et.c
sys/dev/netif/ex/if_ex.c
sys/dev/netif/ex/if_ex_isa.c
sys/dev/netif/ex/if_ex_pccard.c
sys/dev/netif/fe/if_fe.c
sys/dev/netif/fwe/if_fwe.c
sys/dev/netif/fxp/if_fxp.c
sys/dev/netif/ie/if_ie.c
sys/dev/netif/iwi/if_iwi.c
sys/dev/netif/iwl/iwl2100.c
sys/dev/netif/kue/if_kue.c
sys/dev/netif/le/if_le.c
sys/dev/netif/lge/if_lge.c
sys/dev/netif/lge/if_lgereg.h
sys/dev/netif/lnc/am7990.c
sys/dev/netif/lnc/am79900.c
sys/dev/netif/lnc/if_lnc_isa.c
sys/dev/netif/lnc/if_lnc_pci.c
sys/dev/netif/lnc/lance.c
sys/dev/netif/msk/if_msk.c
sys/dev/netif/my/if_my.c
sys/dev/netif/ndis/if_ndis.c
sys/dev/netif/nfe/if_nfe.c
sys/dev/netif/nge/if_nge.c
sys/dev/netif/pcn/if_pcn.c
sys/dev/netif/ral/rt2560.c
sys/dev/netif/ral/rt2661.c
sys/dev/netif/re/if_re.c
sys/dev/netif/rl/if_rl.c
sys/dev/netif/rtw/rtw.c
sys/dev/netif/rue/if_rue.c
sys/dev/netif/rum/if_rum.c
sys/dev/netif/sbni/if_sbni.c
sys/dev/netif/sbni/if_sbni_pci.c
sys/dev/netif/sbsh/if_sbsh.c
sys/dev/netif/sf/if_sf.c
sys/dev/netif/sf/if_sfreg.h
sys/dev/netif/sis/if_sis.c
sys/dev/netif/sk/if_sk.c
sys/dev/netif/sln/if_sln.c
sys/dev/netif/sn/if_sn.c
sys/dev/netif/ste/if_ste.c
sys/dev/netif/stge/if_stge.c
sys/dev/netif/ti/if_ti.c
sys/dev/netif/tl/if_tl.c
sys/dev/netif/tx/if_tx.c
sys/dev/netif/txp/if_txp.c
sys/dev/netif/ural/if_ural.c
sys/dev/netif/vge/if_vge.c
sys/dev/netif/vr/if_vr.c
sys/dev/netif/vx/if_vx.c
sys/dev/netif/vx/if_vx_eisa.c
sys/dev/netif/vx/if_vx_pci.c
sys/dev/netif/wb/if_wb.c
sys/dev/netif/wi/if_wi.c
sys/dev/netif/wl/if_wl.c
sys/dev/netif/xe/if_xe.c
sys/dev/netif/xl/if_xl.c
sys/kern/kern_intr.c
sys/kern/lwkt_serialize.c
sys/net/altq/altq_cbq.c
sys/net/altq/altq_fairq.c
sys/net/altq/altq_hfsc.c
sys/net/altq/altq_priq.c
sys/net/altq/altq_subr.c
sys/net/altq/altq_var.h
sys/net/altq/if_altq.h
sys/net/bpf.c
sys/net/gif/if_gif.c
sys/net/gre/if_gre.c
sys/net/i4b/driver/i4b_ipr.c
sys/net/if.c
sys/net/if_atmsubr.c
sys/net/if_ethersubr.c
sys/net/if_loop.c
sys/net/if_var.h
sys/net/ifq_var.h
sys/net/pf/pf.c
sys/net/ppp/if_ppp.c
sys/net/ppp_layer/ppp_tty.c
sys/net/sl/if_sl.c
sys/net/sppp/if_spppsubr.c
sys/net/stf/if_stf.c
sys/net/tun/if_tun.c
sys/netgraph/fec/ng_fec.c
sys/netgraph/iface/ng_iface.c
sys/netinet/if_ether.c
sys/netinet/ip_flow.c
sys/netinet/ip_output.c
sys/netinet6/ip6_mroute.c
sys/netinet6/nd6.c
sys/netproto/atalk/aarp.c
sys/netproto/atalk/ddp_output.c
sys/netproto/atm/atm_if.c
sys/netproto/ipx/ipx_ip.c
sys/netproto/ipx/ipx_outputfl.c
sys/netproto/natm/natm.c
sys/netproto/ns/ns_ip.c
sys/netproto/ns/ns_output.c
sys/sys/interrupt.h
sys/sys/serialize.h