diff options
author | jhb <jhb@FreeBSD.org> | 2012-03-30 19:54:48 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2012-03-30 19:54:48 +0000 |
commit | 0f7a6b4eb78584a88dfb32549c62e351d32b33fe (patch) | |
tree | 04b0eb50781f96b1e7e2e14293fb989d98971e1b /sys/dev/sec | |
parent | 1dd88fec2f6597efdfc693ade6e17b4a47b033c3 (diff) | |
download | FreeBSD-src-0f7a6b4eb78584a88dfb32549c62e351d32b33fe.zip FreeBSD-src-0f7a6b4eb78584a88dfb32549c62e351d32b33fe.tar.gz |
Fix a few issues with transmit handling in em(4) and igb(4):
- Do not define the foo_start() methods or set if_start in the ifnet if
multiq transmit is enabled. Also, set if_transmit and if_qflush before
ether_ifattach rather than after when multiq transmit is enabled. This
helps to ensure that the drivers never try to mix different transmit
methods.
- Properly restart transmit during resume. igb(4) was not restarting it
at all, and em(4) was restarting even if the link was down and was
calling the wrong method if multiq transmit was enabled.
- Remove all the 'more' handling for transmit completions. Transmit
completion processing does not have a processing limit, so it always
runs to completion and never has more work to do when it returns.
Instead, the previous code was returning 'true' anytime there were
packets in the queue that weren't still in the process of being
transmitted. The effect was that the driver would continuously
reschedule a task to process TX completions in effect running at 100%
CPU polling the hardware until it finished transmitting all of the
packets in the ring. Now it will just wait for the next TX completion
interrupt.
- Restart packet transmission when the link becomes active.
- Fix the MSI-X queue interrupt handlers to restart packet transmission if
there are pending packets in the relevant software queue (IFQ or buf_ring)
after processing TX completions. This is the root cause for the OACTIVE
hangs as if the MSI-X queue handler drained all the pending packets from
the TX ring, nothing would ever restart it. As such, remove some
previously-added workarounds to reschedule a task to poll the TX ring
anytime OACTIVE was set.
Tested by: sbruno
Reviewed by: jfv
MFC after: 1 week
Diffstat (limited to 'sys/dev/sec')
0 files changed, 0 insertions, 0 deletions