Hi Holger,

You said you met this stack trace after migrating to "kernel 5.4". Can you give 
us a full version ?

Thanks.
Tung Nguyen

-----Original Message-----
From: Holger Brunck <holger.bru...@hitachi-powergrids.com> 
Sent: Monday, November 23, 2020 10:00 PM
To: Jon Maloy <jma...@redhat.com>; tipc-discussion@lists.sourceforge.net
Cc: Tung Quang Nguyen <tung.q.ngu...@dektech.com.au>; CC: Xin Long 
<lucien....@gmail.com>; Matteo Ghidoni <matteo.ghid...@hitachi-powergrids.com>
Subject: Re: refcount warnings with TIPC in combination with a TAP device and 
fragmented messages

Hi Jon,
thanks.  To add some more information I was now using ftrace to see the call 
stack within TIPC/TAP and the related
skb operations to narrow this down. Maybe someone more familiar with the 
receive flow in the TIPC stack sees already something suspicious. 

Here is the trace starting from our program (main) sending the first fragment 
to the TAP device until the first WARN_ON sequence
is written out when our client (tipc_ping) is receiving the reassembled packet:

     main-91      ....    84.4851: tun_chr_write_iter <-vfs_write              
<-- first fragment arrives
     main-91      ....    84.4851:   tun_get_user <-tun_chr_write_iter
     main-91      ....    84.4851:     sock_alloc_send_pskb <-tun_get_user
     main-91      ....    84.4851:       skb_set_owner_w <-sock_alloc_send_pskb 
    <-- refcount add
     main-91      ....    84.4851:     skb_put <-tun_get_user
     main-91      ....    84.4852:     skb_copy_datagram_from_iter 
<-tun_get_user  <-- copy data
     main-91      ....    84.4852: tipc_l2_rcv_msg 
<-__netif_receive_skb_one_core
     main-91      ....    84.4852:   tipc_rcv <-tipc_l2_rcv_msg
     main-91      ...2    84.4852:     tipc_link_rcv <-tipc_rcv
     main-91      ...2    84.4852:       tipc_link_advance_transmq 
<-tipc_link_rcv
     main-91      ...2    84.4852:         kfree_skb <-tipc_link_advance_transmq
     main-91      ...2    84.4852:           skb_release_all <-kfree_skb
     main-91      ...2    84.4852:             skb_release_head_state 
<-skb_release_all
     main-91      ...2    84.4852:             skb_release_data 
<-skb_release_all
     main-91      ...2    84.4852:               skb_free_head 
<-skb_release_data
     main-91      ...2    84.4852:           kfree_skbmem <-kfree_skb
     main-91      ...2    84.4852:         kfree_skb <-tipc_link_advance_transmq
     main-91      ...2    84.4852:           skb_release_all <-kfree_skb
     main-91      ...2    84.4852:             skb_release_head_state 
<-skb_release_all
     main-91      ...2    84.4852:             skb_release_data 
<-skb_release_all
     main-91      ...2    84.4852:               skb_free_head 
<-skb_release_data
     main-91      ...2    84.4852:           kfree_skbmem <-kfree_skb
     main-91      ...2    84.4852:       tipc_data_input <-tipc_link_rcv
     main-91      ...2    84.4852:       tipc_link_input <-tipc_link_rcv
     main-91      ...2    84.4852:         tipc_buf_append <-tipc_link_input
     main-91      ...2    84.4852:           skb_pull <-tipc_buf_append
     main-91      ...2    84.4853:       tipc_link_advance_backlog 
<-tipc_link_rcv
     main-91      ....    84.4853:     kfree_skb <-tipc_rcv
     main-91      ....    84.4854: tun_chr_write_iter <-vfs_write       <--- 
second fragment
     main-91      ....    84.4854:   tun_get_user <-tun_chr_write_iter
     main-91      ....    84.4854:     sock_alloc_send_pskb <-tun_get_user
     main-91      ....    84.4854:       skb_set_owner_w <-sock_alloc_send_pskb
     main-91      ....    84.4854:     skb_put <-tun_get_user
     main-91      ....    84.4854:     skb_copy_datagram_from_iter 
<-tun_get_user
     main-91      ....    84.4854: tipc_l2_rcv_msg 
<-__netif_receive_skb_one_core
     main-91      ....    84.4854:   tipc_rcv <-tipc_l2_rcv_msg
     main-91      ...2    84.4854:     tipc_link_advance_transmq <-tipc_link_rcv
     main-91      ...2    84.4854:     tipc_data_input <-tipc_link_rcv
     main-91      ...2    84.4854:       tipc_link_input <-tipc_link_rcv
     main-91      ...2    84.4854:         tipc_buf_append <-tipc_link_input
     main-91      ...2    84.4854:           skb_pull <-tipc_buf_append
     main-91      ...2    84.4854:           skb_try_coalesce <-tipc_buf_append
     main-91      ...2    84.4854:         tipc_data_input <-tipc_link_input
     main-91      ...2    84.4854:       skb_queue_tail <-tipc_data_input
     main-91      ....    84.4854:     tipc_sk_rcv <-tipc_rcv
     main-91      ....    84.4854:       tipc_sk_lookup <-tipc_sk_rcv
     main-91      ...1    84.4854:       tipc_sk_filter_rcv <-tipc_sk_rcv
     main-91      ...1    84.4854:         sock_wfree <-tipc_sk_filter_rcv
     main-91      ...1    84.4854:           tun_sock_write_space <-sock_wfree
     main-91      ...1    84.4854:         tipc_data_ready <-tipc_sk_filter_rcv
     main-91      ....    84.4855:         tipc_node_distr_xmit <-tipc_sk_rcv
     main-91      ....    84.4855:     kfree_skb <-tipc_rcv
tipc_ping-97      ....    84.4855: tipc_poll <-sock_poll                <-- 
tipc_ping receives the packet
tipc_ping-97      ....    84.4859: tipc_recvmsg <-__sys_recvfrom
tipc_ping-97      ....    84.4859:   tipc_wait_for_rcvmsg <-tipc_recvmsg
tipc_ping-97      ....    84.4859:   tipc_sk_set_orig_addr <-tipc_recvmsg
                                                   skb_copy_datagram_msg
tipc_ping-97      ....    84.4859:       skb_copy_datagram_iter <-tipc_recvmsg
tipc_ping-97      ....    84.4859:   kfree_skb <-tsk_advance_rx_queue
tipc_ping-97      ....    84.4859:     skb_release_all <-kfree_skb
tipc_ping-97      ....    84.4859:       skb_release_head_state 
<-skb_release_all
tipc_ping-97      ....    84.4859:       skb_release_data <-skb_release_all
tipc_ping-97      ....    84.4859:         kfree_skb <-skb_release_data
tipc_ping-97      ....    84.4859:           skb_release_all <-kfree_skb
tipc_ping-97      ....    84.4859:             skb_release_head_state 
<-skb_release_all
tipc_ping-97      ....    84.4859:             sock_wfree 
<-skb_release_head_state
tipc_ping-97      ....    84.4859:               warn_slowpath_fmt 
<-refcount_warn_saturate  <--- first WARN_ON dump
tipc_ping-97      ....    84.4897:               __warn <-warn_slowpath_fmt
tipc_ping-97      ....    84.5227:               dump_backtrace <-show_stack

  
Best regards
Holger Brunck


From: Jon Maloy <jma...@redhat.com>
Sent: 23 November 2020 15:25
To: Holger Brunck <holger.bru...@hitachi-powergrids.com>; 
tipc-discussion@lists.sourceforge.net <tipc-discussion@lists.sourceforge.net>
Cc: CC: Tung Nguyen <tung.q.ngu...@dektech.com.au>; CC: Xin Long 
<lucien....@gmail.com>; Matteo Ghidoni <matteo.ghid...@hitachi-powergrids.com>
Subject: Re: refcount warnings with TIPC in combination with a TAP device and 
fragmented messages 
 



Hi Holger,
We will look into this. It is a new setup for us, so it has to be
prepared first.

///jon


On 11/19/20 9:33 AM, Holger Brunck wrote:
> Hi all,
> we have currently problems with TIPC in combination with a TAP interface and 
> fragmented
> messages. We have a Kirkwood board getting TIPC ethernet packets from a third 
> party stack
> in user space which we fill into a TAP device to pass this packets to the 
> kernel. On the
> remote side we have another board with a physical ethernet device. After 
> migrating to
> kernel 5.4 we saw kernel crashes as soon as we send fragmented TIPC messages 
> via
> this link. Before the kernel crash we see "refcount_t: underflow; 
> use-after-free"
> warnings coming either from the TIPC or the driver/net/tun.
> For smaller packets everything work fine. To track this down we wrote a small
> test program which receives raw ethernet packets in user space and send them 
> back to
> kernel space via a TAP interface, to be able to reproduce it with a mainline 
> kernel only.
> So instead of a link e.g. eth0:eth0 we have a link from eth0:tap0.
>
> I now tested this on latest mainline kernel and still see warnings coming 
> from the kernel, but
> not the crash.
> So in the testcase we have TIPC server running on a remote board having a 
> ethernet bearer
> on a interface. The ethernet interface is connected to the ethernet interface 
> of the
> kirkwood board. The incoming messages are passed to user space and filled 
> into the TAP device.
> So we have a TIPC link between tap0 and eth0. If I send now back and forth  
> TIPC connectionless
> messages to the server via the TAP device the kernel print the following 
> messages as soon as
> the packets are larger then the MTU and TIPC need to reassemble the 
> fragmented messages coming
> from the TAP driver:
>
> root@km_kirkwood:~#
> ------------[ cut here ]------------
> WARNING: CPU: 0 PID: 94 at lib/refcount.c:28 sock_wfree+0xd8/0xe0
> refcount_t: underflow; use-after-free.
> Modules linked in:
> CPU: 0 PID: 94 Comm: tipc_ping Tainted: G        W         
> 5.10.0-rc4-17824-g0fa8ee0d9ab9 #112
> Hardware name: Marvell Kirkwood (Flattened Device Tree)
> [<c000f924>] (unwind_backtrace) from [<c000c980>] (show_stack+0x10/0x14)
> [<c000c980>] (show_stack) from [<c001c27c>] (__warn+0xe8/0xfc)
> [<c001c27c>] (__warn) from [<c001c2fc>] (warn_slowpath_fmt+0x6c/0xb8)
> [<c001c2fc>] (warn_slowpath_fmt) from [<c0564b78>] (sock_wfree+0xd8/0xe0)
> [<c0564b78>] (sock_wfree) from [<c056b730>] (skb_release_all+0xc/0x28)
> [<c056b730>] (skb_release_all) from [<c056b784>] (kfree_skb+0x20/0x6c)
> [<c056b784>] (kfree_skb) from [<c056be44>] (skb_release_data+0xc0/0x140)
> [<c056be44>] (skb_release_data) from [<c056b784>] (kfree_skb+0x20/0x6c)
> [<c056b784>] (kfree_skb) from [<c0720ea4>] (tipc_recvmsg+0x270/0x3c4)
> [<c0720ea4>] (tipc_recvmsg) from [<c0560428>] (__sys_recvfrom+0xb0/0x128)
> [<c0560428>] (__sys_recvfrom) from [<c05604bc>] (sys_recv+0x18/0x20)
> [<c05604bc>] (sys_recv) from [<c0008240>] (ret_fast_syscall+0x0/0x50)
> Exception stack(0xc1615fa8 to 0xc1615ff0)
> 5fa0:                   00000001 00000000 00000003 00025010 0000fa00 00000000
> 5fc0: 00000001 00000000 00010888 00000123 00000000 00000000 49cb0000 be939bec
> 5fe0: 00000000 be93997c 00011114 49d9666c
> ---[ end trace e7c3a1366c544d79 ]---
> ------------[ cut here ]------------
> WARNING: CPU: 0 PID: 74 at lib/refcount.c:22 sock_alloc_send_pskb+0x240/0x258
> refcount_t: saturated; leaking memory.
> Modules linked in:
> CPU: 0 PID: 74 Comm: main Tainted: G        W         
> 5.10.0-rc4-17824-g0fa8ee0d9ab9 #112
> Hardware name: Marvell Kirkwood (Flattened Device Tree)
> [<c000f924>] (unwind_backtrace) from [<c000c980>] (show_stack+0x10/0x14)
> [<c000c980>] (show_stack) from [<c001c27c>] (__warn+0xe8/0xfc)
> [<c001c27c>] (__warn) from [<c001c2fc>] (warn_slowpath_fmt+0x6c/0xb8)
> [<c001c2fc>] (warn_slowpath_fmt) from [<c0563b40>] 
> (sock_alloc_send_pskb+0x240/0x258)
> [<c0563b40>] (sock_alloc_send_pskb) from [<c043d500>] 
> (tun_get_user+0x224/0x13f8)
> [<c043d500>] (tun_get_user) from [<c043e718>] (tun_chr_write_iter+0x44/0x78)
> [<c043e718>] (tun_chr_write_iter) from [<c012f1bc>] (vfs_write+0x1fc/0x448)
> [<c012f1bc>] (vfs_write) from [<c012f52c>] (ksys_write+0x54/0xcc)
> [<c012f52c>] (ksys_write) from [<c0008240>] (ret_fast_syscall+0x0/0x50)
> Exception stack(0xc158bfa8 to 0xc158bff0)
> bfa0:                   00011244 00000000 00000004 00022098 000005c2 00000004
> bfc0: 00011244 00000000 000108bc 00000004 00000000 00000000 49cb0000 becf3c94
> bfe0: 00000000 becf3bb0 49e21ce0 49e223e4
> ---[ end trace e7c3a1366c544d7a ]---
>
> Kernel version:
> root@km_kirkwood:~# cat /proc/version
> Linux version 5.10.0-rc4-17824-g0fa8ee0d9ab9
>
> If I simply use ethernet bearer on both sides everything works fine, so I need
> the TAP interface to be involved to see the problem.
>
> It seems that we have a problem in the skb_buf allocation or handling between
> the TAP driver and the TIPC layer as soon it comes to fragmentation.
> Does anyone have an idea what could cause the problem and how to track this
> down? Any help is appreciated.
>
> Best regards
> Holger Brunck


_______________________________________________
tipc-discussion mailing list
tipc-discussion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to