From patchwork Mon Oct 24 15:16:42 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 9392317 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id F18EE607D0 for ; Mon, 24 Oct 2016 15:17:24 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E4E5A28FE9 for ; Mon, 24 Oct 2016 15:17:24 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D93C329151; Mon, 24 Oct 2016 15:17:24 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.4 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 42B4E28FE9 for ; Mon, 24 Oct 2016 15:17:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756162AbcJXPRW (ORCPT ); Mon, 24 Oct 2016 11:17:22 -0400 Received: from mout.kundenserver.de ([212.227.126.131]:60061 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752360AbcJXPRV (ORCPT ); Mon, 24 Oct 2016 11:17:21 -0400 Received: from wuerfel.lan. ([78.43.20.153]) by mrelayeu.kundenserver.de (mreue005) with ESMTPA (Nemesis) id 0MWfMN-1cR4o315tT-00XsLt; Mon, 24 Oct 2016 17:17:00 +0200 From: Arnd Bergmann To: Matan Barak , Leon Romanovsky Cc: Arnd Bergmann , Doug Ledford , Sean Hefty , Hal Rosenstock , Sagi Grimberg , Bart Van Assche , Noa Osherovich , Saeed Mahameed , linux-rdma@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] IB/mlx5: avoid bogus -Wmaybe-uninitialized warning Date: Mon, 24 Oct 2016 17:16:42 +0200 Message-Id: <20161024151658.2413803-1-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 MIME-Version: 1.0 X-Provags-ID: V03:K0:bTrpsNTvZmm7Ud++hUFjUDt4E9aiWdsn7w3jXuCO/7bS0tXk/DZ Mv0CMl/x43VuUe/tzOi95rVj+bfZGMfpjQ3FtGJq6x4qqC45tl3Y37oeSY8H850luPRq4Pl tAyeHsvt/bVKd7KUNfGW+SefMlANvOyFVQkZKPnBnNhhdN5A2VR6B4ZMA4sASpLC4k2yNBx WrzWgTP3y+IADWHmtR3iQ== X-UI-Out-Filterresults: notjunk:1; V01:K0:xHIaDHfZtKU=:l8OkXrpdMo7kWKKHRc1hHo VoFbv46HvR4fbTnf67PG8YxKIA5Ddw+bhGq0CZyjUC0h+NWuH0n4rNWFCrGtUSZDZCxBYolpu iumLn0Or+KxjppgVGwzUWSet4qy/gE+1HVZFCS5O1eKQB67r5G/OJ44DuoVu+VZ1PqWmjqolQ 5p9+hCtcVXA0QuX3cYLuvHJDlayuByTS+k5UtxScfsE6xtBS2HF1qPtOZRtbRDH8J8bFVeOca zp5VmqkpJSTt4FLnvx0aSrg/djWCzANwthx6z3hKql9WjBFNtthQj1LYKQFMwzvsUStAOGvev 2lyr0yMGZuPu5LG/0F1eXYfNK7/o0BPHZDMaOZz9qtGQ91Gd63Gl2P+A4oi/q+j7Ayfp+ltal Pd5RL3OL88qKIFsoZxf688Z/tnelz6HZ5QrSea7Yt6pZ/JucY3HllIeIINdfKXjB5tI+8cUFd UVQpdCqfqusnjqEM52dDZV20TmAW82PYBtyzaVpLC2m/OZKvyz/vBI0KmemkbgH48Ea9C/f2A zlyVDdrctIfEDHoGifPbWXyr7VvaU/cWbzeePiyPN5kC3nx0TiuamL6jQytm+zH/SJUpZEzZX INaG+0yhXxCu4e2tu14oYQkGVq5wV0G/zfELp1ccGBdWsYxXnUR7ClkuCgeeGLb5W4xRtwAAY Qd7aiI7/Fg/YivgKrqG01Mt8lE5UK30XfGDSw9hTcKXyOIrRw73tgP/l3YVzG74cG3KYH6gSH /pg/e1W1FAuITbnX Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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. Signed-off-by: Arnd Bergmann Acked-by: Leon Romanovsky --- drivers/infiniband/hw/mlx5/mr.c | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c index d4ad672b905b..88d8d292677b 100644 --- a/drivers/infiniband/hw/mlx5/mr.c +++ b/drivers/infiniband/hw/mlx5/mr.c @@ -815,29 +815,33 @@ static void prep_umr_unreg_wqe(struct mlx5_ib_dev *dev, umrwr->mkey = key; } -static struct ib_umem *mr_umem_get(struct ib_pd *pd, u64 start, u64 length, - int access_flags, int *npages, - int *page_shift, int *ncont, int *order) +static int mr_umem_get(struct ib_pd *pd, u64 start, u64 length, + int access_flags, struct ib_umem ** umem, + int *npages, int *page_shift, int *ncont, + int *order) { struct mlx5_ib_dev *dev = to_mdev(pd->device); - struct ib_umem *umem = ib_umem_get(pd->uobject->context, start, length, - access_flags, 0); - if (IS_ERR(umem)) { + int err; + + *umem = ib_umem_get(pd->uobject->context, start, length, + access_flags, 0); + err = PTR_ERR_OR_ZERO(*umem); + if (err < 0) { mlx5_ib_err(dev, "umem get failed (%ld)\n", PTR_ERR(umem)); - return (void *)umem; + return err; } - mlx5_ib_cont_pages(umem, start, npages, page_shift, ncont, order); + mlx5_ib_cont_pages(*umem, start, npages, page_shift, ncont, order); if (!*npages) { mlx5_ib_warn(dev, "avoid zero region\n"); - ib_umem_release(umem); - return ERR_PTR(-EINVAL); + ib_umem_release(*umem); + return -EINVAL; } mlx5_ib_dbg(dev, "npages %d, ncont %d, order %d, page_shift %d\n", *npages, *ncont, *order, *page_shift); - return umem; + return 0; } static void mlx5_ib_umr_done(struct ib_cq *cq, struct ib_wc *wc) @@ -1163,11 +1167,11 @@ struct ib_mr *mlx5_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, mlx5_ib_dbg(dev, "start 0x%llx, virt_addr 0x%llx, length 0x%llx, access_flags 0x%x\n", start, virt_addr, length, access_flags); - umem = mr_umem_get(pd, start, length, access_flags, &npages, + err = mr_umem_get(pd, start, length, access_flags, &umem, &npages, &page_shift, &ncont, &order); - if (IS_ERR(umem)) - return (void *)umem; + if (err < 0) + return ERR_PTR(err); if (use_umr(order)) { mr = reg_umr(pd, umem, virt_addr, length, ncont, page_shift, @@ -1341,10 +1345,9 @@ int mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start, */ flags |= IB_MR_REREG_TRANS; ib_umem_release(mr->umem); - mr->umem = mr_umem_get(pd, addr, len, access_flags, &npages, - &page_shift, &ncont, &order); - if (IS_ERR(mr->umem)) { - err = PTR_ERR(mr->umem); + err = mr_umem_get(pd, addr, len, access_flags, &mr->umem, + &npages, &page_shift, &ncont, &order); + if (err < 0) { mr->umem = NULL; return err; }