From patchwork Tue Oct 23 20:56:58 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 10653663 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 960B914BD for ; Tue, 23 Oct 2018 20:57:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 81E7628514 for ; Tue, 23 Oct 2018 20:57:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7678E2A3E3; Tue, 23 Oct 2018 20:57:12 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 AC64228514 for ; Tue, 23 Oct 2018 20:57:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728491AbeJXFWO (ORCPT ); Wed, 24 Oct 2018 01:22:14 -0400 Received: from mail-pg1-f196.google.com ([209.85.215.196]:38520 "EHLO mail-pg1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725266AbeJXFWO (ORCPT ); Wed, 24 Oct 2018 01:22:14 -0400 Received: by mail-pg1-f196.google.com with SMTP id f8-v6so1227234pgq.5 for ; Tue, 23 Oct 2018 13:57:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ziepe.ca; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=EUbDvp2IuEUKfB8uWLlwPplxhAfZh+ZVa9qUtGy2I2s=; b=CKYsG74pTsRvDPVuf48k3GOPiw7UtxVFz47mgsMLg3H7kl9eAtS4+4QX1c4lk5Ey7B 4QUDshqN5CgFc3v0w1+7qrst1H7CFPYDrNkab+W2N7IkaXR0rnKu+JII09/+eg/oX1bT BWnGV1je2x6cDG/hsKmZna0j8GKjO3rGrXTXNIHJm5pk3gIKX6oqbbrwV5tUfjv8ffmN IUsqrk1aLz2gNSagxY8JD4H0xFPQGpdoMY8WVKWKiNK4Z2M8LEBpUyHL4DFTNBHAidcM EgpPBIkWY1RXHYre/p4YM1e+6ArnBwMjv7X/2VTVldKx8CIIVWJr3cTrDfTjU0PpMbho 9g2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=EUbDvp2IuEUKfB8uWLlwPplxhAfZh+ZVa9qUtGy2I2s=; b=E5CY+cpmZcKqph9NHAH6WwWFyqK48ZJWnO8nLKavctvnHeWMxY0EOV5DE1+betSt6e Z/EVdf7fjrgV1sOp4uKI98niMIj4UnF5SkJyeaJMPX4Q8zbAOxvuJ1L9f/QLe+zEyTTZ tDLbx0z5Fz+BMgmgiwPnxnbYWAGIJakivWYiq3pZjTEcCtAB6lp8/TfE5yL1S++5w+V/ 5AYKQd1E+H1ERZdU0XlUj6BncGjWuMJMKmCHQYU2AZ3ArlCa3PpJEXoiH6r4GTXdUSGa a9tgMr2I1VMOTyuQ72nZDioRmx4PMqAxaDz2dne7bil3cx9Y+Y1Rk05iU/HiQcShk43R JsHQ== X-Gm-Message-State: AGRZ1gJV3gU310a4BAXdAhJvaaKpBEbkT3Nqla06p2NDSyq/de5xUFoH WEDkLFYhCplAtsBAZGEW60NqEfMJNB0= X-Google-Smtp-Source: AJdET5cg8Q0CXokU7f5v7RRoKvJqhmQGufoX+oo8bZJ49PGl21R9+QUp3Tsn9WWvTlSTjGmz0uKW5A== X-Received: by 2002:a63:f357:: with SMTP id t23-v6mr15285091pgj.402.1540328229570; Tue, 23 Oct 2018 13:57:09 -0700 (PDT) Received: from ziepe.ca (S010614cc2056d97f.ed.shawcable.net. [174.3.196.123]) by smtp.gmail.com with ESMTPSA id p7-v6sm3413107pfb.101.2018.10.23.13.57.05 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 23 Oct 2018 13:57:06 -0700 (PDT) Received: from jgg by mlx.ziepe.ca with local (Exim 4.90_1) (envelope-from ) id 1gF3jc-00010g-WE; Tue, 23 Oct 2018 14:57:05 -0600 From: Jason Gunthorpe To: linux-rdma@vger.kernel.org Cc: Jason Gunthorpe Subject: [PATCH rdma-core 6/9] verbs: Expose the struct verbs_device_ops for each provider to the linker Date: Tue, 23 Oct 2018 14:56:58 -0600 Message-Id: <20181023205701.3729-7-jgg@ziepe.ca> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181023205701.3729-1-jgg@ziepe.ca> References: <20181023205701.3729-1-jgg@ziepe.ca> MIME-Version: 1.0 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 From: Jason Gunthorpe This gives us a symbol we can use to pull the provider into a static link without having to rely on -Wl,--whole-archive tricks. Signed-off-by: Jason Gunthorpe --- libibverbs/driver.h | 13 ++++++++++--- libibverbs/verbs.h | 19 +++++++++++++++++++ providers/bnxt_re/main.c | 2 +- providers/cxgb3/iwch.c | 2 +- providers/cxgb4/dev.c | 2 +- providers/hfi1verbs/hfiverbs.c | 2 +- providers/hns/hns_roce_u.c | 2 +- providers/i40iw/i40iw_umain.c | 2 +- providers/ipathverbs/ipathverbs.c | 2 +- providers/mlx4/mlx4.c | 2 +- providers/mlx5/mlx5.c | 2 +- providers/mthca/mthca.c | 2 +- providers/nes/nes_umain.c | 2 +- providers/ocrdma/ocrdma_main.c | 2 +- providers/qedr/qelr_main.c | 2 +- providers/rxe/rxe.c | 2 +- providers/vmw_pvrdma/pvrdma_main.c | 2 +- 17 files changed, 44 insertions(+), 18 deletions(-) diff --git a/libibverbs/driver.h b/libibverbs/driver.h index b1c8585e09ae8d..3e8c2ba07c95db 100644 --- a/libibverbs/driver.h +++ b/libibverbs/driver.h @@ -355,11 +355,18 @@ typedef struct verbs_device *(*verbs_driver_init_func)(const char *uverbs_sys_pa void verbs_register_driver(const struct verbs_device_ops *ops); -/* Macro for providers to use to supply verbs_device_ops to the core code */ -#define PROVIDER_DRIVER(drv) \ +/* + * Macro for providers to use to supply verbs_device_ops to the core code. + * This creates a global symbol for the provider structure to be used by the + * ibv_static_providers() machinery, and a global constructor for the dlopen + * machinery. + */ +#define PROVIDER_DRIVER(provider_name, drv_struct) \ + extern const struct verbs_device_ops verbs_provider_##provider_name \ + __attribute__((alias(stringify(drv_struct)))); \ static __attribute__((constructor)) void drv##__register_driver(void) \ { \ - verbs_register_driver(&drv); \ + verbs_register_driver(&drv_struct); \ } void *_verbs_init_and_alloc_context(struct ibv_device *device, int cmd_fd, diff --git a/libibverbs/verbs.h b/libibverbs/verbs.h index 80b8414236683a..e5327eee48564d 100644 --- a/libibverbs/verbs.h +++ b/libibverbs/verbs.h @@ -1880,6 +1880,25 @@ static inline struct verbs_context *verbs_get_ctx(struct ibv_context *ctx) */ struct ibv_device **ibv_get_device_list(int *num_devices); +#ifdef RDMA_STATIC_PROVIDERS +struct verbs_devices_ops; +extern const struct verbs_device_ops verbs_provider_bnxt_re; +extern const struct verbs_device_ops verbs_provider_cxgb3; +extern const struct verbs_device_ops verbs_provider_cxgb4; +extern const struct verbs_device_ops verbs_provider_hfi1verbs; +extern const struct verbs_device_ops verbs_provider_hns; +extern const struct verbs_device_ops verbs_provider_i40iw; +extern const struct verbs_device_ops verbs_provider_ipathverbs; +extern const struct verbs_device_ops verbs_provider_mlx4; +extern const struct verbs_device_ops verbs_provider_mlx5; +extern const struct verbs_device_ops verbs_provider_mthca; +extern const struct verbs_device_ops verbs_provider_nes; +extern const struct verbs_device_ops verbs_provider_ocrdma; +extern const struct verbs_device_ops verbs_provider_qedr; +extern const struct verbs_device_ops verbs_provider_rxe; +extern const struct verbs_device_ops verbs_provider_vmw_pvrdma; +#endif + /** * ibv_free_device_list - Free list from ibv_get_device_list() * diff --git a/providers/bnxt_re/main.c b/providers/bnxt_re/main.c index 8fe5819f305add..1cd4d880412878 100644 --- a/providers/bnxt_re/main.c +++ b/providers/bnxt_re/main.c @@ -197,4 +197,4 @@ static const struct verbs_device_ops bnxt_re_dev_ops = { .alloc_context = bnxt_re_alloc_context, .free_context = bnxt_re_free_context, }; -PROVIDER_DRIVER(bnxt_re_dev_ops); +PROVIDER_DRIVER(bnxt_re, bnxt_re_dev_ops); diff --git a/providers/cxgb3/iwch.c b/providers/cxgb3/iwch.c index cf82a662fdd846..0c6c15be0fa54a 100644 --- a/providers/cxgb3/iwch.c +++ b/providers/cxgb3/iwch.c @@ -267,4 +267,4 @@ static const struct verbs_device_ops iwch_dev_ops = { .alloc_context = iwch_alloc_context, .free_context = iwch_free_context, }; -PROVIDER_DRIVER(iwch_dev_ops); +PROVIDER_DRIVER(cxgb3, iwch_dev_ops); diff --git a/providers/cxgb4/dev.c b/providers/cxgb4/dev.c index 9d8b6d0166f8d9..aba007f0b0ca33 100644 --- a/providers/cxgb4/dev.c +++ b/providers/cxgb4/dev.c @@ -504,7 +504,7 @@ static const struct verbs_device_ops c4iw_dev_ops = { .alloc_context = c4iw_alloc_context, .free_context = c4iw_free_context, }; -PROVIDER_DRIVER(c4iw_dev_ops); +PROVIDER_DRIVER(cxgb4, c4iw_dev_ops); #ifdef STATS void __attribute__ ((destructor)) cs_fini(void); diff --git a/providers/hfi1verbs/hfiverbs.c b/providers/hfi1verbs/hfiverbs.c index bb7c5498a93000..feb4faea306e16 100644 --- a/providers/hfi1verbs/hfiverbs.c +++ b/providers/hfi1verbs/hfiverbs.c @@ -206,4 +206,4 @@ static const struct verbs_device_ops hfi1_dev_ops = { .alloc_context = hfi1_alloc_context, .free_context = hfi1_free_context, }; -PROVIDER_DRIVER(hfi1_dev_ops); +PROVIDER_DRIVER(hfi1verbs, hfi1_dev_ops); diff --git a/providers/hns/hns_roce_u.c b/providers/hns/hns_roce_u.c index 3597e9add10a97..108e2090e4e929 100644 --- a/providers/hns/hns_roce_u.c +++ b/providers/hns/hns_roce_u.c @@ -205,4 +205,4 @@ static const struct verbs_device_ops hns_roce_dev_ops = { .alloc_context = hns_roce_alloc_context, .free_context = hns_roce_free_context, }; -PROVIDER_DRIVER(hns_roce_dev_ops); +PROVIDER_DRIVER(hns, hns_roce_dev_ops); diff --git a/providers/i40iw/i40iw_umain.c b/providers/i40iw/i40iw_umain.c index afe54d914ac217..b620e720125d40 100644 --- a/providers/i40iw/i40iw_umain.c +++ b/providers/i40iw/i40iw_umain.c @@ -226,4 +226,4 @@ static const struct verbs_device_ops i40iw_udev_ops = { .alloc_context = i40iw_ualloc_context, .free_context = i40iw_ufree_context, }; -PROVIDER_DRIVER(i40iw_udev_ops); +PROVIDER_DRIVER(i40iw, i40iw_udev_ops); diff --git a/providers/ipathverbs/ipathverbs.c b/providers/ipathverbs/ipathverbs.c index c54729773b90f9..ab3ccd14fa18b1 100644 --- a/providers/ipathverbs/ipathverbs.c +++ b/providers/ipathverbs/ipathverbs.c @@ -204,4 +204,4 @@ static const struct verbs_device_ops ipath_dev_ops = { .alloc_context = ipath_alloc_context, .free_context = ipath_free_context, }; -PROVIDER_DRIVER(ipath_dev_ops); +PROVIDER_DRIVER(ipathverbs, ipath_dev_ops); diff --git a/providers/mlx4/mlx4.c b/providers/mlx4/mlx4.c index 1847e2d09d7719..42bff4d212c451 100644 --- a/providers/mlx4/mlx4.c +++ b/providers/mlx4/mlx4.c @@ -302,7 +302,7 @@ static const struct verbs_device_ops mlx4_dev_ops = { .alloc_context = mlx4_alloc_context, .free_context = mlx4_free_context, }; -PROVIDER_DRIVER(mlx4_dev_ops); +PROVIDER_DRIVER(mlx4, mlx4_dev_ops); static int mlx4dv_get_qp(struct ibv_qp *qp_in, struct mlx4dv_qp *qp_out) diff --git a/providers/mlx5/mlx5.c b/providers/mlx5/mlx5.c index 22b27fdb78ccc0..3eedf34f81ed75 100644 --- a/providers/mlx5/mlx5.c +++ b/providers/mlx5/mlx5.c @@ -1324,4 +1324,4 @@ static const struct verbs_device_ops mlx5_dev_ops = { .alloc_context = mlx5_alloc_context, .free_context = mlx5_free_context, }; -PROVIDER_DRIVER(mlx5_dev_ops); +PROVIDER_DRIVER(mlx5, mlx5_dev_ops); diff --git a/providers/mthca/mthca.c b/providers/mthca/mthca.c index e893b4dff617a2..c3293d8dff2494 100644 --- a/providers/mthca/mthca.c +++ b/providers/mthca/mthca.c @@ -239,4 +239,4 @@ static const struct verbs_device_ops mthca_dev_ops = { .alloc_context = mthca_alloc_context, .free_context = mthca_free_context, }; -PROVIDER_DRIVER(mthca_dev_ops); +PROVIDER_DRIVER(mthca, mthca_dev_ops); diff --git a/providers/nes/nes_umain.c b/providers/nes/nes_umain.c index 006c3e9675cfcd..deb0be6a9fd1cf 100644 --- a/providers/nes/nes_umain.c +++ b/providers/nes/nes_umain.c @@ -218,4 +218,4 @@ static const struct verbs_device_ops nes_udev_ops = { .alloc_context = nes_ualloc_context, .free_context = nes_ufree_context, }; -PROVIDER_DRIVER(nes_udev_ops); +PROVIDER_DRIVER(nes, nes_udev_ops); diff --git a/providers/ocrdma/ocrdma_main.c b/providers/ocrdma/ocrdma_main.c index 022625d6be8ef1..f71ec8a8e231da 100644 --- a/providers/ocrdma/ocrdma_main.c +++ b/providers/ocrdma/ocrdma_main.c @@ -195,4 +195,4 @@ static const struct verbs_device_ops ocrdma_dev_ops = { .alloc_context = ocrdma_alloc_context, .free_context = ocrdma_free_context, }; -PROVIDER_DRIVER(ocrdma_dev_ops); +PROVIDER_DRIVER(ocrdma, ocrdma_dev_ops); diff --git a/providers/qedr/qelr_main.c b/providers/qedr/qelr_main.c index ce36e07c5c5779..650e846e8f1e58 100644 --- a/providers/qedr/qelr_main.c +++ b/providers/qedr/qelr_main.c @@ -250,4 +250,4 @@ static const struct verbs_device_ops qelr_dev_ops = { .alloc_context = qelr_alloc_context, .free_context = qelr_free_context, }; -PROVIDER_DRIVER(qelr_dev_ops); +PROVIDER_DRIVER(qedr, qelr_dev_ops); diff --git a/providers/rxe/rxe.c b/providers/rxe/rxe.c index c8fa600921d297..857ea0981321e9 100644 --- a/providers/rxe/rxe.c +++ b/providers/rxe/rxe.c @@ -923,4 +923,4 @@ static const struct verbs_device_ops rxe_dev_ops = { .alloc_context = rxe_alloc_context, .free_context = rxe_free_context, }; -PROVIDER_DRIVER(rxe_dev_ops); +PROVIDER_DRIVER(rxe, rxe_dev_ops); diff --git a/providers/vmw_pvrdma/pvrdma_main.c b/providers/vmw_pvrdma/pvrdma_main.c index 3168edb3b148c1..52a2de22d44cb2 100644 --- a/providers/vmw_pvrdma/pvrdma_main.c +++ b/providers/vmw_pvrdma/pvrdma_main.c @@ -209,4 +209,4 @@ static const struct verbs_device_ops pvrdma_dev_ops = { .alloc_context = pvrdma_alloc_context, .free_context = pvrdma_free_context, }; -PROVIDER_DRIVER(pvrdma_dev_ops); +PROVIDER_DRIVER(vmw_pvrdma, pvrdma_dev_ops);