Lines Matching refs:mcg

63 static void __rxe_insert_mcg(struct rxe_mcg *mcg)  in __rxe_insert_mcg()  argument
65 struct rb_root *tree = &mcg->rxe->mcg_tree; in __rxe_insert_mcg()
75 cmp = memcmp(&tmp->mgid, &mcg->mgid, sizeof(mcg->mgid)); in __rxe_insert_mcg()
82 rb_link_node(&mcg->node, node, link); in __rxe_insert_mcg()
83 rb_insert_color(&mcg->node, tree); in __rxe_insert_mcg()
92 static void __rxe_remove_mcg(struct rxe_mcg *mcg) in __rxe_remove_mcg() argument
94 rb_erase(&mcg->node, &mcg->rxe->mcg_tree); in __rxe_remove_mcg()
109 struct rxe_mcg *mcg; in __rxe_lookup_mcg() local
116 mcg = rb_entry(node, struct rxe_mcg, node); in __rxe_lookup_mcg()
118 cmp = memcmp(&mcg->mgid, mgid, sizeof(*mgid)); in __rxe_lookup_mcg()
129 kref_get(&mcg->ref_cnt); in __rxe_lookup_mcg()
130 return mcg; in __rxe_lookup_mcg()
145 struct rxe_mcg *mcg; in rxe_lookup_mcg() local
148 mcg = __rxe_lookup_mcg(rxe, mgid); in rxe_lookup_mcg()
151 return mcg; in rxe_lookup_mcg()
163 struct rxe_mcg *mcg) in __rxe_init_mcg() argument
165 kref_init(&mcg->ref_cnt); in __rxe_init_mcg()
166 memcpy(&mcg->mgid, mgid, sizeof(mcg->mgid)); in __rxe_init_mcg()
167 INIT_LIST_HEAD(&mcg->qp_list); in __rxe_init_mcg()
168 mcg->rxe = rxe; in __rxe_init_mcg()
177 kref_get(&mcg->ref_cnt); in __rxe_init_mcg()
178 __rxe_insert_mcg(mcg); in __rxe_init_mcg()
190 struct rxe_mcg *mcg, *tmp; in rxe_get_mcg() local
197 mcg = rxe_lookup_mcg(rxe, mgid); in rxe_get_mcg()
198 if (mcg) in rxe_get_mcg()
199 return mcg; in rxe_get_mcg()
208 mcg = kzalloc(sizeof(*mcg), GFP_KERNEL); in rxe_get_mcg()
209 if (!mcg) { in rxe_get_mcg()
220 kfree(mcg); in rxe_get_mcg()
224 __rxe_init_mcg(rxe, mgid, mcg); in rxe_get_mcg()
230 return mcg; in rxe_get_mcg()
232 kfree(mcg); in rxe_get_mcg()
244 struct rxe_mcg *mcg = container_of(kref, typeof(*mcg), ref_cnt); in rxe_cleanup_mcg() local
246 kfree(mcg); in rxe_cleanup_mcg()
256 static void __rxe_destroy_mcg(struct rxe_mcg *mcg) in __rxe_destroy_mcg() argument
258 struct rxe_dev *rxe = mcg->rxe; in __rxe_destroy_mcg()
261 __rxe_remove_mcg(mcg); in __rxe_destroy_mcg()
262 kref_put(&mcg->ref_cnt, rxe_cleanup_mcg); in __rxe_destroy_mcg()
273 static void rxe_destroy_mcg(struct rxe_mcg *mcg) in rxe_destroy_mcg() argument
276 rxe_mcast_del(mcg->rxe, &mcg->mgid); in rxe_destroy_mcg()
278 spin_lock_bh(&mcg->rxe->mcg_lock); in rxe_destroy_mcg()
279 __rxe_destroy_mcg(mcg); in rxe_destroy_mcg()
280 spin_unlock_bh(&mcg->rxe->mcg_lock); in rxe_destroy_mcg()
294 static int __rxe_init_mca(struct rxe_qp *qp, struct rxe_mcg *mcg, in __rxe_init_mca() argument
306 n = atomic_inc_return(&mcg->qp_num); in __rxe_init_mca()
308 atomic_dec(&mcg->qp_num); in __rxe_init_mca()
318 list_add_tail(&mca->qp_list, &mcg->qp_list); in __rxe_init_mca()
331 static int rxe_attach_mcg(struct rxe_mcg *mcg, struct rxe_qp *qp) in rxe_attach_mcg() argument
333 struct rxe_dev *rxe = mcg->rxe; in rxe_attach_mcg()
339 list_for_each_entry(mca, &mcg->qp_list, qp_list) { in rxe_attach_mcg()
354 list_for_each_entry(tmp, &mcg->qp_list, qp_list) { in rxe_attach_mcg()
362 err = __rxe_init_mca(qp, mcg, mca); in rxe_attach_mcg()
377 static void __rxe_cleanup_mca(struct rxe_mca *mca, struct rxe_mcg *mcg) in __rxe_cleanup_mca() argument
381 atomic_dec(&mcg->qp_num); in __rxe_cleanup_mca()
382 atomic_dec(&mcg->rxe->mcg_attach); in __rxe_cleanup_mca()
396 static int rxe_detach_mcg(struct rxe_mcg *mcg, struct rxe_qp *qp) in rxe_detach_mcg() argument
398 struct rxe_dev *rxe = mcg->rxe; in rxe_detach_mcg()
402 list_for_each_entry_safe(mca, tmp, &mcg->qp_list, qp_list) { in rxe_detach_mcg()
404 __rxe_cleanup_mca(mca, mcg); in rxe_detach_mcg()
412 if (atomic_read(&mcg->qp_num) <= 0) in rxe_detach_mcg()
413 __rxe_destroy_mcg(mcg); in rxe_detach_mcg()
438 struct rxe_mcg *mcg; in rxe_attach_mcast() local
441 mcg = rxe_get_mcg(rxe, mgid); in rxe_attach_mcast()
442 if (IS_ERR(mcg)) in rxe_attach_mcast()
443 return PTR_ERR(mcg); in rxe_attach_mcast()
445 err = rxe_attach_mcg(mcg, qp); in rxe_attach_mcast()
448 if (atomic_read(&mcg->qp_num) == 0) in rxe_attach_mcast()
449 rxe_destroy_mcg(mcg); in rxe_attach_mcast()
451 kref_put(&mcg->ref_cnt, rxe_cleanup_mcg); in rxe_attach_mcast()
468 struct rxe_mcg *mcg; in rxe_detach_mcast() local
471 mcg = rxe_lookup_mcg(rxe, mgid); in rxe_detach_mcast()
472 if (!mcg) in rxe_detach_mcast()
475 err = rxe_detach_mcg(mcg, qp); in rxe_detach_mcast()
476 kref_put(&mcg->ref_cnt, rxe_cleanup_mcg); in rxe_detach_mcast()