RE: [PATCH] RDMA/qedr: Use zeroing memory allocator than allocator/memset
> Use dma_zalloc_coherent for allocating zeroed > memory and remove unnecessary memset function. > > Done using Coccinelle. > Generated-by: scripts/coccinelle/api/alloc/kzalloc-simple.cocci > 0-day tested with no failures. > > Suggested-by: Luis R. Rodriguez> Signed-off-by: Himanshu Jha > --- > drivers/infiniband/hw/qedr/verbs.c | 5 ++--- > 1 file changed, 2 insertions(+), 3 deletions(-) > > diff --git a/drivers/infiniband/hw/qedr/verbs.c > b/drivers/infiniband/hw/qedr/verbs.c > index b26aa88..3b9c898 100644 > --- a/drivers/infiniband/hw/qedr/verbs.c > +++ b/drivers/infiniband/hw/qedr/verbs.c > @@ -604,12 +604,11 @@ static struct qedr_pbl *qedr_alloc_pbl_tbl(struct > qedr_dev *dev, > return ERR_PTR(-ENOMEM); > > for (i = 0; i < pbl_info->num_pbls; i++) { > - va = dma_alloc_coherent(>dev, pbl_info->pbl_size, > - , flags); > + va = dma_zalloc_coherent(>dev, pbl_info->pbl_size, > + , flags); > if (!va) > goto err; > > - memset(va, 0, pbl_info->pbl_size); > pbl_table[i].va = va; > pbl_table[i].pa = pa; > } > -- > 2.7.4 Acked-by: Ram Amrani Thanks, Ram
RE: [PATCH] RDMA/qedr: Use zeroing memory allocator than allocator/memset
> Use dma_zalloc_coherent for allocating zeroed > memory and remove unnecessary memset function. > > Done using Coccinelle. > Generated-by: scripts/coccinelle/api/alloc/kzalloc-simple.cocci > 0-day tested with no failures. > > Suggested-by: Luis R. Rodriguez > Signed-off-by: Himanshu Jha > --- > drivers/infiniband/hw/qedr/verbs.c | 5 ++--- > 1 file changed, 2 insertions(+), 3 deletions(-) > > diff --git a/drivers/infiniband/hw/qedr/verbs.c > b/drivers/infiniband/hw/qedr/verbs.c > index b26aa88..3b9c898 100644 > --- a/drivers/infiniband/hw/qedr/verbs.c > +++ b/drivers/infiniband/hw/qedr/verbs.c > @@ -604,12 +604,11 @@ static struct qedr_pbl *qedr_alloc_pbl_tbl(struct > qedr_dev *dev, > return ERR_PTR(-ENOMEM); > > for (i = 0; i < pbl_info->num_pbls; i++) { > - va = dma_alloc_coherent(>dev, pbl_info->pbl_size, > - , flags); > + va = dma_zalloc_coherent(>dev, pbl_info->pbl_size, > + , flags); > if (!va) > goto err; > > - memset(va, 0, pbl_info->pbl_size); > pbl_table[i].va = va; > pbl_table[i].pa = pa; > } > -- > 2.7.4 Acked-by: Ram Amrani Thanks, Ram
RE: [PATCH AUTOSEL for 4.9 37/54] RDMA/qedr: Fix RDMA CM loopback
> From: Ram Amrani> > [ Upstream commit af2b14b8b8ae21b0047a52c767ac8b44f435a280 ] > > The loopback logic in RDMA CM packets compares Ethernet addresses and > was accidently inverse. > > Signed-off-by: Ram Amrani > Signed-off-by: Ariel Elior > Signed-off-by: Doug Ledford > Signed-off-by: Sasha Levin > --- > drivers/infiniband/hw/qedr/qedr_cm.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/infiniband/hw/qedr/qedr_cm.c > b/drivers/infiniband/hw/qedr/qedr_cm.c > index 63890ebb72bd..eccf7039aaca 100644 > --- a/drivers/infiniband/hw/qedr/qedr_cm.c > +++ b/drivers/infiniband/hw/qedr/qedr_cm.c > @@ -404,9 +404,9 @@ static inline int qedr_gsi_build_packet(struct qedr_dev > *dev, > } > > if (ether_addr_equal(udh.eth.smac_h, udh.eth.dmac_h)) > - packet->tx_dest = QED_ROCE_LL2_TX_DEST_NW; > - else > packet->tx_dest = QED_ROCE_LL2_TX_DEST_LB; > + else > + packet->tx_dest = QED_ROCE_LL2_TX_DEST_NW; > > packet->roce_mode = roce_mode; > memcpy(packet->header.vaddr, ud_header_buffer, header_size); > -- > 2.11.0 Thanks! Acked-by: Ram Amrani
RE: [PATCH AUTOSEL for 4.9 37/54] RDMA/qedr: Fix RDMA CM loopback
> From: Ram Amrani > > [ Upstream commit af2b14b8b8ae21b0047a52c767ac8b44f435a280 ] > > The loopback logic in RDMA CM packets compares Ethernet addresses and > was accidently inverse. > > Signed-off-by: Ram Amrani > Signed-off-by: Ariel Elior > Signed-off-by: Doug Ledford > Signed-off-by: Sasha Levin > --- > drivers/infiniband/hw/qedr/qedr_cm.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/infiniband/hw/qedr/qedr_cm.c > b/drivers/infiniband/hw/qedr/qedr_cm.c > index 63890ebb72bd..eccf7039aaca 100644 > --- a/drivers/infiniband/hw/qedr/qedr_cm.c > +++ b/drivers/infiniband/hw/qedr/qedr_cm.c > @@ -404,9 +404,9 @@ static inline int qedr_gsi_build_packet(struct qedr_dev > *dev, > } > > if (ether_addr_equal(udh.eth.smac_h, udh.eth.dmac_h)) > - packet->tx_dest = QED_ROCE_LL2_TX_DEST_NW; > - else > packet->tx_dest = QED_ROCE_LL2_TX_DEST_LB; > + else > + packet->tx_dest = QED_ROCE_LL2_TX_DEST_NW; > > packet->roce_mode = roce_mode; > memcpy(packet->header.vaddr, ud_header_buffer, header_size); > -- > 2.11.0 Thanks! Acked-by: Ram Amrani
RE: [PATCH] rdma: Add Jason as a co-maintainer
> Hello Doug and Jason, > > Thanks Doug for having added a co-maintainer. Jason, thank you for willing > to be a co-maintainer. > > Best regards, > > Bart.N I echo that, thank you both! Ram
RE: [PATCH] rdma: Add Jason as a co-maintainer
> Hello Doug and Jason, > > Thanks Doug for having added a co-maintainer. Jason, thank you for willing > to be a co-maintainer. > > Best regards, > > Bart.N I echo that, thank you both! Ram
RE: [PATCH] RDMA/qedr: fix spelling mistake: "invlaid" -> "invalid"
> From: Colin Ian King> > Trivial fix to spelling mistake in DP_ERR error message > > Signed-off-by: Colin Ian King > --- > drivers/infiniband/hw/qedr/verbs.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/infiniband/hw/qedr/verbs.c > b/drivers/infiniband/hw/qedr/verbs.c > index 4e14a558734b..9612aaa9fbbb 100644 > --- a/drivers/infiniband/hw/qedr/verbs.c > +++ b/drivers/infiniband/hw/qedr/verbs.c > @@ -510,7 +510,7 @@ struct ib_pd *qedr_alloc_pd(struct ib_device *ibdev, >(udata && context) ? "User Lib" : "Kernel"); > > if (!dev->rdma_ctx) { > - DP_ERR(dev, "invlaid RDMA context\n"); > + DP_ERR(dev, "invalid RDMA context\n"); > return ERR_PTR(-EINVAL); > } > > -- > 2.14.1 Thanks, Reviewed-by: Ram Amrani
RE: [PATCH] RDMA/qedr: fix spelling mistake: "invlaid" -> "invalid"
> From: Colin Ian King > > Trivial fix to spelling mistake in DP_ERR error message > > Signed-off-by: Colin Ian King > --- > drivers/infiniband/hw/qedr/verbs.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/infiniband/hw/qedr/verbs.c > b/drivers/infiniband/hw/qedr/verbs.c > index 4e14a558734b..9612aaa9fbbb 100644 > --- a/drivers/infiniband/hw/qedr/verbs.c > +++ b/drivers/infiniband/hw/qedr/verbs.c > @@ -510,7 +510,7 @@ struct ib_pd *qedr_alloc_pd(struct ib_device *ibdev, >(udata && context) ? "User Lib" : "Kernel"); > > if (!dev->rdma_ctx) { > - DP_ERR(dev, "invlaid RDMA context\n"); > + DP_ERR(dev, "invalid RDMA context\n"); > return ERR_PTR(-EINVAL); > } > > -- > 2.14.1 Thanks, Reviewed-by: Ram Amrani
RE: [PATCH V2] rxe: Fix a sleep-in-atomic bug in post_one_send
> The driver may sleep under a spin lock, and the function call path is: > post_one_send (acquire the lock by spin_lock_irqsave) > init_send_wqe > copy_from_user --> may sleep > > To fix it, the lock is released before copy_from_user, and the lock is > acquired again after this function. The parameter "flags" is used to > restore and save the irq status. > Thank Leon for good advice. > ... > init_send_wr(qp, >wr, ibwr); > @@ -742,7 +742,12 @@ static int init_send_wqe(struct rxe_qp *qp, struct > ib_send_wr *ibwr, > for (i = 0; i < num_sge; i++, sge++) { > if (qp->is_user && copy_from_user(p, (__user void *) > (uintptr_t)sge->addr, sge->length)) > - return -EFAULT; > + spin_unlock_irqrestore(>sq.sq_lock, *flags); > + err = copy_from_user(p, (__user void *) > + (uintptr_t)sge->addr, sge->length); > + spin_lock_irqsave(>sq.sq_lock, *flags); > + if (qp->is_user && err) > + return -EFAULT; > > else if (!qp->is_user) > memcpy(p, (void *)(uintptr_t)sge->addr, This isn't my area of expertise. Still something seems weird. You are still calling 'copy_from_user' unprotected in the 'if'. Also, did you mean to use curly brackets on the indented part after the first if?! Ram
RE: [PATCH V2] rxe: Fix a sleep-in-atomic bug in post_one_send
> The driver may sleep under a spin lock, and the function call path is: > post_one_send (acquire the lock by spin_lock_irqsave) > init_send_wqe > copy_from_user --> may sleep > > To fix it, the lock is released before copy_from_user, and the lock is > acquired again after this function. The parameter "flags" is used to > restore and save the irq status. > Thank Leon for good advice. > ... > init_send_wr(qp, >wr, ibwr); > @@ -742,7 +742,12 @@ static int init_send_wqe(struct rxe_qp *qp, struct > ib_send_wr *ibwr, > for (i = 0; i < num_sge; i++, sge++) { > if (qp->is_user && copy_from_user(p, (__user void *) > (uintptr_t)sge->addr, sge->length)) > - return -EFAULT; > + spin_unlock_irqrestore(>sq.sq_lock, *flags); > + err = copy_from_user(p, (__user void *) > + (uintptr_t)sge->addr, sge->length); > + spin_lock_irqsave(>sq.sq_lock, *flags); > + if (qp->is_user && err) > + return -EFAULT; > > else if (!qp->is_user) > memcpy(p, (void *)(uintptr_t)sge->addr, This isn't my area of expertise. Still something seems weird. You are still calling 'copy_from_user' unprotected in the 'if'. Also, did you mean to use curly brackets on the indented part after the first if?! Ram
RE: [PATCH] infiniband: hw: qedr: add null check before pointer dereference
> Add null check before dereferencing pointer sgid_attr.ndev > inside function rdma_vlan_dev_vlan_id(). > > Addresses-Coverity-ID: 1373979 > Signed-off-by: Gustavo A. R. Silva> --- > drivers/infiniband/hw/qedr/qedr_cm.c | 10 ++ > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/drivers/infiniband/hw/qedr/qedr_cm.c > b/drivers/infiniband/hw/qedr/qedr_cm.c > index 3d7705c..d86dbe8 100644 > --- a/drivers/infiniband/hw/qedr/qedr_cm.c > +++ b/drivers/infiniband/hw/qedr/qedr_cm.c > @@ -270,11 +270,13 @@ static inline int qedr_gsi_build_header(struct qedr_dev > *dev, > return rc; > } > > - vlan_id = rdma_vlan_dev_vlan_id(sgid_attr.ndev); > - if (vlan_id < VLAN_CFI_MASK) > - has_vlan = true; > - if (sgid_attr.ndev) > + if (sgid_attr.ndev) { > + vlan_id = rdma_vlan_dev_vlan_id(sgid_attr.ndev); > + if (vlan_id < VLAN_CFI_MASK) > + has_vlan = true; > + > dev_put(sgid_attr.ndev); > + } > > if (!memcmp(, , sizeof(sgid))) { > DP_ERR(dev, "gsi post send: GID not found GID index %d\n", > -- > 2.5.0 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-rdma" in > the body of a message to majord...@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html Thanks. Acked-by: Ram Amrani
RE: [PATCH] infiniband: hw: qedr: add null check before pointer dereference
> Add null check before dereferencing pointer sgid_attr.ndev > inside function rdma_vlan_dev_vlan_id(). > > Addresses-Coverity-ID: 1373979 > Signed-off-by: Gustavo A. R. Silva > --- > drivers/infiniband/hw/qedr/qedr_cm.c | 10 ++ > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/drivers/infiniband/hw/qedr/qedr_cm.c > b/drivers/infiniband/hw/qedr/qedr_cm.c > index 3d7705c..d86dbe8 100644 > --- a/drivers/infiniband/hw/qedr/qedr_cm.c > +++ b/drivers/infiniband/hw/qedr/qedr_cm.c > @@ -270,11 +270,13 @@ static inline int qedr_gsi_build_header(struct qedr_dev > *dev, > return rc; > } > > - vlan_id = rdma_vlan_dev_vlan_id(sgid_attr.ndev); > - if (vlan_id < VLAN_CFI_MASK) > - has_vlan = true; > - if (sgid_attr.ndev) > + if (sgid_attr.ndev) { > + vlan_id = rdma_vlan_dev_vlan_id(sgid_attr.ndev); > + if (vlan_id < VLAN_CFI_MASK) > + has_vlan = true; > + > dev_put(sgid_attr.ndev); > + } > > if (!memcmp(, , sizeof(sgid))) { > DP_ERR(dev, "gsi post send: GID not found GID index %d\n", > -- > 2.5.0 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-rdma" in > the body of a message to majord...@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html Thanks. Acked-by: Ram Amrani
RE: [PATCH] infiniband: hw: qedr: add null check before pointer dereference
> + Ram, > > Ram, IB part of qedr driver doesn't exist in MAINTAINERS file. > Weird. I'll fix it. Thanks, Ram
RE: [PATCH] infiniband: hw: qedr: add null check before pointer dereference
> + Ram, > > Ram, IB part of qedr driver doesn't exist in MAINTAINERS file. > Weird. I'll fix it. Thanks, Ram
RE: [PATCH] RDMA/qedr: Fix some error handling
> 'qedr_alloc_pbl_tbl()' can not return NULL. > > In qedr_init_user_queue(): > - simplify the test for the return value, no need to test for NULL > - propagate the error pointer if needed, otherwise 0 (success) is returned. >This is spurious. > > In init_mr_info(): > - test the return value with IS_ERR > - propagate the error pointer if needed instead of an exlictit -ENOMEM. >This is a no-op as the only error pointer that we can have here is >already -ENOMEM > > Signed-off-by: Christophe JAILLET> --- > drivers/infiniband/hw/qedr/verbs.c | 10 ++ > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/drivers/infiniband/hw/qedr/verbs.c > b/drivers/infiniband/hw/qedr/verbs.c > index ef83a3f322d6..0c51657af151 100644 > --- a/drivers/infiniband/hw/qedr/verbs.c > +++ b/drivers/infiniband/hw/qedr/verbs.c > @@ -771,8 +771,10 @@ static inline int qedr_init_user_queue(struct > ib_ucontext *ib_ctx, > goto err0; > > q->pbl_tbl = qedr_alloc_pbl_tbl(dev, >pbl_info, GFP_KERNEL); > - if (IS_ERR_OR_NULL(q->pbl_tbl)) > + if (IS_ERR(q->pbl_tbl)) { > + rc = PTR_ERR(q->pbl_tbl); > goto err0; > + } > > qedr_populate_pbls(dev, q->umem, q->pbl_tbl, >pbl_info); > > @@ -2105,8 +2107,8 @@ static int init_mr_info(struct qedr_dev *dev, struct > mr_info *info, > goto done; > > info->pbl_table = qedr_alloc_pbl_tbl(dev, >pbl_info, GFP_KERNEL); > - if (!info->pbl_table) { > - rc = -ENOMEM; > + if (IS_ERR(info->pbl_table)) { > + rc = PTR_ERR(info->pbl_table); > goto done; > } > > @@ -2117,7 +2119,7 @@ static int init_mr_info(struct qedr_dev *dev, struct > mr_info *info, >* list and allocating another one >*/ > tmp = qedr_alloc_pbl_tbl(dev, >pbl_info, GFP_KERNEL); > - if (!tmp) { > + if (IS_ERR(tmp)) { > DP_DEBUG(dev, QEDR_MSG_MR, "Extra PBL is not allocated\n"); > goto done; > } > -- > 2.9.3 Acked-by: Ram Amrani Merci
RE: [PATCH] RDMA/qedr: Fix some error handling
> 'qedr_alloc_pbl_tbl()' can not return NULL. > > In qedr_init_user_queue(): > - simplify the test for the return value, no need to test for NULL > - propagate the error pointer if needed, otherwise 0 (success) is returned. >This is spurious. > > In init_mr_info(): > - test the return value with IS_ERR > - propagate the error pointer if needed instead of an exlictit -ENOMEM. >This is a no-op as the only error pointer that we can have here is >already -ENOMEM > > Signed-off-by: Christophe JAILLET > --- > drivers/infiniband/hw/qedr/verbs.c | 10 ++ > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/drivers/infiniband/hw/qedr/verbs.c > b/drivers/infiniband/hw/qedr/verbs.c > index ef83a3f322d6..0c51657af151 100644 > --- a/drivers/infiniband/hw/qedr/verbs.c > +++ b/drivers/infiniband/hw/qedr/verbs.c > @@ -771,8 +771,10 @@ static inline int qedr_init_user_queue(struct > ib_ucontext *ib_ctx, > goto err0; > > q->pbl_tbl = qedr_alloc_pbl_tbl(dev, >pbl_info, GFP_KERNEL); > - if (IS_ERR_OR_NULL(q->pbl_tbl)) > + if (IS_ERR(q->pbl_tbl)) { > + rc = PTR_ERR(q->pbl_tbl); > goto err0; > + } > > qedr_populate_pbls(dev, q->umem, q->pbl_tbl, >pbl_info); > > @@ -2105,8 +2107,8 @@ static int init_mr_info(struct qedr_dev *dev, struct > mr_info *info, > goto done; > > info->pbl_table = qedr_alloc_pbl_tbl(dev, >pbl_info, GFP_KERNEL); > - if (!info->pbl_table) { > - rc = -ENOMEM; > + if (IS_ERR(info->pbl_table)) { > + rc = PTR_ERR(info->pbl_table); > goto done; > } > > @@ -2117,7 +2119,7 @@ static int init_mr_info(struct qedr_dev *dev, struct > mr_info *info, >* list and allocating another one >*/ > tmp = qedr_alloc_pbl_tbl(dev, >pbl_info, GFP_KERNEL); > - if (!tmp) { > + if (IS_ERR(tmp)) { > DP_DEBUG(dev, QEDR_MSG_MR, "Extra PBL is not allocated\n"); > goto done; > } > -- > 2.9.3 Acked-by: Ram Amrani Merci
RE: [PATCH] qedr: return -EINVAL if pd is null and avoid null ptr dereference
> drivers/infiniband/hw/qedr/verbs.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/drivers/infiniband/hw/qedr/verbs.c > b/drivers/infiniband/hw/qedr/verbs.c > index a615142..b2a0eb8 100644 > --- a/drivers/infiniband/hw/qedr/verbs.c > +++ b/drivers/infiniband/hw/qedr/verbs.c > @@ -511,8 +511,10 @@ int qedr_dealloc_pd(struct ib_pd *ibpd) > struct qedr_dev *dev = get_qedr_dev(ibpd->device); > struct qedr_pd *pd = get_qedr_pd(ibpd); > > - if (!pd) > + if (!pd) { > pr_err("Invalid PD received in dealloc_pd\n"); > + return -EINVAL; > + } > > DP_DEBUG(dev, QEDR_MSG_INIT, "Deallocating PD %d\n", pd->pd_id); > dev->ops->rdma_dealloc_pd(dev->rdma_ctx, pd->pd_id); > -- > 2.9.3 Thanks Colin. Acked-by: Ram Amrani
RE: [PATCH] qedr: return -EINVAL if pd is null and avoid null ptr dereference
> drivers/infiniband/hw/qedr/verbs.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/drivers/infiniband/hw/qedr/verbs.c > b/drivers/infiniband/hw/qedr/verbs.c > index a615142..b2a0eb8 100644 > --- a/drivers/infiniband/hw/qedr/verbs.c > +++ b/drivers/infiniband/hw/qedr/verbs.c > @@ -511,8 +511,10 @@ int qedr_dealloc_pd(struct ib_pd *ibpd) > struct qedr_dev *dev = get_qedr_dev(ibpd->device); > struct qedr_pd *pd = get_qedr_pd(ibpd); > > - if (!pd) > + if (!pd) { > pr_err("Invalid PD received in dealloc_pd\n"); > + return -EINVAL; > + } > > DP_DEBUG(dev, QEDR_MSG_INIT, "Deallocating PD %d\n", pd->pd_id); > dev->ops->rdma_dealloc_pd(dev->rdma_ctx, pd->pd_id); > -- > 2.9.3 Thanks Colin. Acked-by: Ram Amrani