Просмотр исходного кода

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 12 лет назад
Родитель
Сommit
86fd9a14f6
1 измененных файлов с 8 добавлено и 8 удалено
  1. 8 8
      exec/totemiba.c

+ 8 - 8
exec/totemiba.c

@@ -616,6 +616,14 @@ static int recv_token_accept_destroy (struct totemiba_instance *instance)
 		return (0);
 		return (0);
 	}
 	}
 
 
+	poll_dispatch_delete (
+		instance->totemiba_poll_handle,
+		instance->recv_token_recv_completion_channel->fd);
+
+	poll_dispatch_delete (
+		instance->totemiba_poll_handle,
+		instance->recv_token_send_completion_channel->fd);
+
 	rdma_destroy_qp (instance->recv_token_cma_id);
 	rdma_destroy_qp (instance->recv_token_cma_id);
 
 
 	recv_token_recv_buf_post_destroy (instance);
 	recv_token_recv_buf_post_destroy (instance);
@@ -632,14 +640,6 @@ static int recv_token_accept_destroy (struct totemiba_instance *instance)
 
 
 	rdma_destroy_id (instance->recv_token_cma_id);
 	rdma_destroy_id (instance->recv_token_cma_id);
 
 
-	poll_dispatch_delete (
-		instance->totemiba_poll_handle,
-		instance->recv_token_recv_completion_channel->fd);
-
-	poll_dispatch_delete (
-		instance->totemiba_poll_handle,
-		instance->recv_token_send_completion_channel->fd);
-
 	return (0);
 	return (0);
 }
 }