|
@@ -1004,17 +1004,12 @@ static void cma_leave_mc_groups(struct rdma_id_private *id_priv)
|
|
mc = container_of(id_priv->mc_list.next,
|
|
mc = container_of(id_priv->mc_list.next,
|
|
struct cma_multicast, list);
|
|
struct cma_multicast, list);
|
|
list_del(&mc->list);
|
|
list_del(&mc->list);
|
|
- switch (rdma_port_get_link_layer(id_priv->cma_dev->device, id_priv->id.port_num)) {
|
|
|
|
- case IB_LINK_LAYER_INFINIBAND:
|
|
|
|
|
|
+ if (rdma_protocol_ib(id_priv->cma_dev->device,
|
|
|
|
+ id_priv->id.port_num)) {
|
|
ib_sa_free_multicast(mc->multicast.ib);
|
|
ib_sa_free_multicast(mc->multicast.ib);
|
|
kfree(mc);
|
|
kfree(mc);
|
|
- break;
|
|
|
|
- case IB_LINK_LAYER_ETHERNET:
|
|
|
|
|
|
+ } else
|
|
kref_put(&mc->mcref, release_mc);
|
|
kref_put(&mc->mcref, release_mc);
|
|
- break;
|
|
|
|
- default:
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3321,24 +3316,13 @@ int rdma_join_multicast(struct rdma_cm_id *id, struct sockaddr *addr,
|
|
list_add(&mc->list, &id_priv->mc_list);
|
|
list_add(&mc->list, &id_priv->mc_list);
|
|
spin_unlock(&id_priv->lock);
|
|
spin_unlock(&id_priv->lock);
|
|
|
|
|
|
- switch (rdma_node_get_transport(id->device->node_type)) {
|
|
|
|
- case RDMA_TRANSPORT_IB:
|
|
|
|
- switch (rdma_port_get_link_layer(id->device, id->port_num)) {
|
|
|
|
- case IB_LINK_LAYER_INFINIBAND:
|
|
|
|
- ret = cma_join_ib_multicast(id_priv, mc);
|
|
|
|
- break;
|
|
|
|
- case IB_LINK_LAYER_ETHERNET:
|
|
|
|
- kref_init(&mc->mcref);
|
|
|
|
- ret = cma_iboe_join_multicast(id_priv, mc);
|
|
|
|
- break;
|
|
|
|
- default:
|
|
|
|
- ret = -EINVAL;
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- default:
|
|
|
|
|
|
+ if (rdma_protocol_iboe(id->device, id->port_num)) {
|
|
|
|
+ kref_init(&mc->mcref);
|
|
|
|
+ ret = cma_iboe_join_multicast(id_priv, mc);
|
|
|
|
+ } else if (rdma_protocol_ib(id->device, id->port_num))
|
|
|
|
+ ret = cma_join_ib_multicast(id_priv, mc);
|
|
|
|
+ else
|
|
ret = -ENOSYS;
|
|
ret = -ENOSYS;
|
|
- break;
|
|
|
|
- }
|
|
|
|
|
|
|
|
if (ret) {
|
|
if (ret) {
|
|
spin_lock_irq(&id_priv->lock);
|
|
spin_lock_irq(&id_priv->lock);
|
|
@@ -3366,19 +3350,15 @@ void rdma_leave_multicast(struct rdma_cm_id *id, struct sockaddr *addr)
|
|
ib_detach_mcast(id->qp,
|
|
ib_detach_mcast(id->qp,
|
|
&mc->multicast.ib->rec.mgid,
|
|
&mc->multicast.ib->rec.mgid,
|
|
be16_to_cpu(mc->multicast.ib->rec.mlid));
|
|
be16_to_cpu(mc->multicast.ib->rec.mlid));
|
|
- if (rdma_node_get_transport(id_priv->cma_dev->device->node_type) == RDMA_TRANSPORT_IB) {
|
|
|
|
- switch (rdma_port_get_link_layer(id->device, id->port_num)) {
|
|
|
|
- case IB_LINK_LAYER_INFINIBAND:
|
|
|
|
- ib_sa_free_multicast(mc->multicast.ib);
|
|
|
|
- kfree(mc);
|
|
|
|
- break;
|
|
|
|
- case IB_LINK_LAYER_ETHERNET:
|
|
|
|
- kref_put(&mc->mcref, release_mc);
|
|
|
|
- break;
|
|
|
|
- default:
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+
|
|
|
|
+ BUG_ON(id_priv->cma_dev->device != id->device);
|
|
|
|
+
|
|
|
|
+ if (rdma_protocol_ib(id->device, id->port_num)) {
|
|
|
|
+ ib_sa_free_multicast(mc->multicast.ib);
|
|
|
|
+ kfree(mc);
|
|
|
|
+ } else if (rdma_protocol_iboe(id->device, id->port_num))
|
|
|
|
+ kref_put(&mc->mcref, release_mc);
|
|
|
|
+
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|