aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2016-10-24 16:48:21 -0400
committerDoug Ledford <dledford@redhat.com>2016-12-14 12:12:53 -0500
commit14ab8896f5d993c5f427504276e3c42ccb3cc354 (patch)
tree7648d6b3938a4eaed8b288b162bb6db4b46f242c
parent7d29f349a4b9dcf5bc9dcc05630d6a7f6b6b3ccd (diff)
IB/mlx5: avoid bogus -Wmaybe-uninitialized warning
We get a false-positive warning in linux-next for the mlx5 driver: infiniband/hw/mlx5/mr.c: In function ‘mlx5_ib_reg_user_mr’: infiniband/hw/mlx5/mr.c:1172:5: error: ‘order’ may be used uninitialized in this function [-Werror=maybe-uninitialized] infiniband/hw/mlx5/mr.c:1161:6: note: ‘order’ was declared here infiniband/hw/mlx5/mr.c:1173:6: error: ‘ncont’ may be used uninitialized in this function [-Werror=maybe-uninitialized] infiniband/hw/mlx5/mr.c:1160:6: note: ‘ncont’ was declared here infiniband/hw/mlx5/mr.c:1173:6: error: ‘page_shift’ may be used uninitialized in this function [-Werror=maybe-uninitialized] infiniband/hw/mlx5/mr.c:1158:6: note: ‘page_shift’ was declared here infiniband/hw/mlx5/mr.c:1143:13: error: ‘npages’ may be used uninitialized in this function [-Werror=maybe-uninitialized] infiniband/hw/mlx5/mr.c:1159:6: note: ‘npages’ was declared here I had a trivial workaround for gcc-5 or higher, but that didn't work on gcc-4.9 unfortunately. The only way I found to avoid the warnings for gcc-4.9, short of initializing each of the arguments first was to change the calling conventions to separate the error code from the umem pointer. This avoids casting the error codes from one pointer to another incompatible pointer, and lets gcc figure out when that the data is actually valid whenever we return successfully. Acked-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r--drivers/infiniband/hw/mlx5/mr.c39
1 files changed, 21 insertions, 18 deletions
diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c
index 5258ac870e6a..67985c69f9b9 100644
--- a/drivers/infiniband/hw/mlx5/mr.c
+++ b/drivers/infiniband/hw/mlx5/mr.c
@@ -844,30 +844,34 @@ static void prep_umr_unreg_wqe(struct mlx5_ib_dev *dev,
844 umrwr->mkey = key; 844 umrwr->mkey = key;
845} 845}
846 846
847static struct ib_umem *mr_umem_get(struct ib_pd *pd, u64 start, u64 length, 847static int mr_umem_get(struct ib_pd *pd, u64 start, u64 length,
848 int access_flags, int *npages, 848 int access_flags, struct ib_umem **umem,
849 int *page_shift, int *ncont, int *order) 849 int *npages, int *page_shift, int *ncont,
850 int *order)
850{ 851{
851 struct mlx5_ib_dev *dev = to_mdev(pd->device); 852 struct mlx5_ib_dev *dev = to_mdev(pd->device);
852 struct ib_umem *umem = ib_umem_get(pd->uobject->context, start, length, 853 int err;
853 access_flags, 0); 854
854 if (IS_ERR(umem)) { 855 *umem = ib_umem_get(pd->uobject->context, start, length,
856 access_flags, 0);
857 err = PTR_ERR_OR_ZERO(*umem);
858 if (err < 0) {
855 mlx5_ib_err(dev, "umem get failed (%ld)\n", PTR_ERR(umem)); 859 mlx5_ib_err(dev, "umem get failed (%ld)\n", PTR_ERR(umem));
856 return (void *)umem; 860 return err;
857 } 861 }
858 862
859 mlx5_ib_cont_pages(umem, start, MLX5_MKEY_PAGE_SHIFT_MASK, npages, 863 mlx5_ib_cont_pages(*umem, start, MLX5_MKEY_PAGE_SHIFT_MASK, npages,
860 page_shift, ncont, order); 864 page_shift, ncont, order);
861 if (!*npages) { 865 if (!*npages) {
862 mlx5_ib_warn(dev, "avoid zero region\n"); 866 mlx5_ib_warn(dev, "avoid zero region\n");
863 ib_umem_release(umem); 867 ib_umem_release(*umem);
864 return ERR_PTR(-EINVAL); 868 return -EINVAL;
865 } 869 }
866 870
867 mlx5_ib_dbg(dev, "npages %d, ncont %d, order %d, page_shift %d\n", 871 mlx5_ib_dbg(dev, "npages %d, ncont %d, order %d, page_shift %d\n",
868 *npages, *ncont, *order, *page_shift); 872 *npages, *ncont, *order, *page_shift);
869 873
870 return umem; 874 return 0;
871} 875}
872 876
873static void mlx5_ib_umr_done(struct ib_cq *cq, struct ib_wc *wc) 877static void mlx5_ib_umr_done(struct ib_cq *cq, struct ib_wc *wc)
@@ -1193,11 +1197,11 @@ struct ib_mr *mlx5_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
1193 1197
1194 mlx5_ib_dbg(dev, "start 0x%llx, virt_addr 0x%llx, length 0x%llx, access_flags 0x%x\n", 1198 mlx5_ib_dbg(dev, "start 0x%llx, virt_addr 0x%llx, length 0x%llx, access_flags 0x%x\n",
1195 start, virt_addr, length, access_flags); 1199 start, virt_addr, length, access_flags);
1196 umem = mr_umem_get(pd, start, length, access_flags, &npages, 1200 err = mr_umem_get(pd, start, length, access_flags, &umem, &npages,
1197 &page_shift, &ncont, &order); 1201 &page_shift, &ncont, &order);
1198 1202
1199 if (IS_ERR(umem)) 1203 if (err < 0)
1200 return (void *)umem; 1204 return ERR_PTR(err);
1201 1205
1202 if (use_umr(order)) { 1206 if (use_umr(order)) {
1203 mr = reg_umr(pd, umem, virt_addr, length, ncont, page_shift, 1207 mr = reg_umr(pd, umem, virt_addr, length, ncont, page_shift,
@@ -1371,10 +1375,9 @@ int mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start,
1371 */ 1375 */
1372 flags |= IB_MR_REREG_TRANS; 1376 flags |= IB_MR_REREG_TRANS;
1373 ib_umem_release(mr->umem); 1377 ib_umem_release(mr->umem);
1374 mr->umem = mr_umem_get(pd, addr, len, access_flags, &npages, 1378 err = mr_umem_get(pd, addr, len, access_flags, &mr->umem,
1375 &page_shift, &ncont, &order); 1379 &npages, &page_shift, &ncont, &order);
1376 if (IS_ERR(mr->umem)) { 1380 if (err < 0) {
1377 err = PTR_ERR(mr->umem);
1378 mr->umem = NULL; 1381 mr->umem = NULL;
1379 return err; 1382 return err;
1380 } 1383 }