[PATCH AUTOSEL for 4.14 148/161] SUNRPC: Don't call __UDPX_INC_STATS() from a preemptible context

2018-04-08 Thread Sasha Levin
From: Trond Myklebust 

[ Upstream commit 0afa6b4412988019db14c6bfb8c6cbdf120ca9ad ]

Calling __UDPX_INC_STATS() from a preemptible context leads to a
warning of the form:

 BUG: using __this_cpu_add() in preemptible [] 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 
Signed-off-by: Trond Myklebust 
Signed-off-by: Sasha Levin 
---
 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 8cb40f8ffa5b..30192abfdc3b 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -1069,18 +1069,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(>rq_private_buf, skb)) {
-   __UDPX_INC_STATS(sk, UDP_MIB_INERRORS);
spin_lock(>recv_lock);
+   __UDPX_INC_STATS(sk, UDP_MIB_INERRORS);
goto out_unpin;
}
 
-   __UDPX_INC_STATS(sk, UDP_MIB_INDATAGRAMS);
 
spin_lock_bh(>transport_lock);
xprt_adjust_cwnd(xprt, task, copied);
spin_unlock_bh(>transport_lock);
spin_lock(>recv_lock);
xprt_complete_rqst(task, copied);
+   __UDPX_INC_STATS(sk, UDP_MIB_INDATAGRAMS);
 out_unpin:
xprt_unpin_rqst(rovr);
  out_unlock:
-- 
2.15.1


[PATCH AUTOSEL for 4.14 148/161] SUNRPC: Don't call __UDPX_INC_STATS() from a preemptible context

2018-04-08 Thread Sasha Levin
From: Trond Myklebust 

[ Upstream commit 0afa6b4412988019db14c6bfb8c6cbdf120ca9ad ]

Calling __UDPX_INC_STATS() from a preemptible context leads to a
warning of the form:

 BUG: using __this_cpu_add() in preemptible [] 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 
Signed-off-by: Trond Myklebust 
Signed-off-by: Sasha Levin 
---
 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 8cb40f8ffa5b..30192abfdc3b 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -1069,18 +1069,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(>rq_private_buf, skb)) {
-   __UDPX_INC_STATS(sk, UDP_MIB_INERRORS);
spin_lock(>recv_lock);
+   __UDPX_INC_STATS(sk, UDP_MIB_INERRORS);
goto out_unpin;
}
 
-   __UDPX_INC_STATS(sk, UDP_MIB_INDATAGRAMS);
 
spin_lock_bh(>transport_lock);
xprt_adjust_cwnd(xprt, task, copied);
spin_unlock_bh(>transport_lock);
spin_lock(>recv_lock);
xprt_complete_rqst(task, copied);
+   __UDPX_INC_STATS(sk, UDP_MIB_INDATAGRAMS);
 out_unpin:
xprt_unpin_rqst(rovr);
  out_unlock:
-- 
2.15.1