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-devel

[Xen-devel] [PATCH][XEN] Use a union to pack the dual-short combos in an

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH][XEN] Use a union to pack the dual-short combos in an endian neutral way.
From: Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
Date: Fri, 11 Aug 2006 12:36:02 -0400
Delivery-date: Fri, 11 Aug 2006 09:36:27 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
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.

Signed-off-by: Jimi Xenidis <jimix@xxxxxxxxxxxxxx>


diff -r 1f611b58729f 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:29:48 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-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>