diff mbox series

RDMA/rxe: Fix configuration of atomic queue pair attributes

Message ID 20200217205714.26937-1-bvanassche@acm.org (mailing list archive)
State Mainlined
Commit fb3063d31995cc4cf1d47a406bb61d6fb1b1d58d
Delegated to: Jason Gunthorpe
Headers show
Series RDMA/rxe: Fix configuration of atomic queue pair attributes | expand

Commit Message

Bart Van Assche Feb. 17, 2020, 8:57 p.m. UTC
From the comment above the definition of the roundup_pow_of_two() macro:

     The result is undefined when n == 0.

Hence only pass positive values to roundup_pow_of_two(). This patch fixes
the following UBSAN complaint:

UBSAN: Undefined behaviour in ./include/linux/log2.h:57:13
shift exponent 64 is too large for 64-bit type 'long unsigned int'
Call Trace:
 dump_stack+0xa5/0xe6
 ubsan_epilogue+0x9/0x26
 __ubsan_handle_shift_out_of_bounds.cold+0x4c/0xf9
 rxe_qp_from_attr.cold+0x37/0x5d [rdma_rxe]
 rxe_modify_qp+0x59/0x70 [rdma_rxe]
 _ib_modify_qp+0x5aa/0x7c0 [ib_core]
 ib_modify_qp+0x3b/0x50 [ib_core]
 cma_modify_qp_rtr+0x234/0x260 [rdma_cm]
 __rdma_accept+0x1a7/0x650 [rdma_cm]
 nvmet_rdma_cm_handler+0x1286/0x14cd [nvmet_rdma]
 cma_cm_event_handler+0x6b/0x330 [rdma_cm]
 cma_ib_req_handler+0xe60/0x22d0 [rdma_cm]
 cm_process_work+0x30/0x140 [ib_cm]
 cm_req_handler+0x11f4/0x1cd0 [ib_cm]
 cm_work_handler+0xb8/0x344e [ib_cm]
 process_one_work+0x569/0xb60
 worker_thread+0x7a/0x5d0
 kthread+0x1e6/0x210
 ret_from_fork+0x24/0x30

Cc: Moni Shoua <monis@mellanox.com>
Fixes: 8700e3e7c485 ("Soft RoCE driver")
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/infiniband/sw/rxe/rxe_qp.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

Comments

Zhu Yanjun Feb. 18, 2020, 9:53 a.m. UTC | #1
Sorry, when max_rd_atomic will be set to 0?

Thanks,
Zhu Yanjun

On Tue, Feb 18, 2020 at 4:59 AM Bart Van Assche <bvanassche@acm.org> wrote:
>
> From the comment above the definition of the roundup_pow_of_two() macro:
>
>      The result is undefined when n == 0.
>
> Hence only pass positive values to roundup_pow_of_two(). This patch fixes
> the following UBSAN complaint:
>
> UBSAN: Undefined behaviour in ./include/linux/log2.h:57:13
> shift exponent 64 is too large for 64-bit type 'long unsigned int'
> Call Trace:
>  dump_stack+0xa5/0xe6
>  ubsan_epilogue+0x9/0x26
>  __ubsan_handle_shift_out_of_bounds.cold+0x4c/0xf9
>  rxe_qp_from_attr.cold+0x37/0x5d [rdma_rxe]
>  rxe_modify_qp+0x59/0x70 [rdma_rxe]
>  _ib_modify_qp+0x5aa/0x7c0 [ib_core]
>  ib_modify_qp+0x3b/0x50 [ib_core]
>  cma_modify_qp_rtr+0x234/0x260 [rdma_cm]
>  __rdma_accept+0x1a7/0x650 [rdma_cm]
>  nvmet_rdma_cm_handler+0x1286/0x14cd [nvmet_rdma]
>  cma_cm_event_handler+0x6b/0x330 [rdma_cm]
>  cma_ib_req_handler+0xe60/0x22d0 [rdma_cm]
>  cm_process_work+0x30/0x140 [ib_cm]
>  cm_req_handler+0x11f4/0x1cd0 [ib_cm]
>  cm_work_handler+0xb8/0x344e [ib_cm]
>  process_one_work+0x569/0xb60
>  worker_thread+0x7a/0x5d0
>  kthread+0x1e6/0x210
>  ret_from_fork+0x24/0x30
>
> Cc: Moni Shoua <monis@mellanox.com>
> Fixes: 8700e3e7c485 ("Soft RoCE driver")
> Signed-off-by: Bart Van Assche <bvanassche@acm.org>
> ---
>  drivers/infiniband/sw/rxe/rxe_qp.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c b/drivers/infiniband/sw/rxe/rxe_qp.c
> index ec21f616ac98..6c11c3aeeca6 100644
> --- a/drivers/infiniband/sw/rxe/rxe_qp.c
> +++ b/drivers/infiniband/sw/rxe/rxe_qp.c
> @@ -590,15 +590,16 @@ int rxe_qp_from_attr(struct rxe_qp *qp, struct ib_qp_attr *attr, int mask,
>         int err;
>
>         if (mask & IB_QP_MAX_QP_RD_ATOMIC) {
> -               int max_rd_atomic = __roundup_pow_of_two(attr->max_rd_atomic);
> +               int max_rd_atomic = attr->max_rd_atomic ?
> +                       roundup_pow_of_two(attr->max_rd_atomic) : 0;
>
>                 qp->attr.max_rd_atomic = max_rd_atomic;
>                 atomic_set(&qp->req.rd_atomic, max_rd_atomic);
>         }
>
>         if (mask & IB_QP_MAX_DEST_RD_ATOMIC) {
> -               int max_dest_rd_atomic =
> -                       __roundup_pow_of_two(attr->max_dest_rd_atomic);
> +               int max_dest_rd_atomic = attr->max_dest_rd_atomic ?
> +                       roundup_pow_of_two(attr->max_dest_rd_atomic) : 0;
>
>                 qp->attr.max_dest_rd_atomic = max_dest_rd_atomic;
>
Leon Romanovsky Feb. 18, 2020, 1:09 p.m. UTC | #2
On Tue, Feb 18, 2020 at 05:53:56PM +0800, Zhu Yanjun wrote:
> Sorry, when max_rd_atomic will be set to 0?

User can set it.
ib_uverbs_ex_modify_qp()
 -> modify_qp()
  -> ib_modify_qp_with_udata()
   -> _ib_modify_qp()
    -> ib_security_modify_qp()
     -> .modify_q()
      -> rxe_modify_qp()
       -> rxe_qp_from_attr()

>
> Thanks,
> Zhu Yanjun
>
> On Tue, Feb 18, 2020 at 4:59 AM Bart Van Assche <bvanassche@acm.org> wrote:
> >
> > From the comment above the definition of the roundup_pow_of_two() macro:
> >
> >      The result is undefined when n == 0.
> >
> > Hence only pass positive values to roundup_pow_of_two(). This patch fixes
> > the following UBSAN complaint:
> >
> > UBSAN: Undefined behaviour in ./include/linux/log2.h:57:13
> > shift exponent 64 is too large for 64-bit type 'long unsigned int'
> > Call Trace:
> >  dump_stack+0xa5/0xe6
> >  ubsan_epilogue+0x9/0x26
> >  __ubsan_handle_shift_out_of_bounds.cold+0x4c/0xf9
> >  rxe_qp_from_attr.cold+0x37/0x5d [rdma_rxe]
> >  rxe_modify_qp+0x59/0x70 [rdma_rxe]
> >  _ib_modify_qp+0x5aa/0x7c0 [ib_core]
> >  ib_modify_qp+0x3b/0x50 [ib_core]
> >  cma_modify_qp_rtr+0x234/0x260 [rdma_cm]
> >  __rdma_accept+0x1a7/0x650 [rdma_cm]
> >  nvmet_rdma_cm_handler+0x1286/0x14cd [nvmet_rdma]
> >  cma_cm_event_handler+0x6b/0x330 [rdma_cm]
> >  cma_ib_req_handler+0xe60/0x22d0 [rdma_cm]
> >  cm_process_work+0x30/0x140 [ib_cm]
> >  cm_req_handler+0x11f4/0x1cd0 [ib_cm]
> >  cm_work_handler+0xb8/0x344e [ib_cm]
> >  process_one_work+0x569/0xb60
> >  worker_thread+0x7a/0x5d0
> >  kthread+0x1e6/0x210
> >  ret_from_fork+0x24/0x30
> >
> > Cc: Moni Shoua <monis@mellanox.com>
> > Fixes: 8700e3e7c485 ("Soft RoCE driver")
> > Signed-off-by: Bart Van Assche <bvanassche@acm.org>
> > ---
> >  drivers/infiniband/sw/rxe/rxe_qp.c | 7 ++++---
> >  1 file changed, 4 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c b/drivers/infiniband/sw/rxe/rxe_qp.c
> > index ec21f616ac98..6c11c3aeeca6 100644
> > --- a/drivers/infiniband/sw/rxe/rxe_qp.c
> > +++ b/drivers/infiniband/sw/rxe/rxe_qp.c
> > @@ -590,15 +590,16 @@ int rxe_qp_from_attr(struct rxe_qp *qp, struct ib_qp_attr *attr, int mask,
> >         int err;
> >
> >         if (mask & IB_QP_MAX_QP_RD_ATOMIC) {
> > -               int max_rd_atomic = __roundup_pow_of_two(attr->max_rd_atomic);
> > +               int max_rd_atomic = attr->max_rd_atomic ?
> > +                       roundup_pow_of_two(attr->max_rd_atomic) : 0;
> >
> >                 qp->attr.max_rd_atomic = max_rd_atomic;
> >                 atomic_set(&qp->req.rd_atomic, max_rd_atomic);
> >         }
> >
> >         if (mask & IB_QP_MAX_DEST_RD_ATOMIC) {
> > -               int max_dest_rd_atomic =
> > -                       __roundup_pow_of_two(attr->max_dest_rd_atomic);
> > +               int max_dest_rd_atomic = attr->max_dest_rd_atomic ?
> > +                       roundup_pow_of_two(attr->max_dest_rd_atomic) : 0;
> >
> >                 qp->attr.max_dest_rd_atomic = max_dest_rd_atomic;
> >
Zhu Yanjun Feb. 19, 2020, 12:50 a.m. UTC | #3
Thanks. I am fine with it.

On Tue, Feb 18, 2020 at 9:09 PM Leon Romanovsky <leonro@mellanox.com> wrote:
>
> On Tue, Feb 18, 2020 at 05:53:56PM +0800, Zhu Yanjun wrote:
> > Sorry, when max_rd_atomic will be set to 0?
>
> User can set it.
> ib_uverbs_ex_modify_qp()
>  -> modify_qp()
>   -> ib_modify_qp_with_udata()
>    -> _ib_modify_qp()
>     -> ib_security_modify_qp()
>      -> .modify_q()
>       -> rxe_modify_qp()
>        -> rxe_qp_from_attr()
>
> >
> > Thanks,
> > Zhu Yanjun
> >
> > On Tue, Feb 18, 2020 at 4:59 AM Bart Van Assche <bvanassche@acm.org> wrote:
> > >
> > > From the comment above the definition of the roundup_pow_of_two() macro:
> > >
> > >      The result is undefined when n == 0.
> > >
> > > Hence only pass positive values to roundup_pow_of_two(). This patch fixes
> > > the following UBSAN complaint:
> > >
> > > UBSAN: Undefined behaviour in ./include/linux/log2.h:57:13
> > > shift exponent 64 is too large for 64-bit type 'long unsigned int'
> > > Call Trace:
> > >  dump_stack+0xa5/0xe6
> > >  ubsan_epilogue+0x9/0x26
> > >  __ubsan_handle_shift_out_of_bounds.cold+0x4c/0xf9
> > >  rxe_qp_from_attr.cold+0x37/0x5d [rdma_rxe]
> > >  rxe_modify_qp+0x59/0x70 [rdma_rxe]
> > >  _ib_modify_qp+0x5aa/0x7c0 [ib_core]
> > >  ib_modify_qp+0x3b/0x50 [ib_core]
> > >  cma_modify_qp_rtr+0x234/0x260 [rdma_cm]
> > >  __rdma_accept+0x1a7/0x650 [rdma_cm]
> > >  nvmet_rdma_cm_handler+0x1286/0x14cd [nvmet_rdma]
> > >  cma_cm_event_handler+0x6b/0x330 [rdma_cm]
> > >  cma_ib_req_handler+0xe60/0x22d0 [rdma_cm]
> > >  cm_process_work+0x30/0x140 [ib_cm]
> > >  cm_req_handler+0x11f4/0x1cd0 [ib_cm]
> > >  cm_work_handler+0xb8/0x344e [ib_cm]
> > >  process_one_work+0x569/0xb60
> > >  worker_thread+0x7a/0x5d0
> > >  kthread+0x1e6/0x210
> > >  ret_from_fork+0x24/0x30
> > >
> > > Cc: Moni Shoua <monis@mellanox.com>
> > > Fixes: 8700e3e7c485 ("Soft RoCE driver")
> > > Signed-off-by: Bart Van Assche <bvanassche@acm.org>
> > > ---
> > >  drivers/infiniband/sw/rxe/rxe_qp.c | 7 ++++---
> > >  1 file changed, 4 insertions(+), 3 deletions(-)
> > >
> > > diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c b/drivers/infiniband/sw/rxe/rxe_qp.c
> > > index ec21f616ac98..6c11c3aeeca6 100644
> > > --- a/drivers/infiniband/sw/rxe/rxe_qp.c
> > > +++ b/drivers/infiniband/sw/rxe/rxe_qp.c
> > > @@ -590,15 +590,16 @@ int rxe_qp_from_attr(struct rxe_qp *qp, struct ib_qp_attr *attr, int mask,
> > >         int err;
> > >
> > >         if (mask & IB_QP_MAX_QP_RD_ATOMIC) {
> > > -               int max_rd_atomic = __roundup_pow_of_two(attr->max_rd_atomic);
> > > +               int max_rd_atomic = attr->max_rd_atomic ?
> > > +                       roundup_pow_of_two(attr->max_rd_atomic) : 0;
> > >
> > >                 qp->attr.max_rd_atomic = max_rd_atomic;
> > >                 atomic_set(&qp->req.rd_atomic, max_rd_atomic);
> > >         }
> > >
> > >         if (mask & IB_QP_MAX_DEST_RD_ATOMIC) {
> > > -               int max_dest_rd_atomic =
> > > -                       __roundup_pow_of_two(attr->max_dest_rd_atomic);
> > > +               int max_dest_rd_atomic = attr->max_dest_rd_atomic ?
> > > +                       roundup_pow_of_two(attr->max_dest_rd_atomic) : 0;
> > >
> > >                 qp->attr.max_dest_rd_atomic = max_dest_rd_atomic;
> > >
Leon Romanovsky Feb. 19, 2020, 8:30 a.m. UTC | #4
On Wed, Feb 19, 2020 at 08:50:09AM +0800, Zhu Yanjun wrote:
> Thanks. I am fine with it.
>

I'm fine too.

Thanks,
Reviewed-by: Leon Romanovsky <leonro@mellanox.com>
Jason Gunthorpe Feb. 19, 2020, 8:58 p.m. UTC | #5
On Mon, Feb 17, 2020 at 12:57:14PM -0800, Bart Van Assche wrote:
> >From the comment above the definition of the roundup_pow_of_two() macro:
> 
>      The result is undefined when n == 0.
> 
> Hence only pass positive values to roundup_pow_of_two(). This patch fixes
> the following UBSAN complaint:
> 
> UBSAN: Undefined behaviour in ./include/linux/log2.h:57:13
> shift exponent 64 is too large for 64-bit type 'long unsigned int'
> Call Trace:
>  dump_stack+0xa5/0xe6
>  ubsan_epilogue+0x9/0x26
>  __ubsan_handle_shift_out_of_bounds.cold+0x4c/0xf9
>  rxe_qp_from_attr.cold+0x37/0x5d [rdma_rxe]
>  rxe_modify_qp+0x59/0x70 [rdma_rxe]
>  _ib_modify_qp+0x5aa/0x7c0 [ib_core]
>  ib_modify_qp+0x3b/0x50 [ib_core]
>  cma_modify_qp_rtr+0x234/0x260 [rdma_cm]
>  __rdma_accept+0x1a7/0x650 [rdma_cm]
>  nvmet_rdma_cm_handler+0x1286/0x14cd [nvmet_rdma]
>  cma_cm_event_handler+0x6b/0x330 [rdma_cm]
>  cma_ib_req_handler+0xe60/0x22d0 [rdma_cm]
>  cm_process_work+0x30/0x140 [ib_cm]
>  cm_req_handler+0x11f4/0x1cd0 [ib_cm]
>  cm_work_handler+0xb8/0x344e [ib_cm]
>  process_one_work+0x569/0xb60
>  worker_thread+0x7a/0x5d0
>  kthread+0x1e6/0x210
>  ret_from_fork+0x24/0x30
> 
> Cc: Moni Shoua <monis@mellanox.com>
> Fixes: 8700e3e7c485 ("Soft RoCE driver")
> Signed-off-by: Bart Van Assche <bvanassche@acm.org>
> Reviewed-by: Leon Romanovsky <leonro@mellanox.com>
> ---
>  drivers/infiniband/sw/rxe/rxe_qp.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)

Applied to for-next, thanks

Jason
diff mbox series

Patch

diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c b/drivers/infiniband/sw/rxe/rxe_qp.c
index ec21f616ac98..6c11c3aeeca6 100644
--- a/drivers/infiniband/sw/rxe/rxe_qp.c
+++ b/drivers/infiniband/sw/rxe/rxe_qp.c
@@ -590,15 +590,16 @@  int rxe_qp_from_attr(struct rxe_qp *qp, struct ib_qp_attr *attr, int mask,
 	int err;
 
 	if (mask & IB_QP_MAX_QP_RD_ATOMIC) {
-		int max_rd_atomic = __roundup_pow_of_two(attr->max_rd_atomic);
+		int max_rd_atomic = attr->max_rd_atomic ?
+			roundup_pow_of_two(attr->max_rd_atomic) : 0;
 
 		qp->attr.max_rd_atomic = max_rd_atomic;
 		atomic_set(&qp->req.rd_atomic, max_rd_atomic);
 	}
 
 	if (mask & IB_QP_MAX_DEST_RD_ATOMIC) {
-		int max_dest_rd_atomic =
-			__roundup_pow_of_two(attr->max_dest_rd_atomic);
+		int max_dest_rd_atomic = attr->max_dest_rd_atomic ?
+			roundup_pow_of_two(attr->max_dest_rd_atomic) : 0;
 
 		qp->attr.max_dest_rd_atomic = max_dest_rd_atomic;