if: Use critical section on ifnet.if_start path
This is mainly used to avoid contention on serializer between netisr
and ithread on the same CPU, when ithread preempts netisr which holds
serializer that ithread wants to aquire.
This kind of contention is found by analysing ktr(9) log of the
serializer operations.
Tested on 8 HT (i7-3770) box, using kq_accept_server/kq_connect_client:
- 4/4 TX/RX rings device (BCM5719, using MSI-X), slight improvement.
- 8/8 TX/RX rings device (Intel 82580, using MSI-X), slight improvement.
- 1/2 TX/RX rings device (Intel 82599, using MSI), slight improvement.