Lines Matching refs:mcg

81 static void __rxe_insert_mcg(struct rxe_mcg *mcg)  in __rxe_insert_mcg()  argument
83 struct rb_root *tree = &mcg->rxe->mcg_tree; in __rxe_insert_mcg()
93 cmp = memcmp(&tmp->mgid, &mcg->mgid, sizeof(mcg->mgid)); in __rxe_insert_mcg()
100 rb_link_node(&mcg->node, node, link); in __rxe_insert_mcg()
101 rb_insert_color(&mcg->node, tree); in __rxe_insert_mcg()
110 static void __rxe_remove_mcg(struct rxe_mcg *mcg) in __rxe_remove_mcg() argument
112 rb_erase(&mcg->node, &mcg->rxe->mcg_tree); in __rxe_remove_mcg()
127 struct rxe_mcg *mcg; in __rxe_lookup_mcg() local
134 mcg = rb_entry(node, struct rxe_mcg, node); in __rxe_lookup_mcg()
136 cmp = memcmp(&mcg->mgid, mgid, sizeof(*mgid)); in __rxe_lookup_mcg()
147 kref_get(&mcg->ref_cnt); in __rxe_lookup_mcg()
148 return mcg; in __rxe_lookup_mcg()
163 struct rxe_mcg *mcg; in rxe_lookup_mcg() local
166 mcg = __rxe_lookup_mcg(rxe, mgid); in rxe_lookup_mcg()
169 return mcg; in rxe_lookup_mcg()
181 struct rxe_mcg *mcg) in __rxe_init_mcg() argument
183 kref_init(&mcg->ref_cnt); in __rxe_init_mcg()
184 memcpy(&mcg->mgid, mgid, sizeof(mcg->mgid)); in __rxe_init_mcg()
185 INIT_LIST_HEAD(&mcg->qp_list); in __rxe_init_mcg()
186 mcg->rxe = rxe; in __rxe_init_mcg()
195 kref_get(&mcg->ref_cnt); in __rxe_init_mcg()
196 __rxe_insert_mcg(mcg); in __rxe_init_mcg()
208 struct rxe_mcg *mcg, *tmp; in rxe_get_mcg() local
215 mcg = rxe_lookup_mcg(rxe, mgid); in rxe_get_mcg()
216 if (mcg) in rxe_get_mcg()
217 return mcg; in rxe_get_mcg()
226 mcg = kzalloc(sizeof(*mcg), GFP_KERNEL); in rxe_get_mcg()
227 if (!mcg) { in rxe_get_mcg()
238 kfree(mcg); in rxe_get_mcg()
242 __rxe_init_mcg(rxe, mgid, mcg); in rxe_get_mcg()
248 return mcg; in rxe_get_mcg()
250 kfree(mcg); in rxe_get_mcg()
262 struct rxe_mcg *mcg = container_of(kref, typeof(*mcg), ref_cnt); in rxe_cleanup_mcg() local
264 kfree(mcg); in rxe_cleanup_mcg()
274 static void __rxe_destroy_mcg(struct rxe_mcg *mcg) in __rxe_destroy_mcg() argument
276 struct rxe_dev *rxe = mcg->rxe; in __rxe_destroy_mcg()
279 __rxe_remove_mcg(mcg); in __rxe_destroy_mcg()
280 kref_put(&mcg->ref_cnt, rxe_cleanup_mcg); in __rxe_destroy_mcg()
291 static void rxe_destroy_mcg(struct rxe_mcg *mcg) in rxe_destroy_mcg() argument
294 rxe_mcast_del(mcg->rxe, &mcg->mgid); in rxe_destroy_mcg()
296 spin_lock_bh(&mcg->rxe->mcg_lock); in rxe_destroy_mcg()
297 __rxe_destroy_mcg(mcg); in rxe_destroy_mcg()
298 spin_unlock_bh(&mcg->rxe->mcg_lock); in rxe_destroy_mcg()
312 static int __rxe_init_mca(struct rxe_qp *qp, struct rxe_mcg *mcg, in __rxe_init_mca() argument
324 n = atomic_inc_return(&mcg->qp_num); in __rxe_init_mca()
326 atomic_dec(&mcg->qp_num); in __rxe_init_mca()
336 list_add_tail(&mca->qp_list, &mcg->qp_list); in __rxe_init_mca()
349 static int rxe_attach_mcg(struct rxe_mcg *mcg, struct rxe_qp *qp) in rxe_attach_mcg() argument
351 struct rxe_dev *rxe = mcg->rxe; in rxe_attach_mcg()
357 list_for_each_entry(mca, &mcg->qp_list, qp_list) { in rxe_attach_mcg()
372 list_for_each_entry(tmp, &mcg->qp_list, qp_list) { in rxe_attach_mcg()
380 err = __rxe_init_mca(qp, mcg, mca); in rxe_attach_mcg()
395 static void __rxe_cleanup_mca(struct rxe_mca *mca, struct rxe_mcg *mcg) in __rxe_cleanup_mca() argument
399 atomic_dec(&mcg->qp_num); in __rxe_cleanup_mca()
400 atomic_dec(&mcg->rxe->mcg_attach); in __rxe_cleanup_mca()
414 static int rxe_detach_mcg(struct rxe_mcg *mcg, struct rxe_qp *qp) in rxe_detach_mcg() argument
416 struct rxe_dev *rxe = mcg->rxe; in rxe_detach_mcg()
420 list_for_each_entry_safe(mca, tmp, &mcg->qp_list, qp_list) { in rxe_detach_mcg()
422 __rxe_cleanup_mca(mca, mcg); in rxe_detach_mcg()
430 if (atomic_read(&mcg->qp_num) <= 0) in rxe_detach_mcg()
431 __rxe_destroy_mcg(mcg); in rxe_detach_mcg()
456 struct rxe_mcg *mcg; in rxe_attach_mcast() local
459 mcg = rxe_get_mcg(rxe, mgid); in rxe_attach_mcast()
460 if (IS_ERR(mcg)) in rxe_attach_mcast()
461 return PTR_ERR(mcg); in rxe_attach_mcast()
463 err = rxe_attach_mcg(mcg, qp); in rxe_attach_mcast()
466 if (atomic_read(&mcg->qp_num) == 0) in rxe_attach_mcast()
467 rxe_destroy_mcg(mcg); in rxe_attach_mcast()
469 kref_put(&mcg->ref_cnt, rxe_cleanup_mcg); in rxe_attach_mcast()
486 struct rxe_mcg *mcg; in rxe_detach_mcast() local
489 mcg = rxe_lookup_mcg(rxe, mgid); in rxe_detach_mcast()
490 if (!mcg) in rxe_detach_mcast()
493 err = rxe_detach_mcg(mcg, qp); in rxe_detach_mcast()
494 kref_put(&mcg->ref_cnt, rxe_cleanup_mcg); in rxe_detach_mcast()