Index: sys/compat/linuxkpi/common/include/linux/rbtree.h =================================================================== --- sys/compat/linuxkpi/common/include/linux/rbtree.h +++ sys/compat/linuxkpi/common/include/linux/rbtree.h @@ -57,6 +57,7 @@ RB_PROTOTYPE(linux_root, rb_node, __entry, panic_cmp); #define rb_parent(r) RB_PARENT(r, __entry) +#define rb_ptr(r) RB_PTR(r, __entry) #define rb_set_parent(r, p) rb_parent((r)) = (p) #define rb_entry(ptr, type, member) container_of(ptr, type, member) @@ -87,19 +88,26 @@ struct rb_root *root) { struct rb_node *p; + int red; + if (rb_ptr(victim->rb_left)) + rb_set_parent(victim->rb_left, new); + if (rb_ptr(victim->rb_right)) + rb_set_parent(victim->rb_right, new); p = rb_parent(victim); - if (p) { - if (p->rb_left == victim) - p->rb_left = new; - else - p->rb_right = new; - } else + if (!p) root->rb_node = new; - if (victim->rb_left) - rb_set_parent(victim->rb_left, new); - if (victim->rb_right) - rb_set_parent(victim->rb_right, new); + else if (rb_ptr(p->rb_left) == victim) { + red = RB_ISRED(p->rb_left); + p->rb_left = new; + if (red) + RB_FLIP(p->rb_left); + } else { + red = RB_ISRED(p->rb_right); + p->rb_right = new; + if (red) + RB_FLIP(p->rb-right); + } *new = *victim; } Index: sys/dev/mlx4/mlx4_core/mlx4_resource_tracker.c =================================================================== --- sys/dev/mlx4/mlx4_core/mlx4_resource_tracker.c +++ sys/dev/mlx4/mlx4_core/mlx4_resource_tracker.c @@ -239,9 +239,9 @@ node); if (res_id < res->res_id) - node = node->rb_left; + node = rb_ptr(node->rb_left); else if (res_id > res->res_id) - node = node->rb_right; + node = rb_ptr(node->rb_right); else return res; } @@ -253,11 +253,11 @@ struct rb_node **new = &(root->rb_node), *parent = NULL; /* Figure out where to put new node */ - while (*new) { - struct res_common *this = container_of(*new, struct res_common, + while (rb_ptr(*new)) { + struct res_common *this = container_of(rb_ptr(*new), struct res_common, node); - parent = *new; + parent = rb_ptr(*new); if (res->res_id < this->res_id) new = &((*new)->rb_left); else if (res->res_id > this->res_id) Index: sys/dev/mlx4/mlx4_ib/mlx4_ib_cm.c =================================================================== --- sys/dev/mlx4/mlx4_ib/mlx4_ib_cm.c +++ sys/dev/mlx4/mlx4_ib/mlx4_ib_cm.c @@ -151,13 +151,13 @@ rb_entry(node, struct id_map_entry, node); if (id_map_entry->sl_cm_id > sl_cm_id) - node = node->rb_left; + node = rb_ptr(node->rb_left); else if (id_map_entry->sl_cm_id < sl_cm_id) - node = node->rb_right; + node = rb_ptr(node->rb_right); else if (id_map_entry->slave_id > slave_id) - node = node->rb_left; + node = rb_ptr(node->rb_left); else if (id_map_entry->slave_id < slave_id) - node = node->rb_right; + node = rb_ptr(node->rb_right); else return id_map_entry; } @@ -225,8 +225,8 @@ } /* Go to the bottom of the tree */ - while (*link) { - parent = *link; + while (rb_ptr(*link)) { + parent = rb_ptr(*link); ent = rb_entry(parent, struct id_map_entry, node); if (ent->sl_cm_id > sl_cm_id || (ent->sl_cm_id == sl_cm_id && ent->slave_id > slave_id)) Index: sys/dev/mlx4/mlx4_ib/mlx4_ib_mcg.c =================================================================== --- sys/dev/mlx4/mlx4_ib/mlx4_ib_mcg.c +++ sys/dev/mlx4/mlx4_ib/mlx4_ib_mcg.c @@ -173,9 +173,9 @@ return group; if (ret < 0) - node = node->rb_left; + node = rb_ptr(node->rb_left); else - node = node->rb_right; + node = rb_ptr(node->rb_right); } return NULL; } @@ -188,8 +188,8 @@ struct mcast_group *cur_group; int ret; - while (*link) { - parent = *link; + while (rb_ptr(*link)) { + parent = rb_ptr(*link); cur_group = rb_entry(parent, struct mcast_group, node); ret = memcmp(group->rec.mgid.raw, cur_group->rec.mgid.raw, Index: sys/dev/mlx5/mlx5_core/mlx5_pagealloc.c =================================================================== --- sys/dev/mlx5/mlx5_core/mlx5_pagealloc.c +++ sys/dev/mlx5/mlx5_core/mlx5_pagealloc.c @@ -210,8 +210,8 @@ struct rb_node *parent = NULL; struct mlx5_fw_page *tfp; - while (*new) { - parent = *new; + while (rb_ptr(*new)) { + parent = rb_ptr(*new); tfp = rb_entry(parent, struct mlx5_fw_page, rb_node); if (tfp->dma_addr < nfp->dma_addr) new = &parent->rb_left; @@ -237,9 +237,9 @@ while (tmp) { tfp = rb_entry(tmp, struct mlx5_fw_page, rb_node); if (tfp->dma_addr < addr) { - tmp = tmp->rb_left; + tmp = rb_ptr(tmp->rb_left); } else if (tfp->dma_addr > addr) { - tmp = tmp->rb_right; + tmp = rb_ptr(tmp->rb_right); } else { rb_erase(&tfp->rb_node, &dev->priv.page_root); result = tfp; Index: sys/ofed/drivers/infiniband/core/ib_cm.c =================================================================== --- sys/ofed/drivers/infiniband/core/ib_cm.c +++ sys/ofed/drivers/infiniband/core/ib_cm.c @@ -557,8 +557,8 @@ __be64 service_id = cm_id_priv->id.service_id; __be64 service_mask = cm_id_priv->id.service_mask; - while (*link) { - parent = *link; + while (rb_ptr(*link)) { + parent = rb_ptr(*link); cur_cm_id_priv = rb_entry(parent, struct cm_id_private, service_node); if ((cur_cm_id_priv->id.service_mask & service_id) == @@ -596,15 +596,15 @@ return cm_id_priv; if (device < cm_id_priv->id.device) - node = node->rb_left; + node = rb_ptr(node->rb_left); else if (device > cm_id_priv->id.device) - node = node->rb_right; + node = rb_ptr(node->rb_right); else if (be64_lt(service_id, cm_id_priv->id.service_id)) - node = node->rb_left; + node = rb_ptr(node->rb_left); else if (be64_gt(service_id, cm_id_priv->id.service_id)) - node = node->rb_right; + node = rb_ptr(node->rb_right); else - node = node->rb_right; + node = rb_ptr(node->rb_right); } return NULL; } @@ -618,8 +618,8 @@ __be64 remote_ca_guid = timewait_info->remote_ca_guid; __be32 remote_id = timewait_info->work.remote_id; - while (*link) { - parent = *link; + while (rb_ptr(*link)) { + parent = rb_ptr(*link); cur_timewait_info = rb_entry(parent, struct cm_timewait_info, remote_id_node); if (be32_lt(remote_id, cur_timewait_info->work.remote_id)) @@ -649,13 +649,13 @@ timewait_info = rb_entry(node, struct cm_timewait_info, remote_id_node); if (be32_lt(remote_id, timewait_info->work.remote_id)) - node = node->rb_left; + node = rb_ptr(node->rb_left); else if (be32_gt(remote_id, timewait_info->work.remote_id)) - node = node->rb_right; + node = rb_ptr(node->rb_right); else if (be64_lt(remote_ca_guid, timewait_info->remote_ca_guid)) - node = node->rb_left; + node = rb_ptr(node->rb_left); else if (be64_gt(remote_ca_guid, timewait_info->remote_ca_guid)) - node = node->rb_right; + node = rb_ptr(node->rb_right); else return timewait_info; } @@ -671,8 +671,8 @@ __be64 remote_ca_guid = timewait_info->remote_ca_guid; __be32 remote_qpn = timewait_info->remote_qpn; - while (*link) { - parent = *link; + while (rb_ptr(*link)) { + parent = rb_ptr(*link); cur_timewait_info = rb_entry(parent, struct cm_timewait_info, remote_qp_node); if (be32_lt(remote_qpn, cur_timewait_info->remote_qpn)) @@ -701,22 +701,22 @@ union ib_gid *port_gid = &cm_id_priv->av.dgid; __be32 remote_id = cm_id_priv->id.remote_id; - while (*link) { - parent = *link; + while (rb_ptr(*link)) { + parent = rb_ptr(*link); cur_cm_id_priv = rb_entry(parent, struct cm_id_private, sidr_id_node); if (be32_lt(remote_id, cur_cm_id_priv->id.remote_id)) - link = &(*link)->rb_left; + link = &parent->rb_left; else if (be32_gt(remote_id, cur_cm_id_priv->id.remote_id)) - link = &(*link)->rb_right; + link = &parent->rb_right; else { int cmp; cmp = memcmp(port_gid, &cur_cm_id_priv->av.dgid, sizeof *port_gid); if (cmp < 0) - link = &(*link)->rb_left; + link = &parent->rb_left; else if (cmp > 0) - link = &(*link)->rb_right; + link = &parent->rb_right; else return cur_cm_id_priv; } Index: sys/ofed/drivers/infiniband/core/ib_multicast.c =================================================================== --- sys/ofed/drivers/infiniband/core/ib_multicast.c +++ sys/ofed/drivers/infiniband/core/ib_multicast.c @@ -147,9 +147,9 @@ return group; if (ret < 0) - node = node->rb_left; + node = rb_ptr(node->rb_left); else - node = node->rb_right; + node = rb_ptr(node->rb_right); } return NULL; } @@ -163,8 +163,8 @@ struct mcast_group *cur_group; int ret; - while (*link) { - parent = *link; + while (rb_ptr(*link)) { + parent = rb_ptr(*link); cur_group = rb_entry(parent, struct mcast_group, node); ret = memcmp(group->rec.mgid.raw, cur_group->rec.mgid.raw, Index: sys/ofed/drivers/infiniband/core/ib_uverbs_cmd.c =================================================================== --- sys/ofed/drivers/infiniband/core/ib_uverbs_cmd.c +++ sys/ofed/drivers/infiniband/core/ib_uverbs_cmd.c @@ -684,8 +684,8 @@ entry->xrcd = xrcd; entry->inode = inode; - while (*p) { - parent = *p; + while (rb_ptr(*p)) { + parent = rb_ptr(*p); scan = rb_entry(parent, struct xrcd_table_entry, node); if (inode < scan->inode) { @@ -714,9 +714,9 @@ entry = rb_entry(p, struct xrcd_table_entry, node); if (inode < entry->inode) - p = p->rb_left; + p = rb_ptr(p->rb_left); else if (inode > entry->inode) - p = p->rb_right; + p = rb_ptr(p->rb_right); else return entry; } Index: sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c =================================================================== --- sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c @@ -390,9 +390,9 @@ sizeof (union ib_gid)); if (ret < 0) - n = n->rb_left; + n = rb_ptr(n->rb_left); else if (ret > 0) - n = n->rb_right; + n = rb_ptr(n->rb_right); else return path; } @@ -408,8 +408,8 @@ struct ipoib_path *tpath; int ret; - while (*n) { - pn = *n; + while (rb_ptr(*n)) { + pn = rb_ptr(*n); tpath = rb_entry(pn, struct ipoib_path, rb_node); ret = memcmp(path->pathrec.dgid.raw, tpath->pathrec.dgid.raw, Index: sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_multicast.c =================================================================== --- sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_multicast.c +++ sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_multicast.c @@ -113,9 +113,9 @@ ret = memcmp(mgid, mcast->mcmember.mgid.raw, sizeof (union ib_gid)); if (ret < 0) - n = n->rb_left; + n = rb_ptr(n->rb_left); else if (ret > 0) - n = n->rb_right; + n = rb_ptr(n->rb_right); else return mcast; } @@ -128,11 +128,11 @@ { struct rb_node **n = &priv->multicast_tree.rb_node, *pn = NULL; - while (*n) { + while (rb_ptr(*n)) { struct ipoib_mcast *tmcast; int ret; - pn = *n; + pn = rb_ptr(*n); tmcast = rb_entry(pn, struct ipoib_mcast, rb_node); ret = memcmp(mcast->mcmember.mgid.raw, tmcast->mcmember.mgid.raw,