kern/176446: [netinet] [patch] Concurrency in ixgbe driving out-of-order packet process and spurious RST
Charbon, Julien
jcharbon at verisign.com
Thu Sep 5 15:30:02 UTC 2013
The following reply was made to PR kern/176446; it has been noted by GNATS.
From: "Charbon, Julien" <jcharbon at verisign.com>
To: bug-followup at freebsd.org, jcharbon at verisign.com
Cc: John Baldwin <jhb at freebsd.org>
Subject: Re: kern/176446: [netinet] [patch] Concurrency in ixgbe driving out-of-order
packet process and spurious RST
Date: Thu, 05 Sep 2013 15:05:15 +0200
This is a multi-part message in MIME format.
--------------090007000606090509060801
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Just a PR update: This issue is fixed in releng/9.2 (since 9.2-RC2
and later), especially with these commits:
- Fix local timer watchdog using taskque_enqueue(&que->que_task) instead
of taskqueue_enqueue(&txr->txq_task)(one line change in
ixgbe_local_timer()):
http://svnweb.freebsd.org/base?view=revision&revision=251964
- Not calling (and then remove) ixgbe_rearm_queues():
http://svnweb.freebsd.org/base?view=revision&revision=253865
These changes did not reach (yet) stable/8. Joined the current patch
for releng/8.4. Thanks to John Balwin for accepting and pushing these
changes.
--
Julien Charbon
--------------090007000606090509060801
Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0";
name="releng-8.4.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="releng-8.4.patch"
diff --git a/sys/dev/ixgbe/ixgbe.c b/sys/dev/ixgbe/ixgbe.c
index df37621..9a00517 100644
--- a/sys/dev/ixgbe/ixgbe.c
+++ b/sys/dev/ixgbe/ixgbe.c
@@ -1396,23 +1396,6 @@ ixgbe_disable_queue(struct adapter *adapter, u32 vector)
}
}
-static inline void
-ixgbe_rearm_queues(struct adapter *adapter, u64 queues)
-{
- u32 mask;
-
- if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
- mask = (IXGBE_EIMS_RTX_QUEUE & queues);
- IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, mask);
- } else {
- mask = (queues & 0xFFFFFFFF);
- IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(0), mask);
- mask = (queues >> 32);
- IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(1), mask);
- }
-}
-
-
static void
ixgbe_handle_que(void *context, int pending)
{
@@ -2046,14 +2029,13 @@ ixgbe_local_timer(void *arg)
(paused == 0))
++hung;
else if (txr->queue_status == IXGBE_QUEUE_WORKING)
- taskqueue_enqueue(que->tq, &que->que_task);
+ taskqueue_enqueue(que->tq, &txr->txq_task);
}
/* Only truely watchdog if all queues show hung */
if (hung == adapter->num_tx_queues)
goto watchdog;
out:
- ixgbe_rearm_queues(adapter, adapter->que_mask);
callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter);
return;
@@ -4559,7 +4541,6 @@ next_desc:
** Schedule another interrupt if so.
*/
if ((staterr & IXGBE_RXD_STAT_DD) != 0) {
- ixgbe_rearm_queues(adapter, (u64)(1 << que->msix));
return (TRUE);
}
--------------090007000606090509060801--
More information about the freebsd-net
mailing list