Skip to content

Commit

Permalink
tipc: simplify group LEAVE sequence
Browse files Browse the repository at this point in the history
After the changes in the previous commit the group LEAVE sequence
can be simplified.

We now let the arrival of a LEAVE message unconditionally issue a group
DOWN event to the user. When a topology WITHDRAW event is received, the
member, if it still there, is set to state LEAVING, but we only issue a
group DOWN event when the link to the peer node is gone, so that no
LEAVE message is to be expected.

Acked-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Jon Maloy authored and David S. Miller committed Jan 9, 2018
1 parent 7ad32bc commit c2b22bc
Showing 1 changed file with 9 additions and 31 deletions.
40 changes: 9 additions & 31 deletions net/tipc/group.c
Original file line number Diff line number Diff line change
Expand Up @@ -749,14 +749,8 @@ void tipc_group_proto_rcv(struct tipc_group *grp, bool *usr_wakeup,
list_del_init(&m->list);
list_del_init(&m->small_win);
*usr_wakeup = true;

/* Wait until WITHDRAW event is received */
if (m->state != MBR_LEAVING) {
tipc_group_decr_active(grp, m);
m->state = MBR_LEAVING;
return;
}
/* Otherwise deliver member WITHDRAW event */
tipc_group_decr_active(grp, m);
m->state = MBR_LEAVING;
tipc_group_create_event(grp, m, TIPC_WITHDRAWN,
m->bc_syncpt, inputq);
return;
Expand Down Expand Up @@ -838,7 +832,6 @@ void tipc_group_member_evt(struct tipc_group *grp,
int event = evt->event;
struct tipc_member *m;
struct net *net;
bool node_up;
u32 self;

if (!grp)
Expand Down Expand Up @@ -878,30 +871,15 @@ void tipc_group_member_evt(struct tipc_group *grp,

*usr_wakeup = true;
m->usr_pending = false;
node_up = tipc_node_is_up(net, node);

if (node_up) {
/* Hold back event if a LEAVE msg should be expected */
if (m->state != MBR_LEAVING) {
tipc_group_decr_active(grp, m);
m->state = MBR_LEAVING;
} else {
tipc_group_create_event(grp, m, TIPC_WITHDRAWN,
m->bc_syncpt, inputq);
}
} else {
if (m->state != MBR_LEAVING) {
tipc_group_decr_active(grp, m);
m->state = MBR_LEAVING;
tipc_group_create_event(grp, m, TIPC_WITHDRAWN,
m->bc_rcv_nxt, inputq);
} else {
tipc_group_create_event(grp, m, TIPC_WITHDRAWN,
m->bc_syncpt, inputq);
}
}
tipc_group_decr_active(grp, m);
m->state = MBR_LEAVING;
list_del_init(&m->list);
list_del_init(&m->small_win);

/* Only send event if no LEAVE message can be expected */
if (!tipc_node_is_up(net, node))
tipc_group_create_event(grp, m, TIPC_WITHDRAWN,
m->bc_rcv_nxt, inputq);
}
*sk_rcvbuf = tipc_group_rcvbuf_limit(grp);
}

0 comments on commit c2b22bc

Please sign in to comment.