lkml.org 
[lkml]   [2018]   [Apr]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.15 176/189] SUNRPC: Don't call __UDPX_INC_STATS() from a preemptible context
    Date
    From: Trond Myklebust <trond.myklebust@primarydata.com>

    [ 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 [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 <fengguang.wu@intel.com>
    Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    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 6d0cc3b8f932..33e2baebdca7 100644
    --- a/net/sunrpc/xprtsock.c
    +++ b/net/sunrpc/xprtsock.c
    @@ -1070,18 +1070,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:
    --
    2.15.1
    \
     
     \ /
      Last update: 2018-04-09 05:34    [W:4.134 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site