IB/rdmavt: Use struct_size() helper
Subsystems (2)
PATCH 1/1 IB/rdmavt: Use struct_size() helper
Make use of the struct_size() helper instead of an open-coded version in order to avoid any potential type mistakes, in particular in the context in which this code is being used.
So, replace the following form:
sizeof(struct rvt_sge) * init_attr->cap.max_send_sge + sizeof(struct rvt_swqe)
with:
struct_size(swq, sg_list, init_attr->cap.max_send_sge)
and so on...
Also, notice that variable size is unnecessary, hence it is removed.
This code was detected with the help of Coccinelle.
--- drivers/infiniband/sw/rdmavt/qp.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/infiniband/sw/rdmavt/qp.c +1 -3
@@ -988,9 +988,7 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,case IB_QPT_UC :case IB_QPT_RC :case IB_QPT_UD : - sz =sizeof (struct rvt_sge ) * - init_attr->cap.max_send_sge + -sizeof (struct rvt_swqe ); + sz =struct_size (swq, sg_list, init_attr->cap.max_send_sge); swq =vzalloc_node (array_size (sz, sqsize), rdi->dparms.node);if (!swq)return ERR_PTR (-ENOMEM );
Signature · 1 line
2.21.0
Quoted 29 lines · Gustavo A. R. Silva
Make use of the
struct_size()helper instead of an open-coded version in order to avoid any potential type mistakes, in particular in the context in which this code is being used.So, replace the following form:
sizeof(struct rvt_sge)*init_attr->cap.max_send_sge+sizeof(struct rvt_swqe)with:
struct_size(swq, sg_list, init_attr->cap.max_send_sge)and so on...
Also, notice that variable size is unnecessary, hence it is removed.
This code was detected with the help of Coccinelle.
Signed-off-by Gustavo A. R. Silva <[email protected]>--- drivers/infiniband/sw/rdmavt/qp.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)drivers/infiniband/sw/rdmavt/qp.c +0
-0
drivers/infiniband/sw/rdmavt/qp.c struct ib_qp *rvt_create_qp(struct ib_pd *ibpd, · line 994
Quoted 10 lines
drivers/infiniband/sw/rdmavt/qp.c +1
-3@@ -988,9 +988,7 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,case IB_QPT_UC :case IB_QPT_RC :case IB_QPT_UD : - sz =sizeof (struct rvt_sge ) * - init_attr->cap.max_send_sge + -sizeof (struct rvt_swqe ); + sz =struct_size (swq, sg_list, init_attr->cap.max_send_sge); swq =vzalloc_node (array_size (sz, sqsize), rdi->dparms.node);if (!swq)return ERR_PTR (-ENOMEM );
Looks correct, I don't think this makes the code easier to read though. The macro name "struct_size" is misleading to me. Maybe that's just me, and in any case...
Quoted 34 lines · Dennis Dalessandro
Quoted 33 lines · Gustavo A. R. Silva
Make use of the
struct_size()helper instead of an open-coded version in order to avoid any potential type mistakes, in particular in the context in which this code is being used.So, replace the following form:
sizeof(struct rvt_sge)*init_attr->cap.max_send_sge+sizeof(struct rvt_swqe)with:
struct_size(swq, sg_list, init_attr->cap.max_send_sge)and so on...
Also, notice that variable size is unnecessary, hence it is removed.
This code was detected with the help of Coccinelle.
Signed-off-by Gustavo A. R. Silva <[email protected]>drivers/infiniband/sw/rdmavt/qp.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)drivers/infiniband/sw/rdmavt/qp.c +2
-3+++ b/drivers/infiniband/sw/rdmavt/qp.c@@ -988,9 +988,7 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,case IB_QPT_UC :case IB_QPT_RC :case IB_QPT_UD : - sz =sizeof (struct rvt_sge ) * - init_attr->cap.max_send_sge + -sizeof (struct rvt_swqe ); + sz =struct_size (swq, sg_list, init_attr->cap.max_send_sge);
Quoted 8 lines
drivers/infiniband/sw/rdmavt/qp.c struct ib_qp *rvt_create_qp(struct ib_pd *ibpd, · line 994
Quoted 4 lines
drivers/infiniband/sw/rdmavt/qp.c +0
-0swq =vzalloc_node (array_size (sz, sqsize), rdi->dparms.node);if (!swq)return ERR_PTR (-ENOMEM );Looks correct, I don't think this makes the code easier to read though. The macro name "
struct_size" is misleading to me. Maybe that's just me, and in any case...
It is struct_size because it computes the full size of a struct ending in a variable length array with N items.
The previous code was wonky because it assumes that struct rvt_swqe is the underlying type of sg_list, while the new version gets the type information automatically.
Jason
Jason Gunthorpe
AppliedQuoted 16 lines · Gustavo A. R. Silva
Make use of the
struct_size()helper instead of an open-coded version in order to avoid any potential type mistakes, in particular in the context in which this code is being used.So, replace the following form:
sizeof(struct rvt_sge)*init_attr->cap.max_send_sge+sizeof(struct rvt_swqe)with:
struct_size(swq, sg_list, init_attr->cap.max_send_sge)and so on...
Also, notice that variable size is unnecessary, hence it is removed.
Quoted 7 lines
This code was detected with the help of Coccinelle.
Signed-off-by Gustavo A. R. Silva <[email protected]>Reviewed-by Dennis Dalessandro <[email protected]>--- drivers/infiniband/sw/rdmavt/qp.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
Applied to for-next, thanks
Jason