Lines Matching refs:mon
153 static struct tipc_peer *get_peer(struct tipc_monitor *mon, u32 addr) in get_peer() argument
158 hlist_for_each_entry(peer, &mon->peers[thash], hash) { in get_peer()
167 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); in get_self() local
169 return mon->self; in get_self()
172 static inline bool tipc_mon_is_active(struct net *net, struct tipc_monitor *mon) in tipc_mon_is_active() argument
176 return mon->peer_cnt > tn->mon_threshold; in tipc_mon_is_active()
215 static void mon_apply_domain(struct tipc_monitor *mon, in mon_apply_domain() argument
240 static void mon_update_local_domain(struct tipc_monitor *mon) in mon_update_local_domain() argument
242 struct tipc_peer *self = mon->self; in mon_update_local_domain()
243 struct tipc_mon_domain *cache = &mon->cache; in mon_update_local_domain()
251 member_cnt = dom_size(mon->peer_cnt) - 1; in mon_update_local_domain()
268 dom->gen = ++mon->dom_gen; in mon_update_local_domain()
273 mon_apply_domain(mon, self); in mon_update_local_domain()
278 static void mon_update_neighbors(struct tipc_monitor *mon, in mon_update_neighbors() argument
283 dz = dom_size(mon->peer_cnt); in mon_update_neighbors()
285 mon_apply_domain(mon, peer); in mon_update_neighbors()
294 static void mon_assign_roles(struct tipc_monitor *mon, struct tipc_peer *head) in mon_assign_roles() argument
297 struct tipc_peer *self = mon->self; in mon_assign_roles()
319 mon->list_gen++; in mon_assign_roles()
324 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); in tipc_mon_remove_peer() local
328 write_lock_bh(&mon->lock); in tipc_mon_remove_peer()
329 peer = get_peer(mon, addr); in tipc_mon_remove_peer()
337 mon->peer_cnt--; in tipc_mon_remove_peer()
340 mon_update_local_domain(mon); in tipc_mon_remove_peer()
341 mon_update_neighbors(mon, prev); in tipc_mon_remove_peer()
344 if (!tipc_mon_is_active(net, mon)) { in tipc_mon_remove_peer()
351 mon_assign_roles(mon, head); in tipc_mon_remove_peer()
353 write_unlock_bh(&mon->lock); in tipc_mon_remove_peer()
356 static bool tipc_mon_add_peer(struct tipc_monitor *mon, u32 addr, in tipc_mon_add_peer() argument
359 struct tipc_peer *self = mon->self; in tipc_mon_add_peer()
370 hlist_add_head(&p->hash, &mon->peers[tipc_hashfn(addr)]); in tipc_mon_add_peer()
383 mon->peer_cnt++; in tipc_mon_add_peer()
384 mon_update_neighbors(mon, p); in tipc_mon_add_peer()
390 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); in tipc_mon_peer_up() local
394 write_lock_bh(&mon->lock); in tipc_mon_peer_up()
395 peer = get_peer(mon, addr); in tipc_mon_peer_up()
396 if (!peer && !tipc_mon_add_peer(mon, addr, &peer)) in tipc_mon_peer_up()
401 mon_update_local_domain(mon); in tipc_mon_peer_up()
402 mon_assign_roles(mon, head); in tipc_mon_peer_up()
404 write_unlock_bh(&mon->lock); in tipc_mon_peer_up()
409 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); in tipc_mon_peer_down() local
415 write_lock_bh(&mon->lock); in tipc_mon_peer_down()
416 peer = get_peer(mon, addr); in tipc_mon_peer_down()
434 mon_update_local_domain(mon); in tipc_mon_peer_down()
435 mon_assign_roles(mon, head); in tipc_mon_peer_down()
437 write_unlock_bh(&mon->lock); in tipc_mon_peer_down()
445 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); in tipc_mon_rcv() local
481 write_lock_bh(&mon->lock); in tipc_mon_rcv()
482 peer = get_peer(mon, addr); in tipc_mon_rcv()
518 mon_apply_domain(mon, peer); in tipc_mon_rcv()
520 mon_assign_roles(mon, peer_head(peer)); in tipc_mon_rcv()
522 write_unlock_bh(&mon->lock); in tipc_mon_rcv()
528 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); in tipc_mon_prep() local
530 u16 gen = mon->dom_gen; in tipc_mon_prep()
534 if (!tipc_mon_is_active(net, mon)) { in tipc_mon_prep()
550 read_lock_bh(&mon->lock); in tipc_mon_prep()
551 len = ntohs(mon->cache.len); in tipc_mon_prep()
553 memcpy(data, &mon->cache, len); in tipc_mon_prep()
554 read_unlock_bh(&mon->lock); in tipc_mon_prep()
562 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); in tipc_mon_get_state() local
565 if (!tipc_mon_is_active(net, mon)) { in tipc_mon_get_state()
573 (state->list_gen == mon->list_gen) && in tipc_mon_get_state()
574 (state->acked_gen == mon->dom_gen)) in tipc_mon_get_state()
577 read_lock_bh(&mon->lock); in tipc_mon_get_state()
578 peer = get_peer(mon, addr); in tipc_mon_get_state()
580 state->probing = state->acked_gen != mon->dom_gen; in tipc_mon_get_state()
585 state->list_gen = mon->list_gen; in tipc_mon_get_state()
587 read_unlock_bh(&mon->lock); in tipc_mon_get_state()
592 struct tipc_monitor *mon = from_timer(mon, t, timer); in mon_timeout() local
594 int best_member_cnt = dom_size(mon->peer_cnt) - 1; in mon_timeout()
596 write_lock_bh(&mon->lock); in mon_timeout()
597 self = mon->self; in mon_timeout()
599 mon_update_local_domain(mon); in mon_timeout()
600 mon_assign_roles(mon, self); in mon_timeout()
602 write_unlock_bh(&mon->lock); in mon_timeout()
603 mod_timer(&mon->timer, jiffies + mon->timer_intv); in mon_timeout()
609 struct tipc_monitor *mon; in tipc_mon_create() local
616 mon = kzalloc(sizeof(*mon), GFP_ATOMIC); in tipc_mon_create()
619 if (!mon || !self || !dom) { in tipc_mon_create()
620 kfree(mon); in tipc_mon_create()
625 tn->monitors[bearer_id] = mon; in tipc_mon_create()
626 rwlock_init(&mon->lock); in tipc_mon_create()
627 mon->net = net; in tipc_mon_create()
628 mon->peer_cnt = 1; in tipc_mon_create()
629 mon->self = self; in tipc_mon_create()
635 timer_setup(&mon->timer, mon_timeout, 0); in tipc_mon_create()
636 mon->timer_intv = msecs_to_jiffies(MON_TIMEOUT + (tn->random & 0xffff)); in tipc_mon_create()
637 mod_timer(&mon->timer, jiffies + mon->timer_intv); in tipc_mon_create()
644 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); in tipc_mon_delete() local
648 if (!mon) in tipc_mon_delete()
652 write_lock_bh(&mon->lock); in tipc_mon_delete()
660 mon->self = NULL; in tipc_mon_delete()
661 write_unlock_bh(&mon->lock); in tipc_mon_delete()
662 del_timer_sync(&mon->timer); in tipc_mon_delete()
665 kfree(mon); in tipc_mon_delete()
744 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); in tipc_nl_add_monitor_peer() local
747 if (!mon) in tipc_nl_add_monitor_peer()
750 read_lock_bh(&mon->lock); in tipc_nl_add_monitor_peer()
751 peer = mon->self; in tipc_nl_add_monitor_peer()
761 read_unlock_bh(&mon->lock); in tipc_nl_add_monitor_peer()
764 } while ((peer = peer_nxt(peer)) != mon->self); in tipc_nl_add_monitor_peer()
765 read_unlock_bh(&mon->lock); in tipc_nl_add_monitor_peer()
773 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); in __tipc_nl_add_monitor() local
780 if (ret || !mon) in __tipc_nl_add_monitor()
792 read_lock_bh(&mon->lock); in __tipc_nl_add_monitor()
795 if (tipc_mon_is_active(net, mon)) in __tipc_nl_add_monitor()
800 if (nla_put_u32(msg->skb, TIPC_NLA_MON_PEERCNT, mon->peer_cnt)) in __tipc_nl_add_monitor()
802 if (nla_put_u32(msg->skb, TIPC_NLA_MON_LISTGEN, mon->list_gen)) in __tipc_nl_add_monitor()
805 read_unlock_bh(&mon->lock); in __tipc_nl_add_monitor()
812 read_unlock_bh(&mon->lock); in __tipc_nl_add_monitor()