X86 processors are able to handle unaligned memory access. Improve
performance by using that feature on i386 and x86_64 compatible
processors, and use old aligning code on different processors.
---
 exec/totempg.c |   35 ++++++++++++++++++++++++++---------
 1 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/exec/totempg.c b/exec/totempg.c
index 9188958..116e5d8 100644
--- a/exec/totempg.c
+++ b/exec/totempg.c
@@ -115,6 +115,12 @@ struct totempg_mcast_header {
        short type;
 };
 
+#if !(defined(__i386__) || defined(__x86_64__))
+/*
+ * Need align on architectures different then i386 or x86_64
+ */
+#define TOTEMPG_NEED_ALIGN 1
+#endif
 
 /*
  * totempg_mcast structure
@@ -374,8 +380,9 @@ static inline void group_endian_convert (
        int i;
        char *aligned_msg;
 
+#ifdef TOTEMPG_NEED_ALIGN
        /*
-        * Align data structure for sparc and ia64
+        * Align data structure for not i386 or x86_64
         */
        if ((size_t)msg % 4 != 0) {
                aligned_msg = alloca(msg_len);
@@ -383,6 +390,9 @@ static inline void group_endian_convert (
        } else {
                aligned_msg = msg;
        }
+#else
+       aligned_msg = msg;
+#endif
 
        group_len = (unsigned short *)aligned_msg;
        group_len[0] = swab16(group_len[0]);
@@ -406,12 +416,15 @@ static inline int group_matches (
        char *group_name;
        int i;
        int j;
+#ifdef TOTEMPG_NEED_ALIGN
         struct iovec iovec_aligned = { NULL, 0 };
+#endif
 
        assert (iov_len == 1);
 
+#ifdef TOTEMPG_NEED_ALIGN
        /*
-        * Align data structure for sparc and ia64
+        * Align data structure for not i386 or x86_64
         */
        if ((size_t)iovec->iov_base % 4 != 0) {
                iovec_aligned.iov_base = alloca(iovec->iov_len);
@@ -419,7 +432,7 @@ static inline int group_matches (
                iovec_aligned.iov_len = iovec->iov_len;
                iovec = &iovec_aligned;
        }
-
+#endif
 
        group_len = (unsigned short *)iovec->iov_base;
        group_name = ((char *)iovec->iov_base) +
@@ -469,15 +482,18 @@ static inline void app_deliver_fn (
                group_endian_convert (msg, msg_len);
        }
 
-/*
- * TODO This function needs to be rewritten for proper alignment to avoid 3+ 
memory copies
- */
+#ifdef TOTEMPG_NEED_ALIGN
        /*
-        * Align data structure for sparc and ia64
+        * Align data structure for not i386 or x86_64
         */
        aligned_iovec.iov_base = alloca(msg_len);
        aligned_iovec.iov_len = msg_len;
        memcpy(aligned_iovec.iov_base, msg, msg_len);
+#else
+       aligned_iovec.iov_base = msg;
+       aligned_iovec.iov_len = msg_len;
+#endif
+
        iovec = &aligned_iovec;
 
        for (i = 0; i <= totempg_max_handle; i++) {
@@ -489,8 +505,9 @@ static inline void app_deliver_fn (
                                stripped_iovec.iov_len = iovec->iov_len - 
adjust_iovec;
                                stripped_iovec.iov_base = (char 
*)iovec->iov_base + adjust_iovec;
 
+#ifdef TOTEMPG_NEED_ALIGN
                                /*
-                                * Align data structure for sparc and ia64
+                                * Align data structure for not i386 or x86_64
                                 */
                                if ((char *)iovec->iov_base + adjust_iovec % 4 
!= 0) {
                                        /*
@@ -502,7 +519,7 @@ static inline void app_deliver_fn (
                                                 (char *)iovec->iov_base + 
adjust_iovec,
                                                stripped_iovec.iov_len);
                                }
-
+#endif
                                instance->deliver_fn (
                                        nodeid,
                                        stripped_iovec.iov_base,
-- 
1.7.1

_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to