From patchwork Mon Nov 5 11:35:27 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kamal Heib X-Patchwork-Id: 10667903 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 A228E1751 for ; Mon, 5 Nov 2018 11:36:14 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 91A1728DB6 for ; Mon, 5 Nov 2018 11:36:14 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8612F29789; Mon, 5 Nov 2018 11:36:14 +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,FREEMAIL_FROM,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 C8DBF28DB6 for ; Mon, 5 Nov 2018 11:36:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727563AbeKEUza (ORCPT ); Mon, 5 Nov 2018 15:55:30 -0500 Received: from mail-wm1-f67.google.com ([209.85.128.67]:40309 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728245AbeKEUz3 (ORCPT ); Mon, 5 Nov 2018 15:55:29 -0500 Received: by mail-wm1-f67.google.com with SMTP id b203-v6so7711795wme.5 for ; Mon, 05 Nov 2018 03:36:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=WnIB33Ia+l+lqA55LjwA3WFTcZoqSnRCfiTiHSIexH0=; b=RfFuPTaZBNoCnX5BiVdPom316spwIxKgNTGXiidKiDCxaF1VOvzkj3M9CAK9yWwWzu wANXBTGjAzsYkszduT5Z8pBG1FEu5GjvFfFdXbO/Hs0VhLrZvzimpdXgVcwjBcCa9auo VRJMCyQuQoWOHxt0xxoAYlUJFAoBxueyPfvqjOewrAaugLqy331ex3IiOnHTONktrAM2 Q5NJYxYSTogYYfxir2J0zjtb0TqevDzV6taxIRl7CsaThhxSd9337IwTDdbJQBz6oiY7 YbT2mph9YvwQbwQhHL1PgB0MsG9SQ9SOmvqtP9qqyPyOdm++NvL5cUoTw6NIxQBlbFtY i/JA== 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; bh=WnIB33Ia+l+lqA55LjwA3WFTcZoqSnRCfiTiHSIexH0=; b=PncFCt4NgCOA95cjtxCFMx2WIKgD2zcPERsWIO+fIbhYfr0kcmeaJRtIglAEXuTj1v +/LDV6isddPt07OKMfPS1hLc0OYJ42B8v292hTHtMBzhqJs0lbh0TNP8J+oTzRfCkUaC V5AXfkMquBzA1pM6Y3/xH3Kts/+at+uXsEH0WvONLV6rHZnNYx4kJ+HrNYfiuYgaDmnP KM7ssh4ePax1DlKISINuuCbtjs9m/eZQDH+T4n0ADmr+LaOe2SELRvxwlaR+wof8cGkD AwViHyrlBOGVQ/vbgAJse/BQLxPfQU265Z9lgxW3uiThkAcetm4fYhctKMpF4+yJsTqK FADg== X-Gm-Message-State: AGRZ1gICQ+yORRuCZwN3IaYcAbvK1SLcxF4+A9zbTSDYATMIHsEAbFgq HgRXCPwgLnJH/TgWwpnkIOanmpgx X-Google-Smtp-Source: AJdET5c6yqSFe2R1pJJOKqaj08eCti8FFWK4bR0T+WZHQb0Tcgi+XHCLideX2Zl9o3bVFsVwT6dNQw== X-Received: by 2002:a1c:770a:: with SMTP id t10-v6mr6094701wmi.149.1541417768857; Mon, 05 Nov 2018 03:36:08 -0800 (PST) Received: from kheib-workstation.redhat.com ([192.116.94.216]) by smtp.gmail.com with ESMTPSA id z18-v6sm10762147wru.83.2018.11.05.03.36.07 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 05 Nov 2018 03:36:08 -0800 (PST) From: Kamal Heib To: Doug Ledford , Jason Gunthorpe Cc: linux-rdma@vger.kernel.org, kamalheib1@gmail.com Subject: [PATCH rdma-next v3 19/20] RDMA/rdmavt: Initialize ib_device_ops struct Date: Mon, 5 Nov 2018 13:35:27 +0200 Message-Id: <20181105113528.8317-20-kamalheib1@gmail.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20181105113528.8317-1-kamalheib1@gmail.com> References: <20181105113528.8317-1-kamalheib1@gmail.com> 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 Initialize ib_device_ops with the supported operations using ib_set_device_ops() and remove the use of check_driver_override(). Signed-off-by: Kamal Heib --- drivers/infiniband/sw/rdmavt/vt.c | 312 ++++++++------------------------------ 1 file changed, 67 insertions(+), 245 deletions(-) diff --git a/drivers/infiniband/sw/rdmavt/vt.c b/drivers/infiniband/sw/rdmavt/vt.c index 723d3daf2eba..cf7aab970cb4 100644 --- a/drivers/infiniband/sw/rdmavt/vt.c +++ b/drivers/infiniband/sw/rdmavt/vt.c @@ -392,16 +392,64 @@ enum { _VERB_IDX_MAX /* Must always be last! */ }; -static inline int check_driver_override(struct rvt_dev_info *rdi, - size_t offset, void *func) -{ - if (!*(void **)((void *)&rdi->ibdev + offset)) { - *(void **)((void *)&rdi->ibdev + offset) = func; - return 0; - } - - return 1; -} +static const struct ib_device_ops rvt_dev_ops = { + /* Device operations */ + .query_device = rvt_query_device, + .modify_device = rvt_modify_device, + /* Port operations */ + .query_port = rvt_query_port, + .modify_port = rvt_modify_port, + .get_port_immutable = rvt_get_port_immutable, + /* PKey operations */ + .query_pkey = rvt_query_pkey, + /* GID operations */ + .query_gid = rvt_query_gid, + /* Ucontext operations */ + .alloc_ucontext = rvt_alloc_ucontext, + .dealloc_ucontext = rvt_dealloc_ucontext, + .mmap = rvt_mmap, + /* QP operations */ + .create_qp = rvt_create_qp, + .modify_qp = rvt_modify_qp, + .destroy_qp = rvt_destroy_qp, + .query_qp = rvt_query_qp, + .post_send = rvt_post_send, + .post_recv = rvt_post_recv, + /* SRQ operations */ + .post_srq_recv = rvt_post_srq_recv, + .create_srq = rvt_create_srq, + .modify_srq = rvt_modify_srq, + .destroy_srq = rvt_destroy_srq, + .query_srq = rvt_query_srq, + /* AH operations */ + .create_ah = rvt_create_ah, + .destroy_ah = rvt_destroy_ah, + .modify_ah = rvt_modify_ah, + .query_ah = rvt_query_ah, + /* Multicast operations */ + .attach_mcast = rvt_attach_mcast, + .detach_mcast = rvt_detach_mcast, + /* MR operations */ + .get_dma_mr = rvt_get_dma_mr, + .reg_user_mr = rvt_reg_user_mr, + .dereg_mr = rvt_dereg_mr, + .alloc_mr = rvt_alloc_mr, + .map_mr_sg = rvt_map_mr_sg, + /* FMR operations */ + .alloc_fmr = rvt_alloc_fmr, + .map_phys_fmr = rvt_map_phys_fmr, + .unmap_fmr = rvt_unmap_fmr, + .dealloc_fmr = rvt_dealloc_fmr, + /* CQ operations */ + .create_cq = rvt_create_cq, + .destroy_cq = rvt_destroy_cq, + .poll_cq = rvt_poll_cq, + .req_notify_cq = rvt_req_notify_cq, + .resize_cq = rvt_resize_cq, + /* PD operations */ + .alloc_pd = rvt_alloc_pd, + .dealloc_pd = rvt_dealloc_pd, +}; static noinline int check_support(struct rvt_dev_info *rdi, int verb) { @@ -416,76 +464,36 @@ static noinline int check_support(struct rvt_dev_info *rdi, int verb) return -EINVAL; break; - case QUERY_DEVICE: - check_driver_override(rdi, offsetof(struct ib_device, - query_device), - rvt_query_device); - break; - case MODIFY_DEVICE: /* * rdmavt does not support modify device currently drivers must * provide. */ - if (!check_driver_override(rdi, offsetof(struct ib_device, - modify_device), - rvt_modify_device)) + if (!rdi->ibdev.modify_device) return -EOPNOTSUPP; break; case QUERY_PORT: - if (!check_driver_override(rdi, offsetof(struct ib_device, - query_port), - rvt_query_port)) + if (!rdi->ibdev.query_port) if (!rdi->driver_f.query_port_state) return -EINVAL; break; case MODIFY_PORT: - if (!check_driver_override(rdi, offsetof(struct ib_device, - modify_port), - rvt_modify_port)) + if (!rdi->ibdev.modify_port) if (!rdi->driver_f.cap_mask_chg || !rdi->driver_f.shut_down_port) return -EINVAL; break; - case QUERY_PKEY: - check_driver_override(rdi, offsetof(struct ib_device, - query_pkey), - rvt_query_pkey); - break; - case QUERY_GID: - if (!check_driver_override(rdi, offsetof(struct ib_device, - query_gid), - rvt_query_gid)) + if (!rdi->ibdev.query_gid) if (!rdi->driver_f.get_guid_be) return -EINVAL; break; - case ALLOC_UCONTEXT: - check_driver_override(rdi, offsetof(struct ib_device, - alloc_ucontext), - rvt_alloc_ucontext); - break; - - case DEALLOC_UCONTEXT: - check_driver_override(rdi, offsetof(struct ib_device, - dealloc_ucontext), - rvt_dealloc_ucontext); - break; - - case GET_PORT_IMMUTABLE: - check_driver_override(rdi, offsetof(struct ib_device, - get_port_immutable), - rvt_get_port_immutable); - break; - case CREATE_QP: - if (!check_driver_override(rdi, offsetof(struct ib_device, - create_qp), - rvt_create_qp)) + if (!rdi->ibdev.create_qp) if (!rdi->driver_f.qp_priv_alloc || !rdi->driver_f.qp_priv_free || !rdi->driver_f.notify_qp_reset || @@ -496,9 +504,7 @@ static noinline int check_support(struct rvt_dev_info *rdi, int verb) break; case MODIFY_QP: - if (!check_driver_override(rdi, offsetof(struct ib_device, - modify_qp), - rvt_modify_qp)) + if (!rdi->ibdev.modify_qp) if (!rdi->driver_f.notify_qp_reset || !rdi->driver_f.schedule_send || !rdi->driver_f.get_pmtu_from_attr || @@ -512,9 +518,7 @@ static noinline int check_support(struct rvt_dev_info *rdi, int verb) break; case DESTROY_QP: - if (!check_driver_override(rdi, offsetof(struct ib_device, - destroy_qp), - rvt_destroy_qp)) + if (!rdi->ibdev.destroy_qp) if (!rdi->driver_f.qp_priv_free || !rdi->driver_f.notify_qp_reset || !rdi->driver_f.flush_qp_waiters || @@ -523,197 +527,14 @@ static noinline int check_support(struct rvt_dev_info *rdi, int verb) return -EINVAL; break; - case QUERY_QP: - check_driver_override(rdi, offsetof(struct ib_device, - query_qp), - rvt_query_qp); - break; - case POST_SEND: - if (!check_driver_override(rdi, offsetof(struct ib_device, - post_send), - rvt_post_send)) + if (!rdi->ibdev.post_send) if (!rdi->driver_f.schedule_send || !rdi->driver_f.do_send || !rdi->post_parms) return -EINVAL; break; - case POST_RECV: - check_driver_override(rdi, offsetof(struct ib_device, - post_recv), - rvt_post_recv); - break; - case POST_SRQ_RECV: - check_driver_override(rdi, offsetof(struct ib_device, - post_srq_recv), - rvt_post_srq_recv); - break; - - case CREATE_AH: - check_driver_override(rdi, offsetof(struct ib_device, - create_ah), - rvt_create_ah); - break; - - case DESTROY_AH: - check_driver_override(rdi, offsetof(struct ib_device, - destroy_ah), - rvt_destroy_ah); - break; - - case MODIFY_AH: - check_driver_override(rdi, offsetof(struct ib_device, - modify_ah), - rvt_modify_ah); - break; - - case QUERY_AH: - check_driver_override(rdi, offsetof(struct ib_device, - query_ah), - rvt_query_ah); - break; - - case CREATE_SRQ: - check_driver_override(rdi, offsetof(struct ib_device, - create_srq), - rvt_create_srq); - break; - - case MODIFY_SRQ: - check_driver_override(rdi, offsetof(struct ib_device, - modify_srq), - rvt_modify_srq); - break; - - case DESTROY_SRQ: - check_driver_override(rdi, offsetof(struct ib_device, - destroy_srq), - rvt_destroy_srq); - break; - - case QUERY_SRQ: - check_driver_override(rdi, offsetof(struct ib_device, - query_srq), - rvt_query_srq); - break; - - case ATTACH_MCAST: - check_driver_override(rdi, offsetof(struct ib_device, - attach_mcast), - rvt_attach_mcast); - break; - - case DETACH_MCAST: - check_driver_override(rdi, offsetof(struct ib_device, - detach_mcast), - rvt_detach_mcast); - break; - - case GET_DMA_MR: - check_driver_override(rdi, offsetof(struct ib_device, - get_dma_mr), - rvt_get_dma_mr); - break; - - case REG_USER_MR: - check_driver_override(rdi, offsetof(struct ib_device, - reg_user_mr), - rvt_reg_user_mr); - break; - - case DEREG_MR: - check_driver_override(rdi, offsetof(struct ib_device, - dereg_mr), - rvt_dereg_mr); - break; - - case ALLOC_FMR: - check_driver_override(rdi, offsetof(struct ib_device, - alloc_fmr), - rvt_alloc_fmr); - break; - - case ALLOC_MR: - check_driver_override(rdi, offsetof(struct ib_device, - alloc_mr), - rvt_alloc_mr); - break; - - case MAP_MR_SG: - check_driver_override(rdi, offsetof(struct ib_device, - map_mr_sg), - rvt_map_mr_sg); - break; - - case MAP_PHYS_FMR: - check_driver_override(rdi, offsetof(struct ib_device, - map_phys_fmr), - rvt_map_phys_fmr); - break; - - case UNMAP_FMR: - check_driver_override(rdi, offsetof(struct ib_device, - unmap_fmr), - rvt_unmap_fmr); - break; - - case DEALLOC_FMR: - check_driver_override(rdi, offsetof(struct ib_device, - dealloc_fmr), - rvt_dealloc_fmr); - break; - - case MMAP: - check_driver_override(rdi, offsetof(struct ib_device, - mmap), - rvt_mmap); - break; - - case CREATE_CQ: - check_driver_override(rdi, offsetof(struct ib_device, - create_cq), - rvt_create_cq); - break; - - case DESTROY_CQ: - check_driver_override(rdi, offsetof(struct ib_device, - destroy_cq), - rvt_destroy_cq); - break; - - case POLL_CQ: - check_driver_override(rdi, offsetof(struct ib_device, - poll_cq), - rvt_poll_cq); - break; - - case REQ_NOTFIY_CQ: - check_driver_override(rdi, offsetof(struct ib_device, - req_notify_cq), - rvt_req_notify_cq); - break; - - case RESIZE_CQ: - check_driver_override(rdi, offsetof(struct ib_device, - resize_cq), - rvt_resize_cq); - break; - - case ALLOC_PD: - check_driver_override(rdi, offsetof(struct ib_device, - alloc_pd), - rvt_alloc_pd); - break; - - case DEALLOC_PD: - check_driver_override(rdi, offsetof(struct ib_device, - dealloc_pd), - rvt_dealloc_pd); - break; - - default: - return -EINVAL; } return 0; @@ -745,6 +566,7 @@ int rvt_register_device(struct rvt_dev_info *rdi, u32 driver_id) return -EINVAL; } + ib_set_device_ops(&rdi->ibdev, &rvt_dev_ops); /* Once we get past here we can use rvt_pr macros and tracepoints */ trace_rvt_dbg(rdi, "Driver attempting registration");