Lines Matching refs:mcast
74 struct ipoib_mcast *mcast, in __ipoib_mcast_schedule_join_thread() argument
85 if (mcast && delay) { in __ipoib_mcast_schedule_join_thread()
89 mcast->backoff *= 2; in __ipoib_mcast_schedule_join_thread()
90 if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS) in __ipoib_mcast_schedule_join_thread()
91 mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS; in __ipoib_mcast_schedule_join_thread()
92 mcast->delay_until = jiffies + (mcast->backoff * HZ); in __ipoib_mcast_schedule_join_thread()
112 static void ipoib_mcast_free(struct ipoib_mcast *mcast) in ipoib_mcast_free() argument
114 struct net_device *dev = mcast->dev; in ipoib_mcast_free()
118 mcast->mcmember.mgid.raw); in ipoib_mcast_free()
121 ipoib_del_neighs_by_gid(dev, mcast->mcmember.mgid.raw); in ipoib_mcast_free()
123 if (mcast->ah) in ipoib_mcast_free()
124 ipoib_put_ah(mcast->ah); in ipoib_mcast_free()
126 while (!skb_queue_empty(&mcast->pkt_queue)) { in ipoib_mcast_free()
128 dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue)); in ipoib_mcast_free()
135 kfree(mcast); in ipoib_mcast_free()
141 struct ipoib_mcast *mcast; in ipoib_mcast_alloc() local
143 mcast = kzalloc(sizeof(*mcast), can_sleep ? GFP_KERNEL : GFP_ATOMIC); in ipoib_mcast_alloc()
144 if (!mcast) in ipoib_mcast_alloc()
147 mcast->dev = dev; in ipoib_mcast_alloc()
148 mcast->created = jiffies; in ipoib_mcast_alloc()
149 mcast->delay_until = jiffies; in ipoib_mcast_alloc()
150 mcast->backoff = 1; in ipoib_mcast_alloc()
152 INIT_LIST_HEAD(&mcast->list); in ipoib_mcast_alloc()
153 INIT_LIST_HEAD(&mcast->neigh_list); in ipoib_mcast_alloc()
154 skb_queue_head_init(&mcast->pkt_queue); in ipoib_mcast_alloc()
156 return mcast; in ipoib_mcast_alloc()
165 struct ipoib_mcast *mcast; in __ipoib_mcast_find() local
168 mcast = rb_entry(n, struct ipoib_mcast, rb_node); in __ipoib_mcast_find()
170 ret = memcmp(mgid, mcast->mcmember.mgid.raw, in __ipoib_mcast_find()
177 return mcast; in __ipoib_mcast_find()
183 static int __ipoib_mcast_add(struct net_device *dev, struct ipoib_mcast *mcast) in __ipoib_mcast_add() argument
195 ret = memcmp(mcast->mcmember.mgid.raw, tmcast->mcmember.mgid.raw, in __ipoib_mcast_add()
205 rb_link_node(&mcast->rb_node, pn, n); in __ipoib_mcast_add()
206 rb_insert_color(&mcast->rb_node, &priv->multicast_tree); in __ipoib_mcast_add()
211 static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast, in ipoib_mcast_join_finish() argument
214 struct net_device *dev = mcast->dev; in ipoib_mcast_join_finish()
222 mcast->mcmember = *mcmember; in ipoib_mcast_join_finish()
227 if (!memcmp(mcast->mcmember.mgid.raw, priv->dev->broadcast + 4, in ipoib_mcast_join_finish()
257 if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { in ipoib_mcast_join_finish()
258 if (test_and_set_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { in ipoib_mcast_join_finish()
260 mcast->mcmember.mgid.raw); in ipoib_mcast_join_finish()
265 ret = rn->attach_mcast(dev, priv->ca, &mcast->mcmember.mgid, in ipoib_mcast_join_finish()
266 be16_to_cpu(mcast->mcmember.mlid), in ipoib_mcast_join_finish()
270 mcast->mcmember.mgid.raw); in ipoib_mcast_join_finish()
272 clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags); in ipoib_mcast_join_finish()
279 rdma_ah_set_dlid(&av, be16_to_cpu(mcast->mcmember.mlid)), in ipoib_mcast_join_finish()
281 rdma_ah_set_sl(&av, mcast->mcmember.sl); in ipoib_mcast_join_finish()
282 rdma_ah_set_static_rate(&av, mcast->mcmember.rate); in ipoib_mcast_join_finish()
284 rdma_ah_set_grh(&av, &mcast->mcmember.mgid, in ipoib_mcast_join_finish()
285 be32_to_cpu(mcast->mcmember.flow_label), in ipoib_mcast_join_finish()
286 0, mcast->mcmember.hop_limit, in ipoib_mcast_join_finish()
287 mcast->mcmember.traffic_class); in ipoib_mcast_join_finish()
297 mcast->ah = ah; in ipoib_mcast_join_finish()
301 mcast->mcmember.mgid.raw, in ipoib_mcast_join_finish()
302 mcast->ah->ah, in ipoib_mcast_join_finish()
303 be16_to_cpu(mcast->mcmember.mlid), in ipoib_mcast_join_finish()
304 mcast->mcmember.sl); in ipoib_mcast_join_finish()
308 while (!skb_queue_empty(&mcast->pkt_queue)) { in ipoib_mcast_join_finish()
309 struct sk_buff *skb = skb_dequeue(&mcast->pkt_queue); in ipoib_mcast_join_finish()
370 struct ipoib_mcast *mcast = multicast->context; in ipoib_mcast_join_complete() local
371 struct net_device *dev = mcast->dev; in ipoib_mcast_join_complete()
375 test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) ? in ipoib_mcast_join_complete()
377 mcast->mcmember.mgid.raw, status); in ipoib_mcast_join_complete()
386 status = ipoib_mcast_join_finish(mcast, &multicast->rec); in ipoib_mcast_join_complete()
389 mcast->backoff = 1; in ipoib_mcast_join_complete()
390 mcast->delay_until = jiffies; in ipoib_mcast_join_complete()
399 if (mcast == priv->broadcast) { in ipoib_mcast_join_complete()
407 test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) && in ipoib_mcast_join_complete()
410 if (mcast->logcount < 20) { in ipoib_mcast_join_complete()
414 test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) ? "sendonly " : "", in ipoib_mcast_join_complete()
415 mcast->mcmember.mgid.raw, status); in ipoib_mcast_join_complete()
418 test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) ? "sendonly " : "", in ipoib_mcast_join_complete()
419 mcast->mcmember.mgid.raw, status); in ipoib_mcast_join_complete()
423 mcast->logcount++; in ipoib_mcast_join_complete()
426 if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) && in ipoib_mcast_join_complete()
427 mcast->backoff >= 2) { in ipoib_mcast_join_complete()
437 mcast->backoff = 1; in ipoib_mcast_join_complete()
439 while (!skb_queue_empty(&mcast->pkt_queue)) { in ipoib_mcast_join_complete()
441 dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue)); in ipoib_mcast_join_complete()
447 __ipoib_mcast_schedule_join_thread(priv, mcast, 1); in ipoib_mcast_join_complete()
459 mcast->mc = NULL; in ipoib_mcast_join_complete()
461 mcast->mc = multicast; in ipoib_mcast_join_complete()
462 clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); in ipoib_mcast_join_complete()
464 complete(&mcast->done); in ipoib_mcast_join_complete()
472 static int ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast) in ipoib_mcast_join() argument
486 init_completion(&mcast->done); in ipoib_mcast_join()
487 set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); in ipoib_mcast_join()
489 ipoib_dbg_mcast(priv, "joining MGID %pI6\n", mcast->mcmember.mgid.raw); in ipoib_mcast_join()
491 rec.mgid = mcast->mcmember.mgid; in ipoib_mcast_join()
501 if (mcast != priv->broadcast) { in ipoib_mcast_join()
541 if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) && in ipoib_mcast_join()
550 ipoib_mcast_join_complete, mcast); in ipoib_mcast_join()
556 __ipoib_mcast_schedule_join_thread(priv, mcast, 1); in ipoib_mcast_join()
557 clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); in ipoib_mcast_join()
559 complete(&mcast->done); in ipoib_mcast_join()
572 struct ipoib_mcast *mcast = NULL; in ipoib_mcast_join_task() local
625 mcast = priv->broadcast; in ipoib_mcast_join_task()
626 if (mcast->backoff > 1 && in ipoib_mcast_join_task()
627 time_before(jiffies, mcast->delay_until)) { in ipoib_mcast_join_task()
628 delay_until = mcast->delay_until; in ipoib_mcast_join_task()
629 mcast = NULL; in ipoib_mcast_join_task()
639 list_for_each_entry(mcast, &priv->multicast_list, list) { in ipoib_mcast_join_task()
640 if (IS_ERR_OR_NULL(mcast->mc) && in ipoib_mcast_join_task()
641 !test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags) && in ipoib_mcast_join_task()
642 (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) || in ipoib_mcast_join_task()
643 !skb_queue_empty(&mcast->pkt_queue))) { in ipoib_mcast_join_task()
644 if (mcast->backoff == 1 || in ipoib_mcast_join_task()
645 time_after_eq(jiffies, mcast->delay_until)) { in ipoib_mcast_join_task()
647 if (ipoib_mcast_join(dev, mcast)) { in ipoib_mcast_join_task()
652 time_before(mcast->delay_until, delay_until)) in ipoib_mcast_join_task()
653 delay_until = mcast->delay_until; in ipoib_mcast_join_task()
657 mcast = NULL; in ipoib_mcast_join_task()
666 if (mcast) in ipoib_mcast_join_task()
667 ipoib_mcast_join(dev, mcast); in ipoib_mcast_join_task()
695 static int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast) in ipoib_mcast_leave() argument
701 if (test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) in ipoib_mcast_leave()
704 if (!IS_ERR_OR_NULL(mcast->mc)) in ipoib_mcast_leave()
705 ib_sa_free_multicast(mcast->mc); in ipoib_mcast_leave()
707 if (test_and_clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { in ipoib_mcast_leave()
709 mcast->mcmember.mgid.raw); in ipoib_mcast_leave()
712 ret = rn->detach_mcast(dev, priv->ca, &mcast->mcmember.mgid, in ipoib_mcast_leave()
713 be16_to_cpu(mcast->mcmember.mlid)); in ipoib_mcast_leave()
716 } else if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) in ipoib_mcast_leave()
732 struct ipoib_mcast *mcast = __ipoib_mcast_find(priv->dev, mgid); in ipoib_check_and_add_mcast_sendonly() local
734 if (mcast && test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { in ipoib_check_and_add_mcast_sendonly()
735 list_del(&mcast->list); in ipoib_check_and_add_mcast_sendonly()
736 rb_erase(&mcast->rb_node, &priv->multicast_tree); in ipoib_check_and_add_mcast_sendonly()
737 list_add_tail(&mcast->list, remove_list); in ipoib_check_and_add_mcast_sendonly()
744 struct ipoib_mcast *mcast, *tmcast; in ipoib_mcast_remove_list() local
750 list_for_each_entry_safe(mcast, tmcast, remove_list, list) in ipoib_mcast_remove_list()
751 if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) in ipoib_mcast_remove_list()
752 wait_for_completion(&mcast->done); in ipoib_mcast_remove_list()
754 list_for_each_entry_safe(mcast, tmcast, remove_list, list) { in ipoib_mcast_remove_list()
755 ipoib_mcast_leave(mcast->dev, mcast); in ipoib_mcast_remove_list()
756 ipoib_mcast_free(mcast); in ipoib_mcast_remove_list()
764 struct ipoib_mcast *mcast; in ipoib_mcast_send() local
778 mcast = __ipoib_mcast_find(dev, mgid); in ipoib_mcast_send()
779 if (!mcast || !mcast->ah) { in ipoib_mcast_send()
780 if (!mcast) { in ipoib_mcast_send()
785 mcast = ipoib_mcast_alloc(dev, 0); in ipoib_mcast_send()
786 if (!mcast) { in ipoib_mcast_send()
794 set_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags); in ipoib_mcast_send()
795 memcpy(mcast->mcmember.mgid.raw, mgid, in ipoib_mcast_send()
797 __ipoib_mcast_add(dev, mcast); in ipoib_mcast_send()
798 list_add_tail(&mcast->list, &priv->multicast_list); in ipoib_mcast_send()
800 if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE) { in ipoib_mcast_send()
803 skb_queue_tail(&mcast->pkt_queue, skb); in ipoib_mcast_send()
808 if (!test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) { in ipoib_mcast_send()
823 kref_get(&mcast->ah->ref); in ipoib_mcast_send()
824 neigh->ah = mcast->ah; in ipoib_mcast_send()
826 list_add_tail(&neigh->list, &mcast->neigh_list); in ipoib_mcast_send()
830 mcast->ah->last_send = rn->send(dev, skb, mcast->ah->ah, in ipoib_mcast_send()
845 struct ipoib_mcast *mcast, *tmcast; in ipoib_mcast_dev_flush() local
853 list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) { in ipoib_mcast_dev_flush()
854 list_del(&mcast->list); in ipoib_mcast_dev_flush()
855 rb_erase(&mcast->rb_node, &priv->multicast_tree); in ipoib_mcast_dev_flush()
856 list_add_tail(&mcast->list, &remove_list); in ipoib_mcast_dev_flush()
888 struct ipoib_mcast *mcast, *tmcast; in ipoib_mcast_restart_task() local
911 list_for_each_entry(mcast, &priv->multicast_list, list) in ipoib_mcast_restart_task()
912 clear_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags); in ipoib_mcast_restart_task()
923 mcast = __ipoib_mcast_find(dev, &mgid); in ipoib_mcast_restart_task()
924 if (!mcast || test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { in ipoib_mcast_restart_task()
949 if (mcast) { in ipoib_mcast_restart_task()
951 list_move_tail(&mcast->list, &remove_list); in ipoib_mcast_restart_task()
953 rb_replace_node(&mcast->rb_node, in ipoib_mcast_restart_task()
962 if (mcast) in ipoib_mcast_restart_task()
963 set_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags); in ipoib_mcast_restart_task()
967 list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) { in ipoib_mcast_restart_task()
968 if (!test_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags) && in ipoib_mcast_restart_task()
969 !test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { in ipoib_mcast_restart_task()
971 mcast->mcmember.mgid.raw); in ipoib_mcast_restart_task()
973 rb_erase(&mcast->rb_node, &priv->multicast_tree); in ipoib_mcast_restart_task()
976 list_move_tail(&mcast->list, &remove_list); in ipoib_mcast_restart_task()
1020 struct ipoib_mcast *mcast; in ipoib_mcast_iter_next() local
1028 mcast = rb_entry(n, struct ipoib_mcast, rb_node); in ipoib_mcast_iter_next()
1030 if (memcmp(iter->mgid.raw, mcast->mcmember.mgid.raw, in ipoib_mcast_iter_next()
1032 iter->mgid = mcast->mcmember.mgid; in ipoib_mcast_iter_next()
1033 iter->created = mcast->created; in ipoib_mcast_iter_next()
1034 iter->queuelen = skb_queue_len(&mcast->pkt_queue); in ipoib_mcast_iter_next()
1035 iter->complete = !!mcast->ah; in ipoib_mcast_iter_next()
1036 iter->send_only = !!(mcast->flags & (1 << IPOIB_MCAST_FLAG_SENDONLY)); in ipoib_mcast_iter_next()