Thread (17 messages) flat view 17 messages, 6 authors, 2015-09-17

NFS/TCP/IPv6 acting strangely in 4.2

From: Eric Dumazet <hidden>
Date: 2015-09-11 13:04:51
Also in: linux-nfs, netdev
Subsystem: kernel nfsd, sunrpc, and lockd servers, networking [general], nfs, sunrpc, and lockd clients, the rest · Maintainers: Chuck Lever, Jeff Layton, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Trond Myklebust, Anna Schumaker, Linus Torvalds

On Fri, 2015-09-11 at 12:38 +0100, Russell King - ARM Linux wrote:
I have a recent Marvell Armada 388 board here which uses the mvneta
driver.  I'm seeing some weird effects with NFS with it acting as a
client.  Unfortunately, the board does not have a functional RTC.

The NFS server is the same NFS server that I've used for years with
multiple other clients (it's my main NFS server) and it continues to
support all other clients without any ill effect.  The NFS server
kernel is rather old now, being a 3.x kernel.

The NFS client appears to connect using TCP/IPv6 and initially is
accessible.  Everything appears to work normally, and then the NFS
server appears to stop responding.

Running tcpdump on the NFS server, and then dumping the captured
packets
with tshark (because tcpdump appears not to understand IPv6 SYNs on
the
NFS port) shows:

  3   0.030036 armada388 -> n2100 TCP 843?nfs [SYN] Seq=936803106
Win=28800 Len=0 MSS=1440 SACK_PERM=1 TSval=892366 TSecr=0 WS=128
  4   0.030409 n2100 -> armada388 TCP nfs?843 [SYN, ACK] Seq=409465870
Ack=936803107 Win=28560 Len=0 MSS=1440 SACK_PERM=1
 TSval=818169117 TSecr=892366 WS=64
  5   0.030493 armada388 -> n2100 TCP [TCP Port numbers reused]
843?nfs [SYN] Seq=936803633 Win=28800 Len=0 MSS=1440 SACK_PERM=1
TSval=892366 TSecr=0 WS=128
Yes, this packet looks very wrong. Like two simultaneous connect with
same source port. It is not a retransmit (Seq numbers differ)
  6   0.030699 n2100 -> armada388 TCP nfs?843 [RST, ACK] Seq=0
Ack=936803634 Win=0 Len=0
  7   0.030766 armada388 -> n2100 TCP 843?nfs [RST] Seq=936803107
Win=0 Len=0
I suspect port reuse in NFS being broken.

Have you tried to apply

commit 099392048cd443349c50310f7fdc96070e40f4e7
Author: Trond Myklebust [off-list ref]
Date:   Sat Aug 29 19:11:21 2015 -0700

    SUNRPC: Prevent SYN+SYNACK+RST storms
    
    Add a shutdown() call before we release the socket in order to ensure the
    reset is sent before we try to reconnect.
    
    Signed-off-by: Trond Myklebust [off-list ref]
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index 214ca9dfb14e..7be90bc1a7c2 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -822,6 +822,8 @@ static void xs_reset_transport(struct sock_xprt *transport)
        if (atomic_read(&transport->xprt.swapper))
                sk_clear_memalloc(sk);
 
+       kernel_sock_shutdown(sock, SHUT_RDWR);
+
        write_lock_bh(&sk->sk_callback_lock);
        transport->inet = NULL;
        transport->sock = NULL;
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help