lkml.org 
[lkml]   [2018]   [Feb]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.15 130/163] xprtrdma: Fix BUG after a device removal
    Date
    4.15-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Chuck Lever <chuck.lever@oracle.com>

    commit e89e8d8fcdc6751e86ccad794b052fe67e6ad619 upstream.

    Michal Kalderon reports a BUG that occurs just after device removal:

    [ 169.112490] rpcrdma: removing device qedr0 for 192.168.110.146:20049
    [ 169.143909] BUG: unable to handle kernel NULL pointer dereference at 0000000000000010
    [ 169.181837] IP: rpcrdma_dma_unmap_regbuf+0xa/0x60 [rpcrdma]

    The RPC/RDMA client transport attempts to allocate some resources
    on demand. Registered buffers are one such resource. These are
    allocated (or re-allocated) by xprt_rdma_allocate to hold RPC Call
    and Reply messages. A hardware resource is associated with each of
    these buffers, as they can be used for a Send or Receive Work
    Request.

    If a device is removed from under an NFS/RDMA mount, the transport
    layer is responsible for releasing all hardware resources before
    the device can be finally unplugged. A BUG results when the NFS
    mount hasn't yet seen much activity: the transport tries to release
    resources that haven't yet been allocated.

    rpcrdma_free_regbuf() already checks for this case, so just move
    that check to cover the DEVICE_REMOVAL case as well.

    Reported-by: Michal Kalderon <Michal.Kalderon@cavium.com>
    Fixes: bebd031866ca ("xprtrdma: Support unplugging an HCA ...")
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
    Tested-by: Michal Kalderon <Michal.Kalderon@cavium.com>
    Cc: stable@vger.kernel.org # v4.12+
    Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    net/sunrpc/xprtrdma/verbs.c | 6 +++---
    1 file changed, 3 insertions(+), 3 deletions(-)

    --- a/net/sunrpc/xprtrdma/verbs.c
    +++ b/net/sunrpc/xprtrdma/verbs.c
    @@ -1476,6 +1476,9 @@ __rpcrdma_dma_map_regbuf(struct rpcrdma_
    static void
    rpcrdma_dma_unmap_regbuf(struct rpcrdma_regbuf *rb)
    {
    + if (!rb)
    + return;
    +
    if (!rpcrdma_regbuf_is_mapped(rb))
    return;

    @@ -1491,9 +1494,6 @@ rpcrdma_dma_unmap_regbuf(struct rpcrdma_
    void
    rpcrdma_free_regbuf(struct rpcrdma_regbuf *rb)
    {
    - if (!rb)
    - return;
    -
    rpcrdma_dma_unmap_regbuf(rb);
    kfree(rb);
    }

    \
     
     \ /
      Last update: 2018-02-21 14:23    [W:4.136 / U:0.580 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site