Lines Matching +full:- +full:m

101 static void tipc_group_proto_xmit(struct tipc_group *grp, struct tipc_member *m,
104 static void tipc_group_open(struct tipc_member *m, bool *wakeup) in tipc_group_open() argument
107 if (list_empty(&m->small_win)) in tipc_group_open()
109 list_del_init(&m->small_win); in tipc_group_open()
110 *m->group->open = true; in tipc_group_open()
115 struct tipc_member *m) in tipc_group_decr_active() argument
117 if (m->state == MBR_ACTIVE || m->state == MBR_RECLAIMING || in tipc_group_decr_active()
118 m->state == MBR_REMITTED) in tipc_group_decr_active()
119 grp->active_cnt--; in tipc_group_decr_active()
125 int mcnt = grp->member_cnt + 1; in tipc_group_rcvbuf_limit()
130 grp->max_active = max_active; in tipc_group_rcvbuf_limit()
134 idle_pool = (mcnt - max_active) * ADV_IDLE; in tipc_group_rcvbuf_limit()
136 /* Scale to bytes, considering worst-case truesize/msgsize ratio */ in tipc_group_rcvbuf_limit()
142 return grp->bc_snd_nxt; in tipc_group_bc_snd_nxt()
145 static bool tipc_group_is_receiver(struct tipc_member *m) in tipc_group_is_receiver() argument
147 return m && m->state != MBR_JOINING && m->state != MBR_LEAVING; in tipc_group_is_receiver()
150 static bool tipc_group_is_sender(struct tipc_member *m) in tipc_group_is_sender() argument
152 return m && m->state != MBR_JOINING && m->state != MBR_PUBLISHED; in tipc_group_is_sender()
157 if (!grp->loopback) in tipc_group_exclude()
158 return grp->portid; in tipc_group_exclude()
167 bool global = mreq->scope != TIPC_NODE_SCOPE; in tipc_group_create()
169 u32 type = mreq->type; in tipc_group_create()
174 tipc_nlist_init(&grp->dests, tipc_own_addr(net)); in tipc_group_create()
175 INIT_LIST_HEAD(&grp->small_win); in tipc_group_create()
176 INIT_LIST_HEAD(&grp->active); in tipc_group_create()
177 INIT_LIST_HEAD(&grp->pending); in tipc_group_create()
178 grp->members = RB_ROOT; in tipc_group_create()
179 grp->net = net; in tipc_group_create()
180 grp->portid = portid; in tipc_group_create()
181 grp->type = type; in tipc_group_create()
182 grp->instance = mreq->instance; in tipc_group_create()
183 grp->scope = mreq->scope; in tipc_group_create()
184 grp->loopback = mreq->flags & TIPC_GROUP_LOOPBACK; in tipc_group_create()
185 grp->events = mreq->flags & TIPC_GROUP_MEMBER_EVTS; in tipc_group_create()
186 grp->open = group_is_open; in tipc_group_create()
187 *grp->open = false; in tipc_group_create()
190 filter, &grp->subid)) in tipc_group_create()
198 struct rb_root *tree = &grp->members; in tipc_group_join()
199 struct tipc_member *m, *tmp; in tipc_group_join() local
203 rbtree_postorder_for_each_entry_safe(m, tmp, tree, tree_node) { in tipc_group_join()
204 tipc_group_proto_xmit(grp, m, GRP_JOIN_MSG, &xmitq); in tipc_group_join()
205 tipc_group_update_member(m, 0); in tipc_group_join()
213 struct rb_root *tree = &grp->members; in tipc_group_delete()
214 struct tipc_member *m, *tmp; in tipc_group_delete() local
219 rbtree_postorder_for_each_entry_safe(m, tmp, tree, tree_node) { in tipc_group_delete()
220 tipc_group_proto_xmit(grp, m, GRP_LEAVE_MSG, &xmitq); in tipc_group_delete()
221 __skb_queue_purge(&m->deferredq); in tipc_group_delete()
222 list_del(&m->list); in tipc_group_delete()
223 kfree(m); in tipc_group_delete()
226 tipc_nlist_purge(&grp->dests); in tipc_group_delete()
227 tipc_topsrv_kern_unsubscr(net, grp->subid); in tipc_group_delete()
234 struct rb_node *n = grp->members.rb_node; in tipc_group_find_member()
236 struct tipc_member *m; in tipc_group_find_member() local
239 m = container_of(n, struct tipc_member, tree_node); in tipc_group_find_member()
240 nkey = (u64)m->node << 32 | m->port; in tipc_group_find_member()
242 n = n->rb_left; in tipc_group_find_member()
244 n = n->rb_right; in tipc_group_find_member()
246 return m; in tipc_group_find_member()
254 struct tipc_member *m; in tipc_group_find_dest() local
256 m = tipc_group_find_member(grp, node, port); in tipc_group_find_dest()
257 if (m && tipc_group_is_receiver(m)) in tipc_group_find_dest()
258 return m; in tipc_group_find_dest()
265 struct tipc_member *m; in tipc_group_find_node() local
268 for (n = rb_first(&grp->members); n; n = rb_next(n)) { in tipc_group_find_node()
269 m = container_of(n, struct tipc_member, tree_node); in tipc_group_find_node()
270 if (m->node == node) in tipc_group_find_node()
271 return m; in tipc_group_find_node()
277 struct tipc_member *m) in tipc_group_add_to_tree() argument
279 u64 nkey, key = (u64)m->node << 32 | m->port; in tipc_group_add_to_tree()
283 n = &grp->members.rb_node; in tipc_group_add_to_tree()
288 nkey = (u64)tmp->node << 32 | tmp->port; in tipc_group_add_to_tree()
290 n = &(*n)->rb_left; in tipc_group_add_to_tree()
292 n = &(*n)->rb_right; in tipc_group_add_to_tree()
294 return -EEXIST; in tipc_group_add_to_tree()
296 rb_link_node(&m->tree_node, parent, n); in tipc_group_add_to_tree()
297 rb_insert_color(&m->tree_node, &grp->members); in tipc_group_add_to_tree()
305 struct tipc_member *m; in tipc_group_create_member() local
308 m = kzalloc(sizeof(*m), GFP_ATOMIC); in tipc_group_create_member()
309 if (!m) in tipc_group_create_member()
311 INIT_LIST_HEAD(&m->list); in tipc_group_create_member()
312 INIT_LIST_HEAD(&m->small_win); in tipc_group_create_member()
313 __skb_queue_head_init(&m->deferredq); in tipc_group_create_member()
314 m->group = grp; in tipc_group_create_member()
315 m->node = node; in tipc_group_create_member()
316 m->port = port; in tipc_group_create_member()
317 m->instance = instance; in tipc_group_create_member()
318 m->bc_acked = grp->bc_snd_nxt - 1; in tipc_group_create_member()
319 ret = tipc_group_add_to_tree(grp, m); in tipc_group_create_member()
321 kfree(m); in tipc_group_create_member()
324 grp->member_cnt++; in tipc_group_create_member()
325 tipc_nlist_add(&grp->dests, m->node); in tipc_group_create_member()
326 m->state = state; in tipc_group_create_member()
327 return m; in tipc_group_create_member()
337 struct tipc_member *m) in tipc_group_delete_member() argument
339 rb_erase(&m->tree_node, &grp->members); in tipc_group_delete_member()
340 grp->member_cnt--; in tipc_group_delete_member()
343 if (grp->bc_ackers && less(m->bc_acked, grp->bc_snd_nxt - 1)) in tipc_group_delete_member()
344 grp->bc_ackers--; in tipc_group_delete_member()
346 list_del_init(&m->list); in tipc_group_delete_member()
347 list_del_init(&m->small_win); in tipc_group_delete_member()
348 tipc_group_decr_active(grp, m); in tipc_group_delete_member()
351 if (!tipc_group_find_node(grp, m->node)) in tipc_group_delete_member()
352 tipc_nlist_del(&grp->dests, m->node); in tipc_group_delete_member()
354 kfree(m); in tipc_group_delete_member()
359 return &grp->dests; in tipc_group_dests()
365 seq->type = grp->type; in tipc_group_self()
366 seq->lower = grp->instance; in tipc_group_self()
367 seq->upper = grp->instance; in tipc_group_self()
368 *scope = grp->scope; in tipc_group_self()
371 void tipc_group_update_member(struct tipc_member *m, int len) in tipc_group_update_member() argument
373 struct tipc_group *grp = m->group; in tipc_group_update_member()
376 if (!tipc_group_is_receiver(m)) in tipc_group_update_member()
379 m->window -= len; in tipc_group_update_member()
381 if (m->window >= ADV_IDLE) in tipc_group_update_member()
384 list_del_init(&m->small_win); in tipc_group_update_member()
387 list_for_each_entry_safe(_m, tmp, &grp->small_win, small_win) { in tipc_group_update_member()
388 if (_m->window > m->window) in tipc_group_update_member()
391 list_add_tail(&m->small_win, &_m->small_win); in tipc_group_update_member()
396 u16 prev = grp->bc_snd_nxt - 1; in tipc_group_update_bc_members()
397 struct tipc_member *m; in tipc_group_update_bc_members() local
401 for (n = rb_first(&grp->members); n; n = rb_next(n)) { in tipc_group_update_bc_members()
402 m = container_of(n, struct tipc_member, tree_node); in tipc_group_update_bc_members()
403 if (tipc_group_is_receiver(m)) { in tipc_group_update_bc_members()
404 tipc_group_update_member(m, len); in tipc_group_update_bc_members()
405 m->bc_acked = prev; in tipc_group_update_bc_members()
412 grp->bc_ackers = ackers; in tipc_group_update_bc_members()
413 grp->bc_snd_nxt++; in tipc_group_update_bc_members()
420 struct tipc_member *m; in tipc_group_cong() local
423 m = tipc_group_find_dest(grp, dnode, dport); in tipc_group_cong()
424 if (!tipc_group_is_receiver(m)) { in tipc_group_cong()
428 *mbr = m; in tipc_group_cong()
430 if (m->window >= len) in tipc_group_cong()
433 *grp->open = false; in tipc_group_cong()
436 adv = m->advertised; in tipc_group_cong()
437 state = m->state; in tipc_group_cong()
445 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, &xmitq); in tipc_group_cong()
446 tipc_node_distr_xmit(grp->net, &xmitq); in tipc_group_cong()
452 struct tipc_member *m = NULL; in tipc_group_bc_cong() local
455 if (grp->bc_ackers) { in tipc_group_bc_cong()
456 *grp->open = false; in tipc_group_bc_cong()
459 if (list_empty(&grp->small_win)) in tipc_group_bc_cong()
462 m = list_first_entry(&grp->small_win, struct tipc_member, small_win); in tipc_group_bc_cong()
463 if (m->window >= len) in tipc_group_bc_cong()
466 return tipc_group_cong(grp, m->node, m->port, len, &m); in tipc_group_bc_cong()
469 /* tipc_group_sort_msg() - sort msg into queue by bcast sequence number
478 /* Bcast/mcast may be bypassed by ucast or other bcast, - sort it in */ in tipc_group_sort_msg()
487 /* Bcast was not bypassed, - add to tail */ in tipc_group_sort_msg()
489 /* Unicasts are never bypassed, - always add to tail */ in tipc_group_sort_msg()
493 /* tipc_group_filter_msg() - determine if we should accept arriving message
501 struct tipc_member *m; in tipc_group_filter_msg() local
516 m = tipc_group_find_member(grp, node, port); in tipc_group_filter_msg()
517 if (!tipc_group_is_sender(m)) in tipc_group_filter_msg()
520 if (less(msg_grp_bc_seqno(hdr), m->bc_rcv_nxt)) in tipc_group_filter_msg()
523 TIPC_SKB_CB(skb)->orig_member = m->instance; in tipc_group_filter_msg()
524 defq = &m->deferredq; in tipc_group_filter_msg()
535 if (more(msg_grp_bc_seqno(hdr), m->bc_rcv_nxt)) in tipc_group_filter_msg()
541 if (msg_nameinst(hdr) != grp->instance) { in tipc_group_filter_msg()
547 m->bc_rcv_nxt++; in tipc_group_filter_msg()
553 if (m->state == MBR_LEAVING) in tipc_group_filter_msg()
555 if (!grp->events) in tipc_group_filter_msg()
570 tipc_group_proto_xmit(grp, m, GRP_ACK_MSG, xmitq); in tipc_group_filter_msg()
574 tipc_group_delete_member(grp, m); in tipc_group_filter_msg()
590 struct list_head *active = &grp->active; in tipc_group_update_rcv_win()
591 int max_active = grp->max_active; in tipc_group_update_rcv_win()
593 int active_cnt = grp->active_cnt; in tipc_group_update_rcv_win()
594 struct tipc_member *m, *rm, *pm; in tipc_group_update_rcv_win() local
596 m = tipc_group_find_member(grp, node, port); in tipc_group_update_rcv_win()
597 if (!m) in tipc_group_update_rcv_win()
600 m->advertised -= blks; in tipc_group_update_rcv_win()
602 switch (m->state) { in tipc_group_update_rcv_win()
606 m->state = MBR_ACTIVE; in tipc_group_update_rcv_win()
607 list_add_tail(&m->list, active); in tipc_group_update_rcv_win()
608 grp->active_cnt++; in tipc_group_update_rcv_win()
609 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, xmitq); in tipc_group_update_rcv_win()
611 m->state = MBR_PENDING; in tipc_group_update_rcv_win()
612 list_add_tail(&m->list, &grp->pending); in tipc_group_update_rcv_win()
621 rm->state = MBR_RECLAIMING; in tipc_group_update_rcv_win()
622 list_del_init(&rm->list); in tipc_group_update_rcv_win()
626 /* Nobody to reclaim from; - revert oldest pending to JOINED */ in tipc_group_update_rcv_win()
627 pm = list_first_entry(&grp->pending, struct tipc_member, list); in tipc_group_update_rcv_win()
628 list_del_init(&pm->list); in tipc_group_update_rcv_win()
629 pm->state = MBR_JOINED; in tipc_group_update_rcv_win()
633 if (!list_is_last(&m->list, &grp->active)) in tipc_group_update_rcv_win()
634 list_move_tail(&m->list, &grp->active); in tipc_group_update_rcv_win()
635 if (m->advertised > (ADV_ACTIVE * 3 / 4)) in tipc_group_update_rcv_win()
637 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, xmitq); in tipc_group_update_rcv_win()
640 if (m->advertised > ADV_IDLE) in tipc_group_update_rcv_win()
642 m->state = MBR_JOINED; in tipc_group_update_rcv_win()
643 grp->active_cnt--; in tipc_group_update_rcv_win()
644 if (m->advertised < ADV_IDLE) { in tipc_group_update_rcv_win()
646 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, xmitq); in tipc_group_update_rcv_win()
649 if (list_empty(&grp->pending)) in tipc_group_update_rcv_win()
653 pm = list_first_entry(&grp->pending, struct tipc_member, list); in tipc_group_update_rcv_win()
654 pm->state = MBR_ACTIVE; in tipc_group_update_rcv_win()
655 list_move_tail(&pm->list, &grp->active); in tipc_group_update_rcv_win()
656 grp->active_cnt++; in tipc_group_update_rcv_win()
668 struct tipc_member *m, in tipc_group_create_event() argument
671 { u32 dnode = tipc_own_addr(grp->net); in tipc_group_create_event()
678 evt.found_lower = m->instance; in tipc_group_create_event()
679 evt.found_upper = m->instance; in tipc_group_create_event()
680 evt.port.ref = m->port; in tipc_group_create_event()
681 evt.port.node = m->node; in tipc_group_create_event()
682 evt.s.seq.type = grp->type; in tipc_group_create_event()
683 evt.s.seq.lower = m->instance; in tipc_group_create_event()
684 evt.s.seq.upper = m->instance; in tipc_group_create_event()
687 GROUP_H_SIZE, sizeof(evt), dnode, m->node, in tipc_group_create_event()
688 grp->portid, m->port, 0); in tipc_group_create_event()
693 msg_set_nametype(hdr, grp->type); in tipc_group_create_event()
698 TIPC_SKB_CB(skb)->orig_member = m->instance; in tipc_group_create_event()
702 static void tipc_group_proto_xmit(struct tipc_group *grp, struct tipc_member *m, in tipc_group_proto_xmit() argument
710 m->node, tipc_own_addr(grp->net), in tipc_group_proto_xmit()
711 m->port, grp->portid, 0); in tipc_group_proto_xmit()
715 if (m->state == MBR_ACTIVE) in tipc_group_proto_xmit()
716 adv = ADV_ACTIVE - m->advertised; in tipc_group_proto_xmit()
717 else if (m->state == MBR_JOINED || m->state == MBR_PENDING) in tipc_group_proto_xmit()
718 adv = ADV_IDLE - m->advertised; in tipc_group_proto_xmit()
723 msg_set_grp_bc_syncpt(hdr, grp->bc_snd_nxt); in tipc_group_proto_xmit()
725 m->advertised += adv; in tipc_group_proto_xmit()
727 msg_set_grp_bc_syncpt(hdr, grp->bc_snd_nxt); in tipc_group_proto_xmit()
730 m->advertised += adv; in tipc_group_proto_xmit()
732 msg_set_grp_bc_acked(hdr, m->bc_rcv_nxt); in tipc_group_proto_xmit()
734 msg_set_grp_remitted(hdr, m->window); in tipc_group_proto_xmit()
746 struct tipc_member *m, *pm; in tipc_group_proto_rcv() local
752 if (grp->scope == TIPC_NODE_SCOPE && node != tipc_own_addr(grp->net)) in tipc_group_proto_rcv()
755 m = tipc_group_find_member(grp, node, port); in tipc_group_proto_rcv()
759 if (!m) in tipc_group_proto_rcv()
760 m = tipc_group_create_member(grp, node, port, in tipc_group_proto_rcv()
762 if (!m) in tipc_group_proto_rcv()
764 m->bc_syncpt = msg_grp_bc_syncpt(hdr); in tipc_group_proto_rcv()
765 m->bc_rcv_nxt = m->bc_syncpt; in tipc_group_proto_rcv()
766 m->window += msg_adv_win(hdr); in tipc_group_proto_rcv()
769 if (m->state != MBR_PUBLISHED) in tipc_group_proto_rcv()
773 m->state = MBR_JOINED; in tipc_group_proto_rcv()
774 tipc_group_open(m, usr_wakeup); in tipc_group_proto_rcv()
775 tipc_group_update_member(m, 0); in tipc_group_proto_rcv()
776 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, xmitq); in tipc_group_proto_rcv()
777 tipc_group_create_event(grp, m, TIPC_PUBLISHED, in tipc_group_proto_rcv()
778 m->bc_syncpt, inputq); in tipc_group_proto_rcv()
781 if (!m) in tipc_group_proto_rcv()
783 m->bc_syncpt = msg_grp_bc_syncpt(hdr); in tipc_group_proto_rcv()
784 list_del_init(&m->list); in tipc_group_proto_rcv()
785 tipc_group_open(m, usr_wakeup); in tipc_group_proto_rcv()
786 tipc_group_decr_active(grp, m); in tipc_group_proto_rcv()
787 m->state = MBR_LEAVING; in tipc_group_proto_rcv()
788 tipc_group_create_event(grp, m, TIPC_WITHDRAWN, in tipc_group_proto_rcv()
789 m->bc_syncpt, inputq); in tipc_group_proto_rcv()
792 if (!m) in tipc_group_proto_rcv()
794 m->window += msg_adv_win(hdr); in tipc_group_proto_rcv()
795 tipc_group_open(m, usr_wakeup); in tipc_group_proto_rcv()
798 if (!m) in tipc_group_proto_rcv()
800 m->bc_acked = msg_grp_bc_acked(hdr); in tipc_group_proto_rcv()
801 if (--grp->bc_ackers) in tipc_group_proto_rcv()
803 list_del_init(&m->small_win); in tipc_group_proto_rcv()
804 *m->group->open = true; in tipc_group_proto_rcv()
806 tipc_group_update_member(m, 0); in tipc_group_proto_rcv()
809 if (!m) in tipc_group_proto_rcv()
811 tipc_group_proto_xmit(grp, m, GRP_REMIT_MSG, xmitq); in tipc_group_proto_rcv()
812 m->window = ADV_IDLE; in tipc_group_proto_rcv()
813 tipc_group_open(m, usr_wakeup); in tipc_group_proto_rcv()
816 if (!m || m->state != MBR_RECLAIMING) in tipc_group_proto_rcv()
822 if (m->advertised > remitted) { in tipc_group_proto_rcv()
823 m->state = MBR_REMITTED; in tipc_group_proto_rcv()
824 in_flight = m->advertised - remitted; in tipc_group_proto_rcv()
825 m->advertised = ADV_IDLE + in_flight; in tipc_group_proto_rcv()
829 if (m->advertised < remitted) in tipc_group_proto_rcv()
833 m->state = MBR_JOINED; in tipc_group_proto_rcv()
834 grp->active_cnt--; in tipc_group_proto_rcv()
835 m->advertised = ADV_IDLE; in tipc_group_proto_rcv()
838 if (list_empty(&grp->pending)) in tipc_group_proto_rcv()
840 pm = list_first_entry(&grp->pending, struct tipc_member, list); in tipc_group_proto_rcv()
841 pm->state = MBR_ACTIVE; in tipc_group_proto_rcv()
842 list_move_tail(&pm->list, &grp->active); in tipc_group_proto_rcv()
843 grp->active_cnt++; in tipc_group_proto_rcv()
844 if (pm->advertised <= (ADV_ACTIVE * 3 / 4)) in tipc_group_proto_rcv()
852 /* tipc_group_member_evt() - receive and handle a member up/down event
862 u32 instance = evt->found_lower; in tipc_group_member_evt()
863 u32 node = evt->port.node; in tipc_group_member_evt()
864 u32 port = evt->port.ref; in tipc_group_member_evt()
865 int event = evt->event; in tipc_group_member_evt()
866 struct tipc_member *m; in tipc_group_member_evt() local
873 net = grp->net; in tipc_group_member_evt()
875 if (!grp->loopback && node == self && port == grp->portid) in tipc_group_member_evt()
878 m = tipc_group_find_member(grp, node, port); in tipc_group_member_evt()
883 if (!m) { in tipc_group_member_evt()
884 m = tipc_group_create_member(grp, node, port, instance, in tipc_group_member_evt()
886 if (!m) in tipc_group_member_evt()
888 tipc_group_update_member(m, 0); in tipc_group_member_evt()
889 tipc_group_proto_xmit(grp, m, GRP_JOIN_MSG, xmitq); in tipc_group_member_evt()
893 if (m->state != MBR_JOINING) in tipc_group_member_evt()
897 m->instance = instance; in tipc_group_member_evt()
898 m->state = MBR_JOINED; in tipc_group_member_evt()
899 tipc_group_open(m, usr_wakeup); in tipc_group_member_evt()
900 tipc_group_update_member(m, 0); in tipc_group_member_evt()
901 tipc_group_proto_xmit(grp, m, GRP_JOIN_MSG, xmitq); in tipc_group_member_evt()
902 tipc_group_create_event(grp, m, TIPC_PUBLISHED, in tipc_group_member_evt()
903 m->bc_syncpt, inputq); in tipc_group_member_evt()
906 if (!m) in tipc_group_member_evt()
909 tipc_group_decr_active(grp, m); in tipc_group_member_evt()
910 m->state = MBR_LEAVING; in tipc_group_member_evt()
911 list_del_init(&m->list); in tipc_group_member_evt()
912 tipc_group_open(m, usr_wakeup); in tipc_group_member_evt()
916 tipc_group_create_event(grp, m, TIPC_WITHDRAWN, in tipc_group_member_evt()
917 m->bc_rcv_nxt, inputq); in tipc_group_member_evt()
930 return -EMSGSIZE; in tipc_group_fill_sock_diag()
933 grp->type) || in tipc_group_fill_sock_diag()
935 grp->instance) || in tipc_group_fill_sock_diag()
937 grp->bc_snd_nxt)) in tipc_group_fill_sock_diag()
940 if (grp->scope == TIPC_NODE_SCOPE) in tipc_group_fill_sock_diag()
944 if (grp->scope == TIPC_CLUSTER_SCOPE) in tipc_group_fill_sock_diag()
948 if (*grp->open) in tipc_group_fill_sock_diag()
957 return -1; in tipc_group_fill_sock_diag()