Lines Matching refs:mon

183 static struct tipc_peer *get_peer(struct tipc_monitor *mon, u32 addr)  in get_peer()  argument
188 hlist_for_each_entry(peer, &mon->peers[thash], hash) { in get_peer()
197 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); in get_self() local
199 return mon->self; in get_self()
202 static inline bool tipc_mon_is_active(struct net *net, struct tipc_monitor *mon) in tipc_mon_is_active() argument
206 return mon->peer_cnt > tn->mon_threshold; in tipc_mon_is_active()
245 static void mon_apply_domain(struct tipc_monitor *mon, in mon_apply_domain() argument
270 static void mon_update_local_domain(struct tipc_monitor *mon) in mon_update_local_domain() argument
272 struct tipc_peer *self = mon->self; in mon_update_local_domain()
273 struct tipc_mon_domain *cache = &mon->cache; in mon_update_local_domain()
281 member_cnt = dom_size(mon->peer_cnt) - 1; in mon_update_local_domain()
298 dom->gen = ++mon->dom_gen; in mon_update_local_domain()
303 mon_apply_domain(mon, self); in mon_update_local_domain()
308 static void mon_update_neighbors(struct tipc_monitor *mon, in mon_update_neighbors() argument
313 dz = dom_size(mon->peer_cnt); in mon_update_neighbors()
315 mon_apply_domain(mon, peer); in mon_update_neighbors()
324 static void mon_assign_roles(struct tipc_monitor *mon, struct tipc_peer *head) in mon_assign_roles() argument
327 struct tipc_peer *self = mon->self; in mon_assign_roles()
349 mon->list_gen++; in mon_assign_roles()
354 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); in tipc_mon_remove_peer() local
358 if (!mon) in tipc_mon_remove_peer()
362 write_lock_bh(&mon->lock); in tipc_mon_remove_peer()
363 peer = get_peer(mon, addr); in tipc_mon_remove_peer()
371 mon->peer_cnt--; in tipc_mon_remove_peer()
374 mon_update_local_domain(mon); in tipc_mon_remove_peer()
375 mon_update_neighbors(mon, prev); in tipc_mon_remove_peer()
378 if (!tipc_mon_is_active(net, mon)) { in tipc_mon_remove_peer()
385 mon_assign_roles(mon, head); in tipc_mon_remove_peer()
387 write_unlock_bh(&mon->lock); in tipc_mon_remove_peer()
390 static bool tipc_mon_add_peer(struct tipc_monitor *mon, u32 addr, in tipc_mon_add_peer() argument
393 struct tipc_peer *self = mon->self; in tipc_mon_add_peer()
404 hlist_add_head(&p->hash, &mon->peers[tipc_hashfn(addr)]); in tipc_mon_add_peer()
417 mon->peer_cnt++; in tipc_mon_add_peer()
418 mon_update_neighbors(mon, p); in tipc_mon_add_peer()
424 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); in tipc_mon_peer_up() local
428 write_lock_bh(&mon->lock); in tipc_mon_peer_up()
429 peer = get_peer(mon, addr); in tipc_mon_peer_up()
430 if (!peer && !tipc_mon_add_peer(mon, addr, &peer)) in tipc_mon_peer_up()
435 mon_update_local_domain(mon); in tipc_mon_peer_up()
436 mon_assign_roles(mon, head); in tipc_mon_peer_up()
438 write_unlock_bh(&mon->lock); in tipc_mon_peer_up()
443 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); in tipc_mon_peer_down() local
449 if (!mon) in tipc_mon_peer_down()
453 write_lock_bh(&mon->lock); in tipc_mon_peer_down()
454 peer = get_peer(mon, addr); in tipc_mon_peer_down()
472 mon_update_local_domain(mon); in tipc_mon_peer_down()
473 mon_assign_roles(mon, head); in tipc_mon_peer_down()
475 write_unlock_bh(&mon->lock); in tipc_mon_peer_down()
483 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); in tipc_mon_rcv() local
522 write_lock_bh(&mon->lock); in tipc_mon_rcv()
523 peer = get_peer(mon, addr); in tipc_mon_rcv()
559 mon_apply_domain(mon, peer); in tipc_mon_rcv()
561 mon_assign_roles(mon, peer_head(peer)); in tipc_mon_rcv()
563 write_unlock_bh(&mon->lock); in tipc_mon_rcv()
569 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); in tipc_mon_prep() local
571 u16 gen = mon->dom_gen; in tipc_mon_prep()
575 if (!tipc_mon_is_active(net, mon)) { in tipc_mon_prep()
591 read_lock_bh(&mon->lock); in tipc_mon_prep()
592 len = mon_le16_to_cpu(mon->cache.len); in tipc_mon_prep()
594 memcpy(data, &mon->cache, len); in tipc_mon_prep()
595 read_unlock_bh(&mon->lock); in tipc_mon_prep()
603 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); in tipc_mon_get_state() local
606 if (!tipc_mon_is_active(net, mon)) { in tipc_mon_get_state()
614 (state->list_gen == mon->list_gen) && in tipc_mon_get_state()
615 (state->acked_gen == mon->dom_gen)) in tipc_mon_get_state()
618 read_lock_bh(&mon->lock); in tipc_mon_get_state()
619 peer = get_peer(mon, addr); in tipc_mon_get_state()
621 state->probing = state->acked_gen != mon->dom_gen; in tipc_mon_get_state()
626 state->list_gen = mon->list_gen; in tipc_mon_get_state()
628 read_unlock_bh(&mon->lock); in tipc_mon_get_state()
633 struct tipc_monitor *mon = from_timer(mon, t, timer); in mon_timeout() local
635 int best_member_cnt = dom_size(mon->peer_cnt) - 1; in mon_timeout()
637 write_lock_bh(&mon->lock); in mon_timeout()
638 self = mon->self; in mon_timeout()
640 mon_update_local_domain(mon); in mon_timeout()
641 mon_assign_roles(mon, self); in mon_timeout()
643 write_unlock_bh(&mon->lock); in mon_timeout()
644 mod_timer(&mon->timer, jiffies + mon->timer_intv); in mon_timeout()
650 struct tipc_monitor *mon; in tipc_mon_create() local
657 mon = kzalloc(sizeof(*mon), GFP_ATOMIC); in tipc_mon_create()
660 if (!mon || !self || !dom) { in tipc_mon_create()
661 kfree(mon); in tipc_mon_create()
666 tn->monitors[bearer_id] = mon; in tipc_mon_create()
667 rwlock_init(&mon->lock); in tipc_mon_create()
668 mon->net = net; in tipc_mon_create()
669 mon->peer_cnt = 1; in tipc_mon_create()
670 mon->self = self; in tipc_mon_create()
676 timer_setup(&mon->timer, mon_timeout, 0); in tipc_mon_create()
677 mon->timer_intv = msecs_to_jiffies(MON_TIMEOUT + (tn->random & 0xffff)); in tipc_mon_create()
678 mod_timer(&mon->timer, jiffies + mon->timer_intv); in tipc_mon_create()
685 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); in tipc_mon_delete() local
689 if (!mon) in tipc_mon_delete()
693 write_lock_bh(&mon->lock); in tipc_mon_delete()
701 mon->self = NULL; in tipc_mon_delete()
702 write_unlock_bh(&mon->lock); in tipc_mon_delete()
703 timer_shutdown_sync(&mon->timer); in tipc_mon_delete()
706 kfree(mon); in tipc_mon_delete()
711 struct tipc_monitor *mon; in tipc_mon_reinit_self() local
715 mon = tipc_monitor(net, bearer_id); in tipc_mon_reinit_self()
716 if (!mon) in tipc_mon_reinit_self()
718 write_lock_bh(&mon->lock); in tipc_mon_reinit_self()
719 mon->self->addr = tipc_own_addr(net); in tipc_mon_reinit_self()
720 write_unlock_bh(&mon->lock); in tipc_mon_reinit_self()
800 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); in tipc_nl_add_monitor_peer() local
803 if (!mon) in tipc_nl_add_monitor_peer()
806 read_lock_bh(&mon->lock); in tipc_nl_add_monitor_peer()
807 peer = mon->self; in tipc_nl_add_monitor_peer()
817 read_unlock_bh(&mon->lock); in tipc_nl_add_monitor_peer()
820 } while ((peer = peer_nxt(peer)) != mon->self); in tipc_nl_add_monitor_peer()
821 read_unlock_bh(&mon->lock); in tipc_nl_add_monitor_peer()
829 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); in __tipc_nl_add_monitor() local
836 if (ret || !mon) in __tipc_nl_add_monitor()
848 read_lock_bh(&mon->lock); in __tipc_nl_add_monitor()
851 if (tipc_mon_is_active(net, mon)) in __tipc_nl_add_monitor()
856 if (nla_put_u32(msg->skb, TIPC_NLA_MON_PEERCNT, mon->peer_cnt)) in __tipc_nl_add_monitor()
858 if (nla_put_u32(msg->skb, TIPC_NLA_MON_LISTGEN, mon->list_gen)) in __tipc_nl_add_monitor()
861 read_unlock_bh(&mon->lock); in __tipc_nl_add_monitor()
868 read_unlock_bh(&mon->lock); in __tipc_nl_add_monitor()