svn commit: r314281 - stable/11/sys/dev/e1000
Luiz Otavio O Souza
loos at FreeBSD.org
Sat Feb 25 20:21:40 UTC 2017
Author: loos
Date: Sat Feb 25 20:21:39 2017
New Revision: 314281
URL: https://svnweb.freebsd.org/changeset/base/314281
Log:
Disable the driver managed queue for igb(4) when the legacy transmit
interface is used.
The legacy API (IGB_LEGACY_TX) is enabled when ALTQ is built into kernel.
As noted in altq(9), it is responsibility of the caller to protect this
queue against concurrent access and, in the igb case, the interface send
queue is protected by tx queue mutex. This obviously cannot protect the
driver managed queue against concurrent access from different tx queues
and leads to numerous and quite strange panic traces (usually shown as
packets disappearing into thin air).
Improving the locking to cope with this means serialize all access to this
(single) queue and produces no gain, it actually affects the performance
quite noticeabily.
The driver managed queue is already disabled when an ALTQ queue discipline
is set on interface (in altq_enable()), because the driver managed queue
can interfere with ALTQ timing (whence the reports that setting an ALTQ
queue discipline on interface also fixes the issue).
Disabling this additional queue keeps the ability to use if_start() to
send packets to individual NIC queues while it simply eliminate the race.
This is a direct commit to stable/11 as -head driver does not support ALTQ
anymore.
PR: 213257
PR: 212413
Discussed with: sbruno
Tested by: Konstantin Kormashev <konstantin at netgate.com>
Obtained from: pfSense
Sponsored by: Rubicon Communications, LLC (Netgate)
Modified:
stable/11/sys/dev/e1000/if_igb.c
Modified: stable/11/sys/dev/e1000/if_igb.c
==============================================================================
--- stable/11/sys/dev/e1000/if_igb.c Sat Feb 25 20:01:17 2017 (r314280)
+++ stable/11/sys/dev/e1000/if_igb.c Sat Feb 25 20:21:39 2017 (r314281)
@@ -3182,7 +3182,7 @@ igb_setup_interface(device_t dev, struct
#else
ifp->if_start = igb_start;
IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 1);
- ifp->if_snd.ifq_drv_maxlen = adapter->num_tx_desc - 1;
+ ifp->if_snd.ifq_drv_maxlen = 0;
IFQ_SET_READY(&ifp->if_snd);
#endif
More information about the svn-src-stable-11
mailing list