Lines Matching refs:mcast
76 struct qib_mcast *mcast; in qib_mcast_alloc() local
78 mcast = kmalloc(sizeof(*mcast), GFP_KERNEL); in qib_mcast_alloc()
79 if (!mcast) in qib_mcast_alloc()
82 mcast->mgid = *mgid; in qib_mcast_alloc()
83 INIT_LIST_HEAD(&mcast->qp_list); in qib_mcast_alloc()
84 init_waitqueue_head(&mcast->wait); in qib_mcast_alloc()
85 atomic_set(&mcast->refcount, 0); in qib_mcast_alloc()
86 mcast->n_attached = 0; in qib_mcast_alloc()
89 return mcast; in qib_mcast_alloc()
92 static void qib_mcast_free(struct qib_mcast *mcast) in qib_mcast_free() argument
96 list_for_each_entry_safe(p, tmp, &mcast->qp_list, list) in qib_mcast_free()
99 kfree(mcast); in qib_mcast_free()
115 struct qib_mcast *mcast; in qib_mcast_find() local
122 mcast = rb_entry(n, struct qib_mcast, rb_node); in qib_mcast_find()
124 ret = memcmp(mgid->raw, mcast->mgid.raw, in qib_mcast_find()
131 atomic_inc(&mcast->refcount); in qib_mcast_find()
138 mcast = NULL; in qib_mcast_find()
141 return mcast; in qib_mcast_find()
154 struct qib_mcast *mcast, struct qib_mcast_qp *mqp) in qib_mcast_add() argument
169 ret = memcmp(mcast->mgid.raw, tmcast->mgid.raw, in qib_mcast_add()
209 mcast->n_attached++; in qib_mcast_add()
211 list_add_tail_rcu(&mqp->list, &mcast->qp_list); in qib_mcast_add()
213 atomic_inc(&mcast->refcount); in qib_mcast_add()
214 rb_link_node(&mcast->rb_node, pn, n); in qib_mcast_add()
215 rb_insert_color(&mcast->rb_node, &ibp->mcast_tree); in qib_mcast_add()
230 struct qib_mcast *mcast; in qib_multicast_attach() local
243 mcast = qib_mcast_alloc(gid); in qib_multicast_attach()
244 if (mcast == NULL) { in qib_multicast_attach()
250 qib_mcast_free(mcast); in qib_multicast_attach()
255 switch (qib_mcast_add(dev, ibp, mcast, mqp)) { in qib_multicast_attach()
259 qib_mcast_free(mcast); in qib_multicast_attach()
263 qib_mcast_free(mcast); in qib_multicast_attach()
269 qib_mcast_free(mcast); in qib_multicast_attach()
288 struct qib_mcast *mcast = NULL; in qib_multicast_detach() local
307 mcast = rb_entry(n, struct qib_mcast, rb_node); in qib_multicast_detach()
308 ret = memcmp(gid->raw, mcast->mgid.raw, in qib_multicast_detach()
319 list_for_each_entry_safe(p, tmp, &mcast->qp_list, list) { in qib_multicast_detach()
327 mcast->n_attached--; in qib_multicast_detach()
331 if (list_empty(&mcast->qp_list)) { in qib_multicast_detach()
332 rb_erase(&mcast->rb_node, &ibp->mcast_tree); in qib_multicast_detach()
346 wait_event(mcast->wait, atomic_read(&mcast->refcount) <= 1); in qib_multicast_detach()
350 atomic_dec(&mcast->refcount); in qib_multicast_detach()
351 wait_event(mcast->wait, !atomic_read(&mcast->refcount)); in qib_multicast_detach()
352 qib_mcast_free(mcast); in qib_multicast_detach()