WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-ppc-devel

[XenPPC] [xenppc-unstable] [XEN] Use a union to pack the dual-short comb

To: xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
Subject: [XenPPC] [xenppc-unstable] [XEN] Use a union to pack the dual-short combos in an endian neutral way.
From: Xen patchbot-xenppc-unstable <patchbot-xenppc-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Fri, 11 Aug 2006 17:30:45 +0000
Delivery-date: Fri, 11 Aug 2006 10:38:47 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-ppc-devel-request@lists.xensource.com?subject=help>
List-id: Xen PPC development <xen-ppc-devel.lists.xensource.com>
List-post: <mailto:xen-ppc-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ppc-devel>, <mailto:xen-ppc-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ppc-devel>, <mailto:xen-ppc-devel-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-ppc-devel-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
# Node ID 473956fd6dd13008a222f2098c6affebfad5c547
# Parent  1f611b58729f92845fbea22ae0d273d63940cbb8
[XEN] Use a union to pack the dual-short combos in an endian neutral way.

The first to members of a grant entry are updated as a combined pair.
The following union patch uses a union so updated can happen in an
endian neutral fashion.

Patch submitted updstream.

Signed-off-by: Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
---
 xen/common/grant_table.c |   56 +++++++++++++++++++++++++++++------------------
 1 files changed, 35 insertions(+), 21 deletions(-)

diff -r 1f611b58729f -r 473956fd6dd1 xen/common/grant_table.c
--- a/xen/common/grant_table.c  Wed Aug 09 18:53:00 2006 -0400
+++ b/xen/common/grant_table.c  Fri Aug 11 12:39:04 2006 -0400
@@ -32,6 +32,17 @@
 #include <xen/guest_access.h>
 #include <acm/acm_hooks.h>
 
+/* The first to members of a grant entry are updated as a combined
+ * pair.  The following union allows that to happen in an endian
+ * neutral fashion. */
+union grant_combo {
+    uint32_t word;
+    struct {
+        uint16_t flags;
+        domid_t  domid;
+    } shorts;
+};
+
 #define PIN_FAIL(_lbl, _rc, _f, _a...)          \
     do {                                        \
         DPRINTK( _f, ## _a );                   \
@@ -177,7 +188,7 @@ __gnttab_map_grant_ref(
          */
         for ( ; ; )
         {
-            u32 scombo, prev_scombo, new_scombo;
+            union grant_combo scombo, prev_scombo, new_scombo;
 
             if ( unlikely((sflags & GTF_type_mask) != GTF_permit_access) ||
                  unlikely(sdom != led->domain->domain_id) )
@@ -186,22 +197,25 @@ __gnttab_map_grant_ref(
                          sflags, sdom, led->domain->domain_id);
 
             /* Merge two 16-bit values into a 32-bit combined update. */
-            /* NB. Endianness! */
-            scombo = ((u32)sdom << 16) | (u32)sflags;
-
-            new_scombo = scombo | GTF_reading;
+            scombo.shorts.flags = sflags;
+            scombo.shorts.domid = sdom;
+            
+            new_scombo = scombo;
+            new_scombo.shorts.flags |= GTF_reading;
+
             if ( !(op->flags & GNTMAP_readonly) )
             {
-                new_scombo |= GTF_writing;
+                new_scombo.shorts.flags |= GTF_writing;
                 if ( unlikely(sflags & GTF_readonly) )
                     PIN_FAIL(unlock_out, GNTST_general_error,
                              "Attempt to write-pin a r/o grant entry.\n");
             }
 
-            prev_scombo = cmpxchg((u32 *)&sha->flags, scombo, new_scombo);
+            prev_scombo.word = cmpxchg((u32 *)&sha->flags,
+                                       scombo.word, new_scombo.word);
 
             /* Did the combined update work (did we see what we expected?). */
-            if ( likely(prev_scombo == scombo) )
+            if ( likely(prev_scombo.word == scombo.word) )
                 break;
 
             if ( retries++ == 4 )
@@ -209,9 +223,8 @@ __gnttab_map_grant_ref(
                          "Shared grant entry is unstable.\n");
 
             /* Didn't see what we expected. Split out the seen flags & dom. */
-            /* NB. Endianness! */
-            sflags = (u16)prev_scombo;
-            sdom   = (u16)(prev_scombo >> 16);
+            sflags = prev_scombo.shorts.flags;
+            sdom   = prev_scombo.shorts.domid;
         }
 
         if ( !act->pin )
@@ -532,7 +545,7 @@ gnttab_prepare_for_transfer(
     struct grant_entry *sha;
     domid_t             sdom;
     u16                 sflags;
-    u32                 scombo, prev_scombo;
+    union grant_combo   scombo, prev_scombo, tmp_scombo;
     int                 retries = 0;
 
     if ( unlikely((rgt = rd->grant_table) == NULL) ||
@@ -561,14 +574,16 @@ gnttab_prepare_for_transfer(
         }
 
         /* Merge two 16-bit values into a 32-bit combined update. */
-        /* NB. Endianness! */
-        scombo = ((u32)sdom << 16) | (u32)sflags;
-
-        prev_scombo = cmpxchg((u32 *)&sha->flags, scombo,
-                              scombo | GTF_transfer_committed);
+        scombo.shorts.flags = sflags;
+        scombo.shorts.domid = sdom;
+
+        tmp_scombo = scombo;
+        tmp_scombo.shorts.flags |= GTF_transfer_committed;
+        prev_scombo.word = cmpxchg((u32 *)&sha->flags,
+                                   scombo.word, tmp_scombo.word);
 
         /* Did the combined update work (did we see what we expected?). */
-        if ( likely(prev_scombo == scombo) )
+        if ( likely(prev_scombo.word == scombo.word) )
             break;
 
         if ( retries++ == 4 )
@@ -578,9 +593,8 @@ gnttab_prepare_for_transfer(
         }
 
         /* Didn't see what we expected. Split out the seen flags & dom. */
-        /* NB. Endianness! */
-        sflags = (u16)prev_scombo;
-        sdom   = (u16)(prev_scombo >> 16);
+        sflags = prev_scombo.shorts.flags;
+        sdom   = prev_scombo.shorts.domid;
     }
 
     spin_unlock(&rgt->lock);

_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel

<Prev in Thread] Current Thread [Next in Thread>
  • [XenPPC] [xenppc-unstable] [XEN] Use a union to pack the dual-short combos in an endian neutral way., Xen patchbot-xenppc-unstable <=