RE: [PATCH v1] xprtrdma: Fix BUG after a device removal

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> From: Chuck Lever [mailto:chucklever@xxxxxxxxx] On Behalf Of Chuck Lever
> Sent: Wednesday, January 31, 2018 6:04 PM
> To: Kalderon, Michal <Michal.Kalderon@xxxxxxxxxx>
> Cc: linux-rdma@xxxxxxxxxxxxxxx
> Subject: [PATCH v1] xprtrdma: Fix BUG after a device removal
> 
> 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@xxxxxxxxxx>
> Fixes: bebd031866ca ("xprtrdma: Support unplugging an HCA ...")
> Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx>
> ---
>  net/sunrpc/xprtrdma/verbs.c |    6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c
> index bb56b9d..e6f84a6 100644
> --- a/net/sunrpc/xprtrdma/verbs.c
> +++ b/net/sunrpc/xprtrdma/verbs.c
> @@ -1502,6 +1502,9 @@ struct rpcrdma_regbuf *  static void
> rpcrdma_dma_unmap_regbuf(struct rpcrdma_regbuf *rb)  {
> +	if (!rb)
> +		return;
> +
>  	if (!rpcrdma_regbuf_is_mapped(rb))
>  		return;
> 
> @@ -1517,9 +1520,6 @@ struct rpcrdma_regbuf *  void
> rpcrdma_free_regbuf(struct rpcrdma_regbuf *rb)  {
> -	if (!rb)
> -		return;
> -
>  	rpcrdma_dma_unmap_regbuf(rb);
>  	kfree(rb);
>  }
Thanks,
Tested-by: Michal Kalderon <Michal.Kalderon@xxxxxxxxxx>

��.n��������+%������w��{.n�����{���fk��ܨ}���Ơz�j:+v�����w����ޙ��&�)ߡ�a����z�ޗ���ݢj��w�f




[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux