On 16.10.2015. 20:30, Mark Kettenis wrote:
>> Date: Fri, 16 Oct 2015 14:13:52 +0200
>> From: Martin Pieuchot <m...@openbsd.org>
>>
>> On 08/10/15(Thu) 20:49, Mark Kettenis wrote:
>>>> Date: Wed, 30 Sep 2015 14:30:11 +0200 (CEST)
>>>> From: Mark Kettenis <mark.kette...@xs4all.nl>
>>>>
>>>> Since people seemed to like my diff for em(4), here is one for ix(4).
>>>> In addition to unlocking the rx completion path, this one also uses
>>>> intr_barrier() and removes the rx mutex that claudio@ put in recently.
>>>>
>>>> I don't have any ix(4) hardware.  So the only guarantee is that this
>>>> compiles ;).
>>>
>>> Based on the experience with em(4), here is an updated diff.
>>
>> What's happening to this?  Mark did you get any test report?
> 
> Got a report from Hrvoje Popovski that this triggers OACTIVE a lot and
> sometimes even gets stuck completely.

Hi,

i tried to apply this patch to today's current and there are some
errors. could it be because of dlg@ IFF_OACTIVE mpsafe patch?

File to patch: /usr/src/sys/dev/pci/if_ix.c
Patching file /usr/src/sys/dev/pci/if_ix.c using Plan A...
Hunk #1 succeeded at 210.
Hunk #2 succeeded at 525 (offset -2 lines).
Hunk #3 succeeded at 857 (offset -2 lines).
Hunk #4 failed at 867.
Hunk #5 succeeded at 884 (offset -2 lines).
Hunk #6 succeeded at 907 (offset -2 lines).
Hunk #7 succeeded at 1049 (offset -2 lines).
Hunk #8 succeeded at 1115 (offset -2 lines).
Hunk #9 succeeded at 1132 (offset -2 lines).
Hunk #10 succeeded at 1307 (offset 1 line).
Hunk #11 succeeded at 2188 (offset -2 lines).
Hunk #12 succeeded at 2311 (offset 1 line).
Hunk #13 succeeded at 2335 (offset -2 lines).
Hunk #14 succeeded at 2350 (offset 1 line).
Hunk #15 succeeded at 2381 (offset -2 lines).
Hunk #16 failed at 2422.
Hunk #17 succeeded at 2592 (offset 1 line).
Hunk #18 succeeded at 2604 (offset -2 lines).
Hunk #19 succeeded at 2774 (offset 1 line).
Hunk #20 succeeded at 2826 (offset -2 lines).
Hunk #21 succeeded at 2841 (offset 1 line).
Hunk #22 succeeded at 2872 (offset -2 lines).
Hunk #23 failed at 2954.
3 out of 23 hunks failed--saving rejects to /usr/src/sys/dev/pci/if_ix.c.rej



# cat /usr/src/sys/dev/pci/if_ix.c.rej
@@ -872,11 +867,8 @@

        if (ISSET(ifp->if_flags, IFF_RUNNING)) {
                ixgbe_rxeof(que);
-               refill = 1;
-
-               if (ISSET(ifp->if_flags, IFF_OACTIVE))
-                       was_active = 1;
                ixgbe_txeof(txr);
+               refill = 1;
        }

        if (refill) {
@@ -2435,31 +2422,24 @@

        txr->next_to_clean = first;

+       num_avail = atomic_add_int_nv(&txr->tx_avail, processed);
+
+       /* All clean, turn off the timer */
+       if (num_avail == sc->num_tx_desc)
+               ifp->if_timer = 0;
+
        /*
         * If we have enough room, clear IFF_OACTIVE to tell the stack that
-        * it is OK to send packets. If there are no pending descriptors,
-        * clear the timeout. Otherwise, if some descriptors have been
freed,
-        * restart the timeout.
+        * it is OK to send packets.
         */
-       if (txr->tx_avail > IXGBE_TX_CLEANUP_THRESHOLD) {
-               ifp->if_flags &= ~IFF_OACTIVE;
-
-               /* If all are clean turn off the timer */
-               if (txr->tx_avail == sc->num_tx_desc) {
-                       ifp->if_timer = 0;
-                       txr->watchdog_timer = 0;
-                       KERNEL_UNLOCK();
-                       return FALSE;
-               }
-               /* Some were cleaned, so reset timer */
-               else if (processed) {
-                       ifp->if_timer = IXGBE_TX_TIMEOUT;
-                       txr->watchdog_timer = IXGBE_TX_TIMEOUT;
-               }
+       if (ISSET(ifp->if_flags, IFF_OACTIVE) &&
+           num_avail > IXGBE_TX_OP_THRESHOLD) {
+               KERNEL_LOCK();
+               CLR(ifp->if_flags, IFF_OACTIVE);
+               ixgbe_start(ifp);
+               KERNEL_UNLOCK();
        }

-       KERNEL_UNLOCK();
-
        return TRUE;
 }

@@ -2982,10 +2954,6 @@
                        i = 0;
        }
        rxr->next_to_check = i;
-       mtx_leave(&sc->rx_mtx);
-
-       while ((mp = ml_dequeue(&free_ml)))
-               m_freem(mp);

        if_input(ifp, &ml);




Reply via email to