Move bge rxeof and txeof outside the kernel lock.
authorjmatthew <jmatthew@openbsd.org>
Mon, 19 Oct 2015 05:31:25 +0000 (05:31 +0000)
committerjmatthew <jmatthew@openbsd.org>
Mon, 19 Oct 2015 05:31:25 +0000 (05:31 +0000)
commitc24ff1838514fa6439ffaaed6baba01b807729c4
tree9e21e35306abce275c75f1a876d6c9476448b55b
parentb608f594c7a79ab9c9a8aa47be909a64618dc514
Move bge rxeof and txeof outside the kernel lock.
To make rxeof safe, use a separate ring refill timeout for each ring.
We activate the refill timeout for a ring when it's too empty to receive
packets, which ensures we won't attempt to refill it from interrupt context.

To make txeof safe, remove the list of dma maps and just allocate maps based on
the ring slots occupied by the packet, and use atomic operations to adjust
bge_txcnt.  Rework some parts of the txeof and start loops so that we only
adjust bge_txcnt after exiting the loop, and only take actions such as setting
or clearing OACTIVE based on the final value.

tested on 5703, 5714, 5721 by me, 5753 by semarie@, 5761 by naddy@, and
also in snapshots for a while
ok mpi@, dlg@
sys/dev/pci/if_bge.c
sys/dev/pci/if_bgereg.h