On 01-May-19 19:45, John Baldwin wrote:
On 5/1/19 1:05 AM, Slava Shwartsman wrote:


On 01-May-19 10:28, Slava Shwartsman wrote:


On 01-May-19 10:09, Slava Shwartsman wrote:


On 30-Apr-19 00:14, John Baldwin wrote:
On 4/25/19 12:10 AM, Slava Shwartsman wrote:


On 17-Apr-19 00:28, John Baldwin wrote:
On 4/16/19 8:32 AM, Hans Petter Selasky wrote:
On 4/16/19 4:39 PM, Andrey V. Elsukov wrote:
On 05.12.2018 17:25, Slava Shwartsman wrote:
Author: slavash
Date: Wed Dec  5 14:25:03 2018
New Revision: 341586
URL: https://svnweb.freebsd.org/changeset/base/341586

Log:
      mlx5en: Implement backpressure indication.
      The backpressure indication is implemented using an
unlimited rate type of
      mbuf send tag. When the upper layers typically the socket
layer has obtained such
      a tag, it can then query the destination driver queue for
the current
      amount of space available in the send queue.
      A single mbuf send tag may be referenced multiple times and
a refcount has been added
      to the mlx5e_priv structure to track its usage. Because the
send tag resides
      in the mlx5e_channel structure, there is no need to wait
for refcounts to reach
      zero until the mlx4en(4) driver is detached. The channels
structure is persistant
      during the lifetime of the mlx5en(4) driver it belongs to
and can so be accessed
      without any need of synchronization.
      The mlx5e_snd_tag structure was extended to contain a type
field, because there are now
      two different tag types which end up in the driver which
need to be distinguished.
      Submitted by:   hselasky@
      Approved by:    hselasky (mentor)
      MFC after:      1 week
      Sponsored by:   Mellanox Technologies
@@ -587,27 +609,33 @@ mlx5e_xmit(struct ifnet *ifp, struct mbuf
*mb)
         struct mlx5e_sq *sq;
         int ret;
-    sq = mlx5e_select_queue(ifp, mb);
-    if (unlikely(sq == NULL)) {
-#ifdef RATELIMIT
-        /* Check for route change */
-        if (mb->m_pkthdr.snd_tag != NULL &&
-            mb->m_pkthdr.snd_tag->ifp != ifp) {
+    if (mb->m_pkthdr.snd_tag != NULL) {
+        sq = mlx5e_select_queue_by_send_tag(ifp, mb);
+        if (unlikely(sq == NULL)) {
+            /* Check for route change */
+            if (mb->m_pkthdr.snd_tag->ifp != ifp) {
+                /* Free mbuf */
+                m_freem(mb);
+
+                /*
+                 * Tell upper layers about route
+                 * change and to re-transmit this
+                 * packet:
+                 */
+                return (EAGAIN);
+            }

Hi,

I just discovered something strange and found that this commit is
the
cause.
The test system has mlx5en 100G interface. It has two vlans:
vlan500 and
vlan100.
Via vlan500 it receives some packets flows. Then it routes these
packets
into vlan100.
But packets are dropped in mlx5e_xmit() with EAGAIN error code.

# dtrace -n 'fbt::ip6_output:return {printf("%d", arg1);}'
dtrace: description 'fbt::ip6_output:return ' matched 1 probe
CPU     ID                    FUNCTION:NAME
     23  54338                ip6_output:return 35
     16  54338                ip6_output:return 35
     21  54338                ip6_output:return 35
     22  54338                ip6_output:return 35
     24  54338                ip6_output:return 35
     23  54338                ip6_output:return 35
     14  54338                ip6_output:return 35
^C

# dtrace -n 'fbt::mlx5e_xmit:return {printf("%d", arg1);}'
dtrace: description 'fbt::mlx5e_xmit:return ' matched 1 probe
CPU     ID                    FUNCTION:NAME
     16  69030                mlx5e_xmit:return 35
     23  69030                mlx5e_xmit:return 35
     26  69030                mlx5e_xmit:return 35
     25  69030                mlx5e_xmit:return 35
     24  69030                mlx5e_xmit:return 35
     21  69030                mlx5e_xmit:return 35
     26  69030                mlx5e_xmit:return 35
^C

The kernel config is GENERIC.
13.0-CURRENT #9 r345758+82f3d57(svn_head)-dirty


Hi,

This might be a case where rcvif in the mbuf's pktheader is not
cleared
before the packet is fed back on the wire.

John Baldwin is working on the send tags implementation, to eliminate
the EAGAIN handling in the network drivers.

I will try to push this branch sooner then since it affects more
than just
TLS.  Part of the change includes a new flag we can use to assert
that we
Thanks John!
aren't just getting a stale rcvif (though there are also now
assertions in
ip_output that should catch this case I think).




Hi Andrey,

Yes, we were able to reproduce this issue in house. If you don't
mind, I
prefer to wait for John's update - where he eliminates the EAGAIN
handling in the network drivers.

I have rebased the branch for this, but for now it will just panic
sooner
I believe by tripping an assertion.  Can you grab the diff (or just
the branch)
from the 'send_tags' branch at github/bsdjhb/freebsd and reproduce
under a
kernel with INVARIANTS?  I think we will have to explicitly clear the
'rcvif'
pointer somewhere, but I want to see what the stack trace looks like
so I can
think about the "right" place to clear it.


Hi John,

I grabbed your branch (which doesn't build BTW due to libbe(3): Fix
mis-application of patch (SHLIBDIR) so I just reverted it).

The kernel doesn't panic in this scenario - it just that the packets
are being dropped. So I added a kdb_backtrace right before the return
(EAGAIN) in mlx5e_xmit:

KDB: stack backtrace:
db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame
0xfffffe0000547d90
mlx5e_xmit() at mlx5e_xmit+0x3d/frame 0xfffffe0000548160
vlan_transmit() at vlan_transmit+0xdc/frame 0xfffffe00005481d0
ether_output_frame() at ether_output_frame+0xa2/frame 0xfffffe0000548200
ether_output() at ether_output+0x689/frame 0xfffffe00005482a0
ip_output() at ip_output+0x13a4/frame 0xfffffe00005483f0
ip_forward() at ip_forward+0x344/frame 0xfffffe00005484b0
ip_input() at ip_input+0x7f5/frame 0xfffffe0000548560
netisr_dispatch_src() at netisr_dispatch_src+0xa2/frame
0xfffffe00005485d0
ether_demux() at ether_demux+0x147/frame 0xfffffe0000548600
ether_nh_input() at ether_nh_input+0x403/frame 0xfffffe0000548660
netisr_dispatch_src() at netisr_dispatch_src+0xa2/frame
0xfffffe00005486d0
ether_input() at ether_input+0x73/frame 0xfffffe0000548700
vlan_input() at vlan_input+0x1e7/frame 0xfffffe0000548750
ether_demux() at ether_demux+0x12d/frame 0xfffffe0000548780
ether_nh_input() at ether_nh_input+0x403/frame 0xfffffe00005487e0
netisr_dispatch_src() at netisr_dispatch_src+0xa2/frame
0xfffffe0000548850
ether_input() at ether_input+0x73/frame 0xfffffe0000548880
mlx5e_rx_cq_comp() at mlx5e_rx_cq_comp+0x8b4/frame 0xfffffe00005489a0
mlx5_cq_completion() at mlx5_cq_completion+0x5e/frame 0xfffffe00005489d0
mlx5_msix_handler() at mlx5_msix_handler+0x1ba/frame 0xfffffe0000548a10
ithread_loop() at ithread_loop+0x187/frame 0xfffffe0000548a70
fork_exit() at fork_exit+0x84/frame 0xfffffe0000548ab0
fork_trampoline() at fork_trampoline+0xe/frame 0xfffffe0000548ab0
--- trap 0, rip = 0, rsp = 0, rbp = 0 ---


Please ping me if you want me to try anything else.


Slava

My bad - tested with master. Re-testing now.


Slava

Got it now:

panic: Assertion m->m_pkthdr.snd_tag == NULL failed at
/usr/src/sys/netinet/ip_output.c:213
cpuid = 0
time = 1556697834
KDB: stack backtrace:
db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame
0xfffffe00005ac1f0
vpanic() at vpanic+0x19d/frame 0xfffffe00005ac240
panic() at panic+0x43/frame 0xfffffe00005ac2a0
ip_output() at ip_output+0x159f/frame 0xfffffe00005ac3f0
ip_forward() at ip_forward+0x38c/frame 0xfffffe00005ac4b0
ip_input() at ip_input+0x7f5/frame 0xfffffe00005ac560
netisr_dispatch_src() at netisr_dispatch_src+0xa2/frame 0xfffffe00005ac5d0
ether_demux() at ether_demux+0x147/frame 0xfffffe00005ac600
ether_nh_input() at ether_nh_input+0x403/frame 0xfffffe00005ac660
netisr_dispatch_src() at netisr_dispatch_src+0xa2/frame 0xfffffe00005ac6d0
ether_input() at ether_input+0x7d/frame 0xfffffe00005ac700
vlan_input() at vlan_input+0x1e7/frame 0xfffffe00005ac750
ether_demux() at ether_demux+0x12d/frame 0xfffffe00005ac780
ether_nh_input() at ether_nh_input+0x403/frame 0xfffffe00005ac7e0
netisr_dispatch_src() at netisr_dispatch_src+0xa2/frame 0xfffffe00005ac850
ether_input() at ether_input+0x7d/frame 0xfffffe00005ac880
mlx5e_rx_cq_comp() at mlx5e_rx_cq_comp+0x8b4/frame 0xfffffe00005ac9a0
mlx5_cq_completion() at mlx5_cq_completion+0x5e/frame 0xfffffe00005ac9d0
mlx5_msix_handler() at mlx5_msix_handler+0x1ba/frame 0xfffffe00005aca10
ithread_loop() at ithread_loop+0x187/frame 0xfffffe00005aca70
fork_exit() at fork_exit+0x84/frame 0xfffffe00005acab0
fork_trampoline() at fork_trampoline+0xe/frame 0xfffffe00005acab0
--- trap 0, rip = 0, rsp = 0, rbp = 0 ---
KDB: enter: panic
[ thread pid 12 tid 100113 ]
Stopped at      kdb_enter+0x3b: movq    $0,kdb_why


I can keep the machine in this state for a while now if you want to take
a look at anything specific.

I pushed further changes to this branch (that are now in the review that
Hans noted) that I think should fix the panic.  You can either pull the
branch (I'll try to rebase it today) or from the review.  Please let me
know if this resolves the panic.  Thanks!


I puled the branch and it solves the panic (and the issue):

# dtrace -n 'fbt::mlx5e_xmit:return {printf("%d", arg1);}'
dtrace: description 'fbt::mlx5e_xmit:return ' matched 1 probe
CPU     ID                    FUNCTION:NAME
  1  61827                mlx5e_xmit:return 0
  0  61827                mlx5e_xmit:return 0
  0  61827                mlx5e_xmit:return 0
  0  61827                mlx5e_xmit:return 0
  0  61827                mlx5e_xmit:return 0
  0  61827                mlx5e_xmit:return 0

Andrey, do you want to test it on your end too?


Slava

_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to