SUNRPC: Don't call __UDPX_INC_STATS() from a preemptible context

"Linux Kernel Mailing List" <[email protected]>
Newsgroups gmane.linux.kernel.commits.head
Message-ID <[email protected]>
Web:        https://git.kernel.org/torvalds/c/0afa6b4412988019db14c6bfb8c6cbdf120ca9ad
Commit:     0afa6b4412988019db14c6bfb8c6cbdf120ca9ad
Parent:     f515f86b34b2e7d4b24cc9b7375c9e749895088e
Refname:    refs/heads/master
Author:     Trond Myklebust <[email protected]>
AuthorDate: Fri Feb 9 09:39:42 2018 -0500
Committer:  Trond Myklebust <[email protected]>
CommitDate: Fri Feb 9 09:39:42 2018 -0500

    SUNRPC: Don't call __UDPX_INC_STATS() from a preemptible context
    
    Calling __UDPX_INC_STATS() from a preemptible context leads to a
    warning of the form:
    
     BUG: using __this_cpu_add() in preemptible [00000000] code: kworker/u5:0/31
     caller is xs_udp_data_receive_workfn+0x194/0x270
     CPU: 1 PID: 31 Comm: kworker/u5:0 Not tainted 4.15.0-rc8-00076-g90ea9f1 #2
     Workqueue: xprtiod xs_udp_data_receive_workfn
     Call Trace:
      dump_stack+0x85/0xc1
      check_preemption_disabled+0xce/0xe0
      xs_udp_data_receive_workfn+0x194/0x270
      process_one_work+0x318/0x620
      worker_thread+0x20a/0x390
      ? process_one_work+0x620/0x620
      kthread+0x120/0x130
      ? __kthread_bind_mask+0x60/0x60
      ret_from_fork+0x24/0x30
    
    Since we're taking a spinlock in those functions anyway, let's fix the
    issue by moving the call so that it occurs under the spinlock.
    
    Reported-by: kernel test robot <[email protected]>
    Signed-off-by: Trond Myklebust <[email protected]>
---
 net/sunrpc/xprtsock.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index 5d0108172ed3..a6b8c1f8f92a 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -1068,18 +1068,18 @@ static void xs_udp_data_read_skb(struct rpc_xprt *xprt,
 
 	/* Suck it into the iovec, verify checksum if not done by hw. */
 	if (csum_partial_copy_to_xdr(&rovr->rq_private_buf, skb)) {
-		__UDPX_INC_STATS(sk, UDP_MIB_INERRORS);
 		spin_lock(&xprt->recv_lock);
+		__UDPX_INC_STATS(sk, UDP_MIB_INERRORS);
 		goto out_unpin;
 	}
 
-	__UDPX_INC_STATS(sk, UDP_MIB_INDATAGRAMS);
 
 	spin_lock_bh(&xprt->transport_lock);
 	xprt_adjust_cwnd(xprt, task, copied);
 	spin_unlock_bh(&xprt->transport_lock);
 	spin_lock(&xprt->recv_lock);
 	xprt_complete_rqst(task, copied);
+	__UDPX_INC_STATS(sk, UDP_MIB_INDATAGRAMS);
 out_unpin:
 	xprt_unpin_rqst(rovr);
  out_unlock:
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.