git: 85893a8399bc - main - OFED: Various changes from Linux 4.15

From: John Baldwin <jhb_at_FreeBSD.org>
Date: Wed, 24 Jun 2026 19:51:14 UTC
The branch main has been updated by jhb:

URL: https://cgit.FreeBSD.org/src/commit/?id=85893a8399bce2dd66e8693037395e1979277967

commit 85893a8399bce2dd66e8693037395e1979277967
Author:     John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2026-06-24 19:30:55 +0000
Commit:     John Baldwin <jhb@FreeBSD.org>
CommitDate: 2026-06-24 19:30:55 +0000

    OFED: Various changes from Linux 4.15
    
    This contains changes from the following Linux commits:
    
    c0b64f58e8d4 RDMA/cma: Avoid triggering undefined behavior
    c0348eb06968 IB: Let ib_core resolve destination mac address
    5a3dc3237243 IB/cm: Fix memory corruption in handling CM request
    fec99ededf6b RDMA/umem: Avoid partial declaration of non-static function
    19b57c6c4499 IB/core: Convert OPA AH to IB for Extended LIDs only
    e08ce2e82b2f RDMA/core: Make function rdma_copy_addr return void
    4190b4e96954 RDMA/core: Rename kernel modify_cq to better describe its usage
    
    Tested by:      Wafa Hamzah <wafah@nvidia.com> (mlx5_ib)
    Tested by:      John Baldwin <jhb@FreeBSD.org> (iw_cxgbe)
    Sponsored by:   Chelsio Communications
---
 sys/dev/bnxt/bnxt_re/bnxt_re.h                     |  14 ---
 sys/dev/bnxt/bnxt_re/ib_verbs.c                    |  70 +------------
 sys/dev/bnxt/bnxt_re/ib_verbs.h                    |   1 -
 sys/dev/bnxt/bnxt_re/main.c                        |  22 ----
 sys/dev/mlx4/mlx4_ib/mlx4_ib_ah.c                  |   8 +-
 sys/dev/mlx5/mlx5_ib/mlx5_ib_ah.c                  |   4 -
 sys/ofed/drivers/infiniband/core/ib_addr.c         |  22 ++--
 sys/ofed/drivers/infiniband/core/ib_cm.c           |  11 +-
 sys/ofed/drivers/infiniband/core/ib_cma.c          |  19 ++--
 sys/ofed/drivers/infiniband/core/ib_umem_odp.c     |  72 +++++++++++++
 sys/ofed/drivers/infiniband/core/ib_umem_rbtree.c  | 111 ---------------------
 sys/ofed/drivers/infiniband/core/ib_uverbs_cmd.c   |   2 +-
 .../drivers/infiniband/core/ib_uverbs_marshall.c   |   3 +-
 sys/ofed/drivers/infiniband/core/ib_verbs.c        |  12 ++-
 .../drivers/infiniband/ulp/ipoib/ipoib_ethtool.c   |   5 +-
 sys/ofed/drivers/infiniband/ulp/sdp/sdp_main.c     |   2 +-
 sys/ofed/include/rdma/ib_addr.h                    |   5 +-
 sys/ofed/include/rdma/ib_umem_odp.h                |   4 -
 sys/ofed/include/rdma/ib_verbs.h                   |   7 +-
 19 files changed, 123 insertions(+), 271 deletions(-)

diff --git a/sys/dev/bnxt/bnxt_re/bnxt_re.h b/sys/dev/bnxt/bnxt_re/bnxt_re.h
index 8c78d78e742a..2e7f027380be 100644
--- a/sys/dev/bnxt/bnxt_re/bnxt_re.h
+++ b/sys/dev/bnxt/bnxt_re/bnxt_re.h
@@ -558,8 +558,6 @@ struct bnxt_re_dev {
 	struct dentry                   *pdev_debug_dir;
 	struct dentry                   *pdev_qpinfo_dir;
 	struct bnxt_re_debug_entries	*dbg_ent;
-	struct workqueue_struct		*resolve_wq;
-	struct list_head		mac_wq_list;
 	struct workqueue_struct		*dcb_wq;
 	struct workqueue_struct		*aer_wq;
 	u32				event_bitmap[3];
@@ -608,16 +606,6 @@ struct bnxt_re_dev {
 	unsigned char	*dev_addr; /* For netdev->dev_addr */
 };
 
-#define BNXT_RE_RESOLVE_RETRY_COUNT_US	5000000 /* 5 sec */
-struct bnxt_re_resolve_dmac_work{
-	struct work_struct      work;
-	struct list_head	list;
-	struct bnxt_re_dev 	*rdev;
-	struct rdma_ah_attr	*ah_attr;
-	struct bnxt_re_ah_info *ah_info;
-	atomic_t		status_wait;
-};
-
 static inline u8 bnxt_re_get_prio(u8 prio_map)
 {
 	u8 prio = 0xFF;
@@ -727,8 +715,6 @@ int bnxt_re_schedule_work(struct bnxt_re_dev *rdev, unsigned long event,
 void bnxt_re_get_link_speed(struct bnxt_re_dev *rdev);
 int _bnxt_re_ib_init(struct bnxt_re_dev *rdev);
 int _bnxt_re_ib_init2(struct bnxt_re_dev *rdev);
-void bnxt_re_init_resolve_wq(struct bnxt_re_dev *rdev);
-void bnxt_re_uninit_resolve_wq(struct bnxt_re_dev *rdev);
 
 /* The rdev ref_count is to protect immature removal of the device */
 static inline void bnxt_re_hold(struct bnxt_re_dev *rdev)
diff --git a/sys/dev/bnxt/bnxt_re/ib_verbs.c b/sys/dev/bnxt/bnxt_re/ib_verbs.c
index 55d8d8b5b04a..eacd5c1abab5 100644
--- a/sys/dev/bnxt/bnxt_re/ib_verbs.c
+++ b/sys/dev/bnxt/bnxt_re/ib_verbs.c
@@ -49,23 +49,6 @@ static inline void bnxt_re_peer_mem_release(struct ib_umem *umem)
 	ib_umem_release(umem);
 }
 
-void bnxt_re_resolve_dmac_task(struct work_struct *work)
-{
-	int rc = -1;
-	struct bnxt_re_dev *rdev;
-	struct rdma_ah_attr	*ah_attr;
-	struct bnxt_re_resolve_dmac_work *dmac_work =
-			container_of(work, struct bnxt_re_resolve_dmac_work, work);
-
-	rdev = dmac_work->rdev;
-	ah_attr = dmac_work->ah_attr;
-	rc = ib_resolve_eth_dmac(&rdev->ibdev, ah_attr);
-	if (rc)
-		dev_err(rdev_to_dev(dmac_work->rdev),
-			"Failed to resolve dest mac rc = %d\n", rc);
-	atomic_set(&dmac_work->status_wait, rc << 8);
-}
-
 static int __from_ib_access_flags(int iflags)
 {
 	int qflags = 0;
@@ -999,52 +982,6 @@ static u8 _get_sgid_index(struct bnxt_re_dev *rdev, u8 gindx)
 	return gindx;
 }
 
-static int bnxt_re_init_dmac(struct bnxt_re_dev *rdev, struct rdma_ah_attr *ah_attr,
-			     struct bnxt_re_ah_info *ah_info, bool is_user,
-			     struct bnxt_re_ah *ah)
-{
-	const struct ib_global_route *grh = rdma_ah_read_grh(ah_attr);
-	int rc = 0;
-	u8 *dmac;
-
-	if (is_user && !rdma_is_multicast_addr((struct in6_addr *)
-						grh->dgid.raw) &&
-	    !rdma_link_local_addr((struct in6_addr *)grh->dgid.raw)) {
-
-		u32 retry_count = BNXT_RE_RESOLVE_RETRY_COUNT_US;
-		struct bnxt_re_resolve_dmac_work *resolve_dmac_work;
-
-
-		resolve_dmac_work = kzalloc(sizeof(*resolve_dmac_work), GFP_ATOMIC);
-
-		resolve_dmac_work->rdev = rdev;
-		resolve_dmac_work->ah_attr = ah_attr;
-		resolve_dmac_work->ah_info = ah_info;
-
-		atomic_set(&resolve_dmac_work->status_wait, 1);
-		INIT_WORK(&resolve_dmac_work->work, bnxt_re_resolve_dmac_task);
-		queue_work(rdev->resolve_wq, &resolve_dmac_work->work);
-
-		do {
-			rc = atomic_read(&resolve_dmac_work->status_wait) & 0xFF;
-			if (!rc)
-				break;
-			udelay(1);
-		} while (--retry_count);
-		if (atomic_read(&resolve_dmac_work->status_wait)) {
-			INIT_LIST_HEAD(&resolve_dmac_work->list);
-			list_add_tail(&resolve_dmac_work->list,
-					&rdev->mac_wq_list);
-			return -EFAULT;
-		}
-		kfree(resolve_dmac_work);
-	}
-	dmac = ROCE_DMAC(ah_attr);
-	if (dmac)
-		memcpy(ah->qplib_ah.dmac, dmac, ETH_ALEN);
-	return rc;
-}
-
 int bnxt_re_create_ah(struct ib_ah *ah_in, struct rdma_ah_attr *attr,
 		      u32 flags, struct ib_udata *udata)
 {
@@ -1057,7 +994,6 @@ int bnxt_re_create_ah(struct ib_ah *ah_in, struct rdma_ah_attr *attr,
 	const struct ib_global_route *grh = rdma_ah_read_grh(attr);
 	struct bnxt_re_ah_info ah_info;
 	u32 max_ah_count;
-	bool is_user;
 	int rc;
 	bool block = true;
 	struct rdma_ah_attr *ah_attr = attr;
@@ -1068,7 +1004,6 @@ int bnxt_re_create_ah(struct ib_ah *ah_in, struct rdma_ah_attr *attr,
 
 	ah->rdev = rdev;
 	ah->qplib_ah.pd = &pd->qplib_pd;
-	is_user = ib_pd->uobject ? true : false;
 
 	/* Supply the configuration for the HW */
 	memcpy(ah->qplib_ah.dgid.data, grh->dgid.raw,
@@ -1088,10 +1023,7 @@ int bnxt_re_create_ah(struct ib_ah *ah_in, struct rdma_ah_attr *attr,
 	if (rc)
 		goto fail;
 	ah->qplib_ah.nw_type = ah_info.nw_type;
-
-	rc = bnxt_re_init_dmac(rdev, ah_attr, &ah_info, is_user, ah);
-	if (rc)
-		goto fail;
+	memcpy(ah->qplib_ah.dmac, ROCE_DMAC(ah_attr), ETH_ALEN);
 
 	rc = bnxt_qplib_create_ah(&rdev->qplib_res, &ah->qplib_ah, block);
 	if (rc) {
diff --git a/sys/dev/bnxt/bnxt_re/ib_verbs.h b/sys/dev/bnxt/bnxt_re/ib_verbs.h
index 7dd8f6ece12f..332c88e07a3d 100644
--- a/sys/dev/bnxt/bnxt_re/ib_verbs.h
+++ b/sys/dev/bnxt/bnxt_re/ib_verbs.h
@@ -398,7 +398,6 @@ struct ib_umem *ib_umem_get_flags_compat(struct bnxt_re_dev *rdev,
 					 size_t size, int access, int dmasync);
 static inline size_t ib_umem_num_pages_compat(struct ib_umem *umem);
 static inline void bnxt_re_peer_mem_release(struct ib_umem *umem);
-void bnxt_re_resolve_dmac_task(struct work_struct *work);
 
 static inline enum ib_qp_type  __from_hw_to_ib_qp_type(u8 type)
 {
diff --git a/sys/dev/bnxt/bnxt_re/main.c b/sys/dev/bnxt/bnxt_re/main.c
index 5b1fe2ae0faa..991931bdd396 100644
--- a/sys/dev/bnxt/bnxt_re/main.c
+++ b/sys/dev/bnxt/bnxt_re/main.c
@@ -137,26 +137,6 @@ void bnxt_re_set_dma_device(struct ib_device *ibdev, struct bnxt_re_dev *rdev)
 	ibdev->dma_device = &rdev->en_dev->pdev->dev;
 }
 
-void bnxt_re_init_resolve_wq(struct bnxt_re_dev *rdev)
-{
-	rdev->resolve_wq = create_singlethread_workqueue("bnxt_re_resolve_wq");
-	 INIT_LIST_HEAD(&rdev->mac_wq_list);
-}
-
-void bnxt_re_uninit_resolve_wq(struct bnxt_re_dev *rdev)
-{
-	struct bnxt_re_resolve_dmac_work *tmp_work = NULL, *tmp_st;
-	if (!rdev->resolve_wq)
-		return;
-	flush_workqueue(rdev->resolve_wq);
-	list_for_each_entry_safe(tmp_work, tmp_st, &rdev->mac_wq_list, list) {
-			list_del(&tmp_work->list);
-			kfree(tmp_work);
-	}
-	destroy_workqueue(rdev->resolve_wq);
-	rdev->resolve_wq = NULL;
-}
-
 u32 readl_fbsd(struct bnxt_softc *bp, u32 reg_off, u8 bar_idx)
 {
 
@@ -3534,7 +3514,6 @@ static void bnxt_re_dev_uninit(struct bnxt_re_dev *rdev, u8 op_type)
 		mutex_unlock(&bnxt_re_dev_lock);
 	}
 
-	bnxt_re_uninit_resolve_wq(rdev);
 	bnxt_re_uninit_dcb_wq(rdev);
 	bnxt_re_uninit_aer_wq(rdev);
 
@@ -3804,7 +3783,6 @@ static int bnxt_re_dev_init(struct bnxt_re_dev *rdev, u8 op_type)
 
 	bnxt_re_init_dcb_wq(rdev);
 	bnxt_re_init_aer_wq(rdev);
-	bnxt_re_init_resolve_wq(rdev);
 	mutex_lock(&bnxt_re_dev_lock);
 	list_add_tail_rcu(&rdev->list, &bnxt_re_dev_list);
 	/* Added to the list, not in progress anymore */
diff --git a/sys/dev/mlx4/mlx4_ib/mlx4_ib_ah.c b/sys/dev/mlx4/mlx4_ib/mlx4_ib_ah.c
index 6bb17975143f..e31c223c27e6 100644
--- a/sys/dev/mlx4/mlx4_ib/mlx4_ib_ah.c
+++ b/sys/dev/mlx4/mlx4_ib/mlx4_ib_ah.c
@@ -90,12 +90,10 @@ static int create_iboe_ah(struct ib_ah *ib_ah, struct rdma_ah_attr *ah_attr)
 	int ret;
 
 	memcpy(&in6, grh->dgid.raw, sizeof(in6));
-	if (rdma_is_multicast_addr(&in6)) {
+	if (rdma_is_multicast_addr(&in6))
 		is_mcast = 1;
-		rdma_get_mcast_mac(&in6, ah->av.eth.mac);
-	} else {
-		memcpy(ah->av.eth.mac, ah_attr->roce.dmac, ETH_ALEN);
-	}
+
+	memcpy(ah->av.eth.mac, ah_attr->roce.dmac, ETH_ALEN);
 	ret = ib_get_cached_gid(pd->device, rdma_ah_get_port_num(ah_attr),
 				grh->sgid_index, &sgid, &gid_attr);
 	if (ret)
diff --git a/sys/dev/mlx5/mlx5_ib/mlx5_ib_ah.c b/sys/dev/mlx5/mlx5_ib/mlx5_ib_ah.c
index c42126241050..7439ec3fa4ea 100644
--- a/sys/dev/mlx5/mlx5_ib/mlx5_ib_ah.c
+++ b/sys/dev/mlx5/mlx5_ib/mlx5_ib_ah.c
@@ -83,10 +83,6 @@ int mlx5_ib_create_ah(struct ib_ah *ibah, struct rdma_ah_attr *ah_attr,
 
 		resp.response_length = min_resp_len;
 
-		err = ib_resolve_eth_dmac(&dev->ib_dev, ah_attr);
-		if (err)
-			return err;
-
 		memcpy(resp.dmac, ah_attr->roce.dmac, ETH_ALEN);
 		err = ib_copy_to_udata(udata, &resp, resp.response_length);
 		if (err)
diff --git a/sys/ofed/drivers/infiniband/core/ib_addr.c b/sys/ofed/drivers/infiniband/core/ib_addr.c
index c953ca604588..ecacfd6a43dd 100644
--- a/sys/ofed/drivers/infiniband/core/ib_addr.c
+++ b/sys/ofed/drivers/infiniband/core/ib_addr.c
@@ -139,8 +139,9 @@ rdma_copy_addr_sub(u8 *dst, const u8 *src, unsigned min, unsigned max)
 	memset(dst + min, 0, max - min);
 }
 
-int rdma_copy_addr(struct rdma_dev_addr *dev_addr, if_t dev,
-		     const unsigned char *dst_dev_addr)
+void rdma_copy_addr(struct rdma_dev_addr *dev_addr,
+		    const if_t dev,
+		    const unsigned char *dst_dev_addr)
 {
 	int dev_type = if_gettype(dev);
 
@@ -151,7 +152,7 @@ int rdma_copy_addr(struct rdma_dev_addr *dev_addr, if_t dev,
 		memset(dev_addr->broadcast, 0, MAX_ADDR_LEN);
 		memset(dev_addr->dst_dev_addr, 0, MAX_ADDR_LEN);
 		dev_addr->bound_dev_if = if_getindex(dev);
-		return (0);
+		return;
 	} else if (dev_type == IFT_INFINIBAND)
 		dev_addr->dev_type = ARPHRD_INFINIBAND;
 	else if (dev_type == IFT_ETHER || dev_type == IFT_L2VLAN)
@@ -167,7 +168,6 @@ int rdma_copy_addr(struct rdma_dev_addr *dev_addr, if_t dev,
 				   if_getaddrlen(dev), MAX_ADDR_LEN);
 	}
 	dev_addr->bound_dev_if = if_getindex(dev);
-	return 0;
 }
 EXPORT_SYMBOL(rdma_copy_addr);
 
@@ -175,7 +175,7 @@ int rdma_translate_ip(const struct sockaddr *addr,
 		      struct rdma_dev_addr *dev_addr)
 {
 	if_t dev;
-	int ret;
+	int ret = 0;
 
 	if (dev_addr->bound_dev_if) {
 		dev = dev_get_by_index(dev_addr->net, dev_addr->bound_dev_if);
@@ -202,7 +202,7 @@ int rdma_translate_ip(const struct sockaddr *addr,
 		if (if_getflags(dev) & IFF_LOOPBACK)
 			ret = -EINVAL;
 		else
-			ret = rdma_copy_addr(dev_addr, dev, NULL);
+			rdma_copy_addr(dev_addr, dev, NULL);
 		dev_put(dev);
 	} else {
 		ret = -ENODEV;
@@ -655,10 +655,14 @@ static int addr_resolve_neigh(if_t dev,
 	}
 
 	/* If the device doesn't do ARP internally */
-	if (!(if_getflags(dev) & IFF_NOARP))
-		return rdma_copy_addr(addr, dev, edst);
+	if (!(if_getflags(dev) & IFF_NOARP)) {
+		rdma_copy_addr(addr, dev, edst);
+                return 0;
+        }
 
-	return rdma_copy_addr(addr, dev, NULL);
+	rdma_copy_addr(addr, dev, NULL);
+
+	return 0;
 }
 
 static int addr_resolve(struct sockaddr *src_in,
diff --git a/sys/ofed/drivers/infiniband/core/ib_cm.c b/sys/ofed/drivers/infiniband/core/ib_cm.c
index 17d483f565ce..be29881c73c9 100644
--- a/sys/ofed/drivers/infiniband/core/ib_cm.c
+++ b/sys/ofed/drivers/infiniband/core/ib_cm.c
@@ -1601,7 +1601,7 @@ static void cm_format_req_event(struct cm_work *work,
 	param->bth_pkey = cm_get_bth_pkey(work);
 	param->port = cm_id_priv->av.port->port_num;
 	param->primary_path = &work->path[0];
-	if (req_msg->alt_local_lid)
+	if (cm_req_has_alt_path(req_msg))
 		param->alternate_path = &work->path[1];
 	else
 		param->alternate_path = NULL;
@@ -1884,7 +1884,8 @@ static int cm_req_handler(struct cm_work *work)
 	cm_process_routed_req(req_msg, work->mad_recv_wc->wc);
 
 	memset(&work->path[0], 0, sizeof(work->path[0]));
-	memset(&work->path[1], 0, sizeof(work->path[1]));
+	if (cm_req_has_alt_path(req_msg))
+		memset(&work->path[1], 0, sizeof(work->path[1]));
 	grh = rdma_ah_read_grh(&cm_id_priv->av.ah_attr);
 	ret = ib_get_cached_gid(work->port->cm_dev->ib_device,
 				work->port->port_num,
@@ -3868,14 +3869,16 @@ static void cm_recv_handler(struct ib_mad_agent *mad_agent,
 	struct cm_port *port = mad_agent->context;
 	struct cm_work *work;
 	enum ib_cm_event_type event;
+	bool alt_path = false;
 	u16 attr_id;
 	int paths = 0;
 	int going_down = 0;
 
 	switch (mad_recv_wc->recv_buf.mad->mad_hdr.attr_id) {
 	case CM_REQ_ATTR_ID:
-		paths = 1 + (((struct cm_req_msg *) mad_recv_wc->recv_buf.mad)->
-						    alt_local_lid != 0);
+		alt_path = cm_req_has_alt_path((struct cm_req_msg *)
+						mad_recv_wc->recv_buf.mad);
+		paths = 1 + (alt_path != 0);
 		event = IB_CM_REQ_RECEIVED;
 		break;
 	case CM_MRA_ATTR_ID:
diff --git a/sys/ofed/drivers/infiniband/core/ib_cma.c b/sys/ofed/drivers/infiniband/core/ib_cma.c
index ee7c47863aff..33a4189804e1 100644
--- a/sys/ofed/drivers/infiniband/core/ib_cma.c
+++ b/sys/ofed/drivers/infiniband/core/ib_cma.c
@@ -1823,7 +1823,7 @@ there_is_no_net_dev:
 	return id_priv;
 }
 
-static inline int cma_user_data_offset(struct rdma_id_private *id_priv)
+static inline u8 cma_user_data_offset(struct rdma_id_private *id_priv)
 {
 	if (cma_family(id_priv) == AF_IB)
 		return 0;
@@ -2144,9 +2144,7 @@ static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
 		rt->path_rec[1] = *ib_event->param.req_rcvd.alternate_path;
 
 	if (net_dev) {
-		ret = rdma_copy_addr(&rt->addr.dev_addr, net_dev, NULL);
-		if (ret)
-			goto err;
+		rdma_copy_addr(&rt->addr.dev_addr, net_dev, NULL);
 	} else {
 		if (!cma_protocol_roce(listen_id) &&
 		    cma_any_addr(vnet, cma_src_addr(id_priv))) {
@@ -2192,9 +2190,7 @@ static struct rdma_id_private *cma_new_udp_id(struct rdma_cm_id *listen_id,
 		goto err;
 
 	if (net_dev) {
-		ret = rdma_copy_addr(&id->route.addr.dev_addr, net_dev, NULL);
-		if (ret)
-			goto err;
+		rdma_copy_addr(&id->route.addr.dev_addr, net_dev, NULL);
 	} else {
 		if (!cma_any_addr(vnet, cma_src_addr(id_priv))) {
 			ret = cma_translate_addr(cma_src_addr(id_priv),
@@ -2240,7 +2236,8 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
 	struct rdma_id_private *listen_id, *conn_id = NULL;
 	struct rdma_cm_event event;
 	if_t net_dev;
-	int offset, ret;
+	u8 offset;
+	int ret;
 
 	listen_id = cma_id_from_event(cm_id, ib_event, &net_dev);
 	if (IS_ERR(listen_id))
@@ -3788,7 +3785,8 @@ static int cma_resolve_ib_udp(struct rdma_id_private *id_priv,
 	struct ib_cm_sidr_req_param req;
 	struct ib_cm_id	*id;
 	void *private_data;
-	int offset, ret;
+	u8 offset;
+	int ret;
 
 	memset(&req, 0, sizeof req);
 	offset = cma_user_data_offset(id_priv);
@@ -3845,7 +3843,8 @@ static int cma_connect_ib(struct rdma_id_private *id_priv,
 	struct rdma_route *route;
 	void *private_data;
 	struct ib_cm_id	*id;
-	int offset, ret;
+	u8 offset;
+	int ret;
 
 	memset(&req, 0, sizeof req);
 	offset = cma_user_data_offset(id_priv);
diff --git a/sys/ofed/drivers/infiniband/core/ib_umem_odp.c b/sys/ofed/drivers/infiniband/core/ib_umem_odp.c
index 9e15a5bfa981..1b469f0a086e 100644
--- a/sys/ofed/drivers/infiniband/core/ib_umem_odp.c
+++ b/sys/ofed/drivers/infiniband/core/ib_umem_odp.c
@@ -38,11 +38,44 @@
 #include <linux/slab.h>
 #include <linux/vmalloc.h>
 #include <linux/hugetlb.h>
+#include <linux/interval_tree_generic.h>
 
 #include <rdma/ib_verbs.h>
 #include <rdma/ib_umem.h>
 #include <rdma/ib_umem_odp.h>
 
+/*
+ * The ib_umem list keeps track of memory regions for which the HW
+ * device request to receive notification when the related memory
+ * mapping is changed.
+ *
+ * ib_umem_lock protects the list.
+ */
+
+static u64 node_start(struct umem_odp_node *n)
+{
+	struct ib_umem_odp *umem_odp =
+			container_of(n, struct ib_umem_odp, interval_tree);
+
+	return ib_umem_start(umem_odp->umem);
+}
+
+/* Note that the representation of the intervals in the interval tree
+ * considers the ending point as contained in the interval, while the
+ * function ib_umem_end returns the first address which is not contained
+ * in the umem.
+ */
+static u64 node_last(struct umem_odp_node *n)
+{
+	struct ib_umem_odp *umem_odp =
+			container_of(n, struct ib_umem_odp, interval_tree);
+
+	return ib_umem_end(umem_odp->umem) - 1;
+}
+
+INTERVAL_TREE_DEFINE(struct umem_odp_node, rb, u64, __subtree_last,
+		     node_start, node_last, static, rbt_ib_umem)
+
 static void ib_umem_notifier_start_account(struct ib_umem *item)
 {
 	mutex_lock(&item->odp_data->umem_mutex);
@@ -747,3 +780,42 @@ void ib_umem_odp_unmap_dma_pages(struct ib_umem *umem, u64 virt,
 	mutex_unlock(&umem->odp_data->umem_mutex);
 }
 EXPORT_SYMBOL(ib_umem_odp_unmap_dma_pages);
+
+/* @last is not a part of the interval. See comment for function
+ * node_last.
+ */
+int rbt_ib_umem_for_each_in_range(struct rb_root_cached *root,
+				  u64 start, u64 last,
+				  umem_call_back cb,
+				  void *cookie)
+{
+	int ret_val = 0;
+	struct umem_odp_node *node, *next;
+	struct ib_umem_odp *umem;
+
+	if (unlikely(start == last))
+		return ret_val;
+
+	for (node = rbt_ib_umem_iter_first(root, start, last - 1);
+			node; node = next) {
+		next = rbt_ib_umem_iter_next(node, start, last - 1);
+		umem = container_of(node, struct ib_umem_odp, interval_tree);
+		ret_val = cb(umem->umem, start, last, cookie) || ret_val;
+	}
+
+	return ret_val;
+}
+EXPORT_SYMBOL(rbt_ib_umem_for_each_in_range);
+
+struct ib_umem_odp *rbt_ib_umem_lookup(struct rb_root_cached *root,
+				       u64 addr, u64 length)
+{
+	struct umem_odp_node *node;
+
+	node = rbt_ib_umem_iter_first(root, addr, addr + length - 1);
+	if (node)
+		return container_of(node, struct ib_umem_odp, interval_tree);
+	return NULL;
+
+}
+EXPORT_SYMBOL(rbt_ib_umem_lookup);
diff --git a/sys/ofed/drivers/infiniband/core/ib_umem_rbtree.c b/sys/ofed/drivers/infiniband/core/ib_umem_rbtree.c
deleted file mode 100644
index 8025a14c2e4c..000000000000
--- a/sys/ofed/drivers/infiniband/core/ib_umem_rbtree.c
+++ /dev/null
@@ -1,111 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
- *
- * Copyright (c) 2014 Mellanox Technologies. All rights reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses.  You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the
- * OpenIB.org BSD license below:
- *
- *     Redistribution and use in source and binary forms, with or
- *     without modification, are permitted provided that the following
- *     conditions are met:
- *
- *      - Redistributions of source code must retain the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer.
- *
- *      - Redistributions in binary form must reproduce the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer in the documentation and/or other materials
- *        provided with the distribution.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#include <sys/cdefs.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/sched.h>
-#include <linux/gfp.h>
-#include <rdma/ib_umem_odp.h>
-
-/*
- * The ib_umem list keeps track of memory regions for which the HW
- * device request to receive notification when the related memory
- * mapping is changed.
- *
- * ib_umem_lock protects the list.
- */
-
-static inline u64 node_start(struct umem_odp_node *n)
-{
-	struct ib_umem_odp *umem_odp =
-			container_of(n, struct ib_umem_odp, interval_tree);
-
-	return ib_umem_start(umem_odp->umem);
-}
-
-/* Note that the representation of the intervals in the interval tree
- * considers the ending point as contained in the interval, while the
- * function ib_umem_end returns the first address which is not contained
- * in the umem.
- */
-static inline u64 node_last(struct umem_odp_node *n)
-{
-	struct ib_umem_odp *umem_odp =
-			container_of(n, struct ib_umem_odp, interval_tree);
-
-	return ib_umem_end(umem_odp->umem) - 1;
-}
-
-INTERVAL_TREE_DEFINE(struct umem_odp_node, rb, u64, __subtree_last,
-		     node_start, node_last, , rbt_ib_umem)
-
-/* @last is not a part of the interval. See comment for function
- * node_last.
- */
-int rbt_ib_umem_for_each_in_range(struct rb_root_cached *root,
-				  u64 start, u64 last,
-				  umem_call_back cb,
-				  void *cookie)
-{
-	int ret_val = 0;
-	struct umem_odp_node *node, *next;
-	struct ib_umem_odp *umem;
-
-	if (unlikely(start == last))
-		return ret_val;
-
-	for (node = rbt_ib_umem_iter_first(root, start, last - 1);
-			node; node = next) {
-		next = rbt_ib_umem_iter_next(node, start, last - 1);
-		umem = container_of(node, struct ib_umem_odp, interval_tree);
-		ret_val = cb(umem->umem, start, last, cookie) || ret_val;
-	}
-
-	return ret_val;
-}
-EXPORT_SYMBOL(rbt_ib_umem_for_each_in_range);
-
-struct ib_umem_odp *rbt_ib_umem_lookup(struct rb_root_cached *root,
-				       u64 addr, u64 length)
-{
-	struct umem_odp_node *node;
-
-	node = rbt_ib_umem_iter_first(root, addr, addr + length - 1);
-	if (node)
-		return container_of(node, struct ib_umem_odp, interval_tree);
-	return NULL;
-
-}
-EXPORT_SYMBOL(rbt_ib_umem_lookup);
diff --git a/sys/ofed/drivers/infiniband/core/ib_uverbs_cmd.c b/sys/ofed/drivers/infiniband/core/ib_uverbs_cmd.c
index 711c73c18115..a581d3c10b49 100644
--- a/sys/ofed/drivers/infiniband/core/ib_uverbs_cmd.c
+++ b/sys/ofed/drivers/infiniband/core/ib_uverbs_cmd.c
@@ -3714,7 +3714,7 @@ static int ib_uverbs_ex_modify_cq(struct uverbs_attr_bundle *attrs)
 	if (!cq)
 		return -EINVAL;
 
-	ret = ib_modify_cq(cq, cmd.attr.cq_count, cmd.attr.cq_period);
+	ret = rdma_set_cq_moderation(cq, cmd.attr.cq_count, cmd.attr.cq_period);
 
 	rdma_lookup_put_uobject(&cq->uobject->uevent.uobject,
 				UVERBS_LOOKUP_READ);
diff --git a/sys/ofed/drivers/infiniband/core/ib_uverbs_marshall.c b/sys/ofed/drivers/infiniband/core/ib_uverbs_marshall.c
index f7c4a221aa88..f74ecbf9cf96 100644
--- a/sys/ofed/drivers/infiniband/core/ib_uverbs_marshall.c
+++ b/sys/ofed/drivers/infiniband/core/ib_uverbs_marshall.c
@@ -71,8 +71,7 @@ void ib_copy_ah_attr_to_user(struct ib_device *device,
 	memset(&dst->grh.reserved, 0, sizeof(dst->grh.reserved));
 
 	if ((ah_attr->type == RDMA_AH_ATTR_TYPE_OPA) &&
-	    (rdma_ah_get_dlid(ah_attr) >=
-	     be16_to_cpu(IB_MULTICAST_LID_BASE)) &&
+	    (rdma_ah_get_dlid(ah_attr) > be16_to_cpu(IB_LID_PERMISSIVE)) &&
 	    (!rdma_ah_conv_opa_to_ib(device, &conv_ah, ah_attr)))
 		src = &conv_ah;
 
diff --git a/sys/ofed/drivers/infiniband/core/ib_verbs.c b/sys/ofed/drivers/infiniband/core/ib_verbs.c
index ef65aeefd8f4..b0cdf8a318d9 100644
--- a/sys/ofed/drivers/infiniband/core/ib_verbs.c
+++ b/sys/ofed/drivers/infiniband/core/ib_verbs.c
@@ -58,6 +58,9 @@
 
 #include "core_priv.h"
 
+static int ib_resolve_eth_dmac(struct ib_device *device,
+			       struct rdma_ah_attr *ah_attr);
+
 static const char * const ib_events[] = {
 	[IB_EVENT_CQ_ERR]		= "CQ error",
 	[IB_EVENT_QP_FATAL]		= "QP fatal error",
@@ -1289,8 +1292,8 @@ bool ib_modify_qp_is_ok(enum ib_qp_state cur_state, enum ib_qp_state next_state,
 }
 EXPORT_SYMBOL(ib_modify_qp_is_ok);
 
-int ib_resolve_eth_dmac(struct ib_device *device,
-			struct rdma_ah_attr *ah_attr)
+static int ib_resolve_eth_dmac(struct ib_device *device,
+			       struct rdma_ah_attr *ah_attr)
 {
 	struct ib_gid_attr sgid_attr;
 	union ib_gid sgid;
@@ -1336,7 +1339,6 @@ int ib_resolve_eth_dmac(struct ib_device *device,
 	grh->hop_limit = hop_limit;
 	return ret;
 }
-EXPORT_SYMBOL(ib_resolve_eth_dmac);
 
 static bool is_qp_type_connected(const struct ib_qp *qp)
 {
@@ -1566,12 +1568,12 @@ struct ib_cq *__ib_create_cq(struct ib_device *device,
 }
 EXPORT_SYMBOL(__ib_create_cq);
 
-int ib_modify_cq(struct ib_cq *cq, u16 cq_count, u16 cq_period)
+int rdma_set_cq_moderation(struct ib_cq *cq, u16 cq_count, u16 cq_period)
 {
 	return cq->device->modify_cq ?
 		cq->device->modify_cq(cq, cq_count, cq_period) : -ENOSYS;
 }
-EXPORT_SYMBOL(ib_modify_cq);
+EXPORT_SYMBOL(rdma_set_cq_moderation);
 
 int ib_destroy_cq_user(struct ib_cq *cq, struct ib_udata *udata)
 {
diff --git a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_ethtool.c b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_ethtool.c
index 841326bd958d..10cc5be661b5 100644
--- a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_ethtool.c
+++ b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_ethtool.c
@@ -87,8 +87,9 @@ static int ipoib_set_coalesce(if_t dev,
 			coal->rx_coalesce_usecs = 0xffff;
 	}
 
-	ret = ib_modify_cq(priv->recv_cq, coal->rx_max_coalesced_frames,
-			   coal->rx_coalesce_usecs);
+	ret = rdma_set_cq_moderation(priv->recv_cq,
+				     coal->rx_max_coalesced_frames,
+				     coal->rx_coalesce_usecs);
 	if (ret && ret != -ENOSYS) {
 		ipoib_warn(priv, "failed modifying CQ (%d)\n", ret);
 		return ret;
diff --git a/sys/ofed/drivers/infiniband/ulp/sdp/sdp_main.c b/sys/ofed/drivers/infiniband/ulp/sdp/sdp_main.c
index cfc2390db02e..fd45e9961353 100644
--- a/sys/ofed/drivers/infiniband/ulp/sdp/sdp_main.c
+++ b/sys/ofed/drivers/infiniband/ulp/sdp/sdp_main.c
@@ -1682,7 +1682,7 @@ sdp_set_default_moderation(struct sdp_sock *ssk)
 {
 	if (sdp_mod_count <= 0 || sdp_mod_usec <= 0)
 		return;
-	ib_modify_cq(ssk->rx_ring.cq, sdp_mod_count, sdp_mod_usec);
+	rdma_set_cq_moderation(ssk->rx_ring.cq, sdp_mod_count, sdp_mod_usec);
 }
 
 static void
diff --git a/sys/ofed/include/rdma/ib_addr.h b/sys/ofed/include/rdma/ib_addr.h
index fc938afabd05..b59d4a7bd572 100644
--- a/sys/ofed/include/rdma/ib_addr.h
+++ b/sys/ofed/include/rdma/ib_addr.h
@@ -140,8 +140,9 @@ int rdma_resolve_ip_route(struct sockaddr *src_addr,
 
 void rdma_addr_cancel(struct rdma_dev_addr *addr);
 
-int rdma_copy_addr(struct rdma_dev_addr *dev_addr, if_t dev,
-	      const unsigned char *dst_dev_addr);
+void rdma_copy_addr(struct rdma_dev_addr *dev_addr,
+		    const if_t dev,
+		    const unsigned char *dst_dev_addr);
 
 int rdma_addr_size(struct sockaddr *addr);
 int rdma_addr_size_in6(struct sockaddr_in6 *addr);
diff --git a/sys/ofed/include/rdma/ib_umem_odp.h b/sys/ofed/include/rdma/ib_umem_odp.h
index 5affdc6427d9..99a6127a562e 100644
--- a/sys/ofed/include/rdma/ib_umem_odp.h
+++ b/sys/ofed/include/rdma/ib_umem_odp.h
@@ -114,10 +114,6 @@ int ib_umem_odp_map_dma_pages(struct ib_umem *umem, u64 start_offset, u64 bcnt,
 void ib_umem_odp_unmap_dma_pages(struct ib_umem *umem, u64 start_offset,
 				 u64 bound);
 
-void rbt_ib_umem_insert(struct umem_odp_node *node,
-			struct rb_root_cached *root);
-void rbt_ib_umem_remove(struct umem_odp_node *node,
-			struct rb_root_cached *root);
 typedef int (*umem_call_back)(struct ib_umem *item, u64 start, u64 end,
 			      void *cookie);
 /*
diff --git a/sys/ofed/include/rdma/ib_verbs.h b/sys/ofed/include/rdma/ib_verbs.h
index d526054a29c5..45c7d238de68 100644
--- a/sys/ofed/include/rdma/ib_verbs.h
+++ b/sys/ofed/include/rdma/ib_verbs.h
@@ -3420,13 +3420,13 @@ struct ib_cq *__ib_create_cq(struct ib_device *device,
 int ib_resize_cq(struct ib_cq *cq, int cqe);
 
 /**
- * ib_modify_cq - Modifies moderation params of the CQ
+ * rdma_set_cq_moderation - Modifies moderation params of the CQ
  * @cq: The CQ to modify.
  * @cq_count: number of CQEs that will trigger an event
  * @cq_period: max period of time in usec before triggering an event
  *
  */
-int ib_modify_cq(struct ib_cq *cq, u16 cq_count, u16 cq_period);
+int rdma_set_cq_moderation(struct ib_cq *cq, u16 cq_count, u16 cq_period);
 
 /**
  * ib_destroy_cq_user - Destroys the specified CQ.
@@ -3943,9 +3943,6 @@ struct ib_ucontext *ib_uverbs_get_ucontext_file(struct ib_uverbs_file *ufile);
 
 int uverbs_destroy_def_handler(struct uverbs_attr_bundle *attrs);
 
-int ib_resolve_eth_dmac(struct ib_device *device,
-			struct rdma_ah_attr *ah_attr);
-
 static inline u8 *rdma_ah_retrieve_dmac(struct rdma_ah_attr *attr)
 {
 	if (attr->type == RDMA_AH_ATTR_TYPE_ROCE)