Use explicit accessors to handle unusually-sized atomic operations in grant table...
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Fri, 30 Jun 2006 09:10:39 +0000 (10:10 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Fri, 30 Jun 2006 09:10:39 +0000 (10:10 +0100)
Signed-off-by: Hollis Blanchard <hollisb@us.ibm.com>
linux-2.6-xen-sparse/drivers/xen/core/gnttab.c
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/synch_bitops.h
linux-2.6-xen-sparse/include/asm-ia64/synch_bitops.h
xen/common/grant_table.c
xen/include/asm-ia64/grant_table.h
xen/include/asm-x86/grant_table.h

index 8ec655e7eeba0ff284fda6fefc76c512afc6da70..a8dc7121099754bf09675f07826fa787ec615930 100644 (file)
@@ -169,7 +169,7 @@ int gnttab_end_foreign_access_ref(grant_ref_t ref, int readonly)
                        printk(KERN_ALERT "WARNING: g.e. still in use!\n");
                        return 0;
                }
-       } while ((nflags = synch_cmpxchg(&shared[ref].flags, flags, 0)) !=
+       } while ((nflags = synch_cmpxchg_subword(&shared[ref].flags, flags, 0)) !=
                 flags);
 
        return 1;
@@ -224,7 +224,7 @@ unsigned long gnttab_end_foreign_transfer_ref(grant_ref_t ref)
         * reference and return failure (== 0).
         */
        while (!((flags = shared[ref].flags) & GTF_transfer_committed)) {
-               if (synch_cmpxchg(&shared[ref].flags, flags, 0) == flags)
+               if (synch_cmpxchg_subword(&shared[ref].flags, flags, 0) == flags)
                        return 0;
                cpu_relax();
        }
index c6eb88bc74b9a19ec69256559447db1158d2a45c..6a4e5e45080ae567083b24cfc196f45fe84d6628 100644 (file)
@@ -138,4 +138,6 @@ static __inline__ int synch_var_test_bit(int nr, volatile void * addr)
  synch_const_test_bit((nr),(addr)) : \
  synch_var_test_bit((nr),(addr)))
 
+#define synch_cmpxchg_subword synch_cmpxchg
+
 #endif /* __XEN_SYNCH_BITOPS_H__ */
index ee1330659cb419079f0364da96a643ff2fd79931..6c01cf8b7e0b62fa9df641dac7ad6d2a77de2cd1 100644 (file)
@@ -58,4 +58,6 @@ static __inline__ int synch_var_test_bit(int nr, volatile void * addr)
  synch_const_test_bit((nr),(addr)) : \
  synch_var_test_bit((nr),(addr)))
 
+#define synch_cmpxchg_subword synch_cmpxchg
+
 #endif /* __XEN_SYNCH_BITOPS_H__ */
index 4a36c41d8f83a25ef19526e64035b6efc67018a7..d951c9388f5f591845dfab17f85f1bd1943ac9e3 100644 (file)
@@ -287,10 +287,10 @@ __gnttab_map_grant_ref(
 
     if ( !(op->flags & GNTMAP_readonly) &&
          !(act->pin & (GNTPIN_hstw_mask|GNTPIN_devw_mask)) )
-        clear_bit(_GTF_writing, &sha->flags);
+        gnttab_clear_flag(_GTF_writing, &sha->flags);
 
     if ( !act->pin )
-        clear_bit(_GTF_reading, &sha->flags);
+        gnttab_clear_flag(_GTF_reading, &sha->flags);
 
  unlock_out:
     spin_unlock(&rd->grant_table->lock);
@@ -425,10 +425,10 @@ __gnttab_unmap_grant_ref(
 
     if ( ((act->pin & (GNTPIN_devw_mask|GNTPIN_hstw_mask)) == 0) &&
          !(flags & GNTMAP_readonly) )
-        clear_bit(_GTF_writing, &sha->flags);
+        gnttab_clear_flag(_GTF_writing, &sha->flags);
 
     if ( act->pin == 0 )
-        clear_bit(_GTF_reading, &sha->flags);
+        gnttab_clear_flag(_GTF_reading, &sha->flags);
 
  unmap_out:
     op->status = rc;
@@ -889,11 +889,11 @@ gnttab_release_mappings(
             }
 
             if ( (act->pin & (GNTPIN_devw_mask|GNTPIN_hstw_mask)) == 0 )
-                clear_bit(_GTF_writing, &sha->flags);
+                gnttab_clear_flag(_GTF_writing, &sha->flags);
         }
 
         if ( act->pin == 0 )
-            clear_bit(_GTF_reading, &sha->flags);
+            gnttab_clear_flag(_GTF_reading, &sha->flags);
 
         spin_unlock(&rd->grant_table->lock);
 
index 40dc7de8ece51728c9b2a829a64a955363fc541e..d020dfbc8c0446cc7aa40378baa86c7e8ca32bed 100644 (file)
@@ -55,4 +55,9 @@ void guest_physmap_add_page(struct domain *d, unsigned long gpfn, unsigned long
 
 #define gnttab_log_dirty(d, f) ((void)0)
 
+static inline void gnttab_clear_flag(unsigned long nr, uint16_t *addr)
+{
+       clear_bit(nr, addr);
+}
+
 #endif /* __ASM_GRANT_TABLE_H__ */
index 57885e81da8044875a822cda53fb80b65cef1c19..5c6600ac7e123861d32e311ccec6b5ae963287d2 100644 (file)
@@ -33,4 +33,9 @@ int destroy_grant_host_mapping(
 
 #define gnttab_log_dirty(d, f) mark_dirty((d), (f))
 
+static inline void gnttab_clear_flag(unsigned long nr, uint16_t *addr)
+{
+       clear_bit(nr, addr);
+}
+
 #endif /* __ASM_GRANT_TABLE_H__ */