[Openais] [PATCH 2/4] totemsrp: Remove recv_flush code

Jan Friesse jfriesse at redhat.com
Tue Mar 29 02:55:54 PDT 2011


Backport of Corosync 336741ee96caf3ae435b609ee8a76788902c9edf

The recv_flush code is no longer necessary because of the miss_count_count
addition.  It can in some cases lead to register corruption because of
interactions with -fstack-protector, the recursive nature of how this code
works, and interactions with the optimizer in some versions of gcc.

Signed-off-by: Jan Friesse <jfriesse at redhat.com>
---
 branches/whitetank/exec/totemnet.c |   45 +------------------------
 branches/whitetank/exec/totemnet.h |    2 -
 branches/whitetank/exec/totemrrp.c |   65 ------------------------------------
 branches/whitetank/exec/totemrrp.h |    2 -
 branches/whitetank/exec/totemsrp.c |    2 -
 5 files changed, 1 insertions(+), 115 deletions(-)

diff --git a/branches/whitetank/exec/totemnet.c b/branches/whitetank/exec/totemnet.c
index 154aa4f..b5c4293 100644
--- a/branches/whitetank/exec/totemnet.c
+++ b/branches/whitetank/exec/totemnet.c
@@ -148,8 +148,6 @@ struct totemnet_instance {
 
 	struct iovec totemnet_iov_recv;
 
-	struct iovec totemnet_iov_recv_flush;
-
 	struct totemnet_socket totemnet_sockets;
 
 	struct totem_ip_address mcast_address;
@@ -217,9 +215,6 @@ static void totemnet_instance_initialize (struct totemnet_instance *instance)
 	instance->totemnet_iov_recv.iov_base = instance->iov_buffer;
 
 	instance->totemnet_iov_recv.iov_len = FRAME_SIZE_MAX; //sizeof (instance->iov_buffer);
-	instance->totemnet_iov_recv_flush.iov_base = instance->iov_buffer_flush;
-
-	instance->totemnet_iov_recv_flush.iov_len = FRAME_SIZE_MAX; //sizeof (instance->iov_buffer);
 
 	/*
 	 * There is always atleast 1 processor
@@ -634,11 +629,7 @@ static int net_deliver_fn (
 	unsigned char *msg_offset;
 	unsigned int size_delv;
 
-	if (instance->flushing == 1) {
-		iovec = &instance->totemnet_iov_recv_flush;
-	} else {
-		iovec = &instance->totemnet_iov_recv;
-	}
+	iovec = &instance->totemnet_iov_recv;
 
 	/*
 	 * Receive datagram
@@ -1319,40 +1310,6 @@ error_exit:
 	return (res);
 }
 
-int totemnet_recv_flush (totemnet_handle handle)
-{
-	struct totemnet_instance *instance;
-	struct pollfd ufd;
-	int nfds;
-	int res = 0;
-
-	res = hdb_handle_get (&totemnet_instance_database, handle,
-		(void *)&instance);
-	if (res != 0) {
-		res = ENOENT;
-		goto error_exit;
-	}
-
-	instance->flushing = 1;
-
-	do {
-		ufd.fd = instance->totemnet_sockets.mcast_recv;
-		ufd.events = POLLIN;
-		nfds = poll (&ufd, 1, 0);
-		if (nfds == 1 && ufd.revents & POLLIN) {
-		net_deliver_fn (0, instance->totemnet_sockets.mcast_recv,
-			ufd.revents, instance);
-		}
-	} while (nfds == 1);
-
-	instance->flushing = 0;
-
-	hdb_handle_put (&totemnet_instance_database, handle);
-
-error_exit:
-	return (res);
-}
-
 int totemnet_send_flush (totemnet_handle handle)
 {
 	struct totemnet_instance *instance;
diff --git a/branches/whitetank/exec/totemnet.h b/branches/whitetank/exec/totemnet.h
index f4788ab..521743a 100644
--- a/branches/whitetank/exec/totemnet.h
+++ b/branches/whitetank/exec/totemnet.h
@@ -88,8 +88,6 @@ extern int totemnet_mcast_noflush_send (
 	struct iovec *iovec,
 	unsigned int iov_len);
 
-extern int totemnet_recv_flush (totemnet_handle handle);
-
 extern int totemnet_send_flush (totemnet_handle handle);
 
 extern int totemnet_iface_check (totemnet_handle handle);
diff --git a/branches/whitetank/exec/totemrrp.c b/branches/whitetank/exec/totemrrp.c
index f471c5b..9864a88 100644
--- a/branches/whitetank/exec/totemrrp.c
+++ b/branches/whitetank/exec/totemrrp.c
@@ -131,9 +131,6 @@ struct rrp_algo {
 		struct iovec *iovec,
 		unsigned int iov_len);	
 
-	void (*recv_flush) (
-		struct totemrrp_instance *instance);
-
 	void (*send_flush) (
 		struct totemrrp_instance *instance);
 
@@ -244,9 +241,6 @@ static void none_token_send (
 	struct iovec *iovec,
 	unsigned int iov_len);	
 
-static void none_recv_flush (
-	struct totemrrp_instance *instance);
-
 static void none_send_flush (
 	struct totemrrp_instance *instance);
 
@@ -302,9 +296,6 @@ static void passive_token_send (
 	struct iovec *iovec,
 	unsigned int iov_len);	
 
-static void passive_recv_flush (
-	struct totemrrp_instance *instance);
-
 static void passive_send_flush (
 	struct totemrrp_instance *instance);
 
@@ -360,9 +351,6 @@ static void active_token_send (
 	struct iovec *iovec,
 	unsigned int iov_len);	
 
-static void active_recv_flush (
-	struct totemrrp_instance *instance);
-
 static void active_send_flush (
 	struct totemrrp_instance *instance);
 
@@ -401,7 +389,6 @@ struct rrp_algo none_algo = {
 	.mcast_flush_send	= none_mcast_flush_send,
 	.token_recv		= none_token_recv,
 	.token_send		= none_token_send,
-	.recv_flush		= none_recv_flush,
 	.send_flush		= none_send_flush,
 	.iface_check		= none_iface_check,
 	.processor_count_set	= none_processor_count_set,
@@ -417,7 +404,6 @@ struct rrp_algo passive_algo = {
 	.mcast_flush_send	= passive_mcast_flush_send,
 	.token_recv		= passive_token_recv,
 	.token_send		= passive_token_send,
-	.recv_flush		= passive_recv_flush,
 	.send_flush		= passive_send_flush,
 	.iface_check		= passive_iface_check,
 	.processor_count_set	= passive_processor_count_set,
@@ -433,7 +419,6 @@ struct rrp_algo active_algo = {
 	.mcast_flush_send	= active_mcast_flush_send,
 	.token_recv		= active_token_recv,
 	.token_send		= active_token_send,
-	.recv_flush		= active_recv_flush,
 	.send_flush		= active_send_flush,
 	.iface_check		= active_iface_check,
 	.processor_count_set	= active_processor_count_set,
@@ -519,11 +504,6 @@ static void none_token_send (
 		iovec, iov_len);
 }
 
-static void none_recv_flush (struct totemrrp_instance *instance)
-{
-	totemnet_recv_flush (instance->net_handles[0]);
-}
-
 static void none_send_flush (struct totemrrp_instance *instance)
 {
 	totemnet_send_flush (instance->net_handles[0]);
@@ -822,19 +802,6 @@ static void passive_token_send (
 
 }
 
-static void passive_recv_flush (struct totemrrp_instance *instance)
-{
-	struct passive_instance *rrp_algo_instance = (struct passive_instance *)instance->rrp_algo_instance;
-	unsigned int i;
-
-	for (i = 0; i < instance->interface_count; i++) {
-		if (rrp_algo_instance->faulty[i] == 0) {
-
-			totemnet_recv_flush (instance->net_handles[i]);
-		}
-	}
-}
-
 static void passive_send_flush (struct totemrrp_instance *instance)
 {
 	struct passive_instance *rrp_algo_instance = (struct passive_instance *)instance->rrp_algo_instance;
@@ -1173,19 +1140,6 @@ static void active_token_send (
 	}
 }
 
-static void active_recv_flush (struct totemrrp_instance *instance)
-{
-	struct active_instance *rrp_algo_instance = (struct active_instance *)instance->rrp_algo_instance;
-	unsigned int i;
-
-	for (i = 0; i < instance->interface_count; i++) {
-		if (rrp_algo_instance->faulty[i] == 0) {
-
-			totemnet_recv_flush (instance->net_handles[i]);
-		}
-	}
-}
-
 static void active_send_flush (struct totemrrp_instance *instance)
 {
 	struct active_instance *rrp_algo_instance = (struct active_instance *)instance->rrp_algo_instance;
@@ -1526,25 +1480,6 @@ int totemrrp_token_target_set (
 error_exit:
 	return (res);
 }
-int totemrrp_recv_flush (totemrrp_handle handle)
-{
-	struct totemrrp_instance *instance;
-	int res = 0;
-
-	res = hdb_handle_get (&totemrrp_instance_database, handle,
-		(void *)&instance);
-	if (res != 0) {
-		res = ENOENT;
-		goto error_exit;
-	}
-
-	instance->rrp_algo->recv_flush (instance);
-
-	hdb_handle_put (&totemrrp_instance_database, handle);
-
-error_exit:
-	return (res);
-}
 
 int totemrrp_send_flush (totemrrp_handle handle)
 {
diff --git a/branches/whitetank/exec/totemrrp.h b/branches/whitetank/exec/totemrrp.h
index fad81d7..24f70e7 100644
--- a/branches/whitetank/exec/totemrrp.h
+++ b/branches/whitetank/exec/totemrrp.h
@@ -97,8 +97,6 @@ extern int totemrrp_mcast_flush_send (
 	struct iovec *iovec,
 	unsigned int iov_len);
 
-extern int totemrrp_recv_flush (totemrrp_handle handle);
-
 extern int totemrrp_send_flush (totemrrp_handle handle);
 
 extern int totemrrp_token_target_set (
diff --git a/branches/whitetank/exec/totemsrp.c b/branches/whitetank/exec/totemsrp.c
index 9fe79e7..4d6ee9e 100644
--- a/branches/whitetank/exec/totemsrp.c
+++ b/branches/whitetank/exec/totemsrp.c
@@ -3332,8 +3332,6 @@ static int message_handler_orf_token (
 	}
 #endif
 
-	totemrrp_recv_flush (instance->totemrrp_handle);
-
 	/*
 	 * Determine if we should hold (in reality drop) the token
 	 */
-- 
1.7.3.4



More information about the Openais mailing list