This proposal introduces the deferred if_start framework
for network device drivers. It provides a means to schedule
if_start that will be executed in softint later.
We need it for MP-ification of bpf because some drivers call
if_start (or equivalent, say drvX_start) from hardware
interrupt, which means that bpf_mtap is also called from
hardware interrupt. That makes MP-ification hard.
Here is a patch:
The implementation reuses softint of percpuq if_input to
avoid adding yet another softint per interface. Deferred
if_start is called before if_input in the softint handler.
The patch applies the framework only to vioif and wm.
For vioif, we need to just replace vioif_start with
if_schedule_deferred_start. For wm that supports
H/W multiqueue, we need a bit more changes. Once the
proposal is accepted, we apply the framework to remaining
tens of drivers.
BTW, the design to run if_start in softint in conjunction
with if_input recalls the design of pq3etsec driver that
handles both Tx and Rx always in one softint. We would
eventually provide the common framework of the design in
the future. (It would also include multiqueue and poll mode.)