Explorar o código

totemiba: Del channel fd from poll before destroy

Corosync freezes after several peer node connects/disconnects. The
freeze happens in recv_token_cq_recv_event_fn in ibv_get_cq_event call.
The problems is in fact, that after each peer node connect,
recv_token_accept_destroy is called, which tries to call
poll_dispatch_delete _after_ freeing of completion_channel. As
completion_channel contains fd, handlers are not disconnected from
poller properly. This leads to complete inconsistency in subsequent
calls to handlers.

Signed-off-by: Yevheniy Demchenko <zheka@uvt.cz>
Reviewed-by: Jan Friesse <jfriesse@redhat.com>
Yevheniy Demchenko %!s(int64=12) %!d(string=hai) anos
pai
achega
c5d4a0762f
Modificáronse 1 ficheiros con 8 adicións e 8 borrados
  1. 8 8
      exec/totemiba.c

+ 8 - 8
exec/totemiba.c

@@ -622,6 +622,14 @@ static int recv_token_accept_destroy (struct totemiba_instance *instance)
 		return (0);
 	}
 
+	qb_loop_poll_del (
+		instance->totemiba_poll_handle,
+		instance->recv_token_recv_completion_channel->fd);
+
+	qb_loop_poll_del (
+		instance->totemiba_poll_handle,
+		instance->recv_token_send_completion_channel->fd);
+
 	rdma_destroy_qp (instance->recv_token_cma_id);
 
 	recv_token_recv_buf_post_destroy (instance);
@@ -638,14 +646,6 @@ static int recv_token_accept_destroy (struct totemiba_instance *instance)
 
 	rdma_destroy_id (instance->recv_token_cma_id);
 
-	qb_loop_poll_del (
-		instance->totemiba_poll_handle,
-		instance->recv_token_recv_completion_channel->fd);
-
-	qb_loop_poll_del (
-		instance->totemiba_poll_handle,
-		instance->recv_token_send_completion_channel->fd);
-
 	return (0);
 }