On 1 Oct 2019, at 15:38, Trond Myklebust wrote: > On Tue, 2019-10-01 at 14:30 -0400, Benjamin Coddington wrote: >> ... >> diff --git a/include/linux/sunrpc/xprtsock.h >> b/include/linux/sunrpc/xprtsock.h >> index 7638dbe7bc50..8ffae73dea6c 100644 >> --- a/include/linux/sunrpc/xprtsock.h >> +++ b/include/linux/sunrpc/xprtsock.h >> @@ -56,6 +56,7 @@ struct sock_xprt { >> */ >> unsigned long sock_state; >> struct delayed_work connect_worker; >> + int xprt_err; > > Perhaps move this down just after srcport so we don't create an > unnecessary hole in the structure? Ok! >> struct work_struct error_worker; >> struct work_struct recv_worker; >> struct mutex recv_mutex; >> diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c >> index e2176c167a57..7fe77eef7080 100644 >> --- a/net/sunrpc/xprtsock.c >> +++ b/net/sunrpc/xprtsock.c >> @@ -1250,12 +1250,12 @@ static void xs_error_report(struct sock *sk) >> goto out; >> >> transport = container_of(xprt, struct sock_xprt, xprt); >> - err = -sk->sk_err; >> - if (err == 0) >> + transport->xprt_err = -sk->sk_err; > > Doesn't this need a smp write barrier to ensure it isn't reordered with > the set_bit() in xs_run_error_worker()? Yes, it does need that or the error_worker may clear the bit without seeing the error. Ben