ret |= ((pmdval_t)*(tmp + 1)) << 32;
        }
 
-       return (pmd_t) { ret };
+       return (pmd_t) { .pmd = ret };
 }
 
 static inline void native_set_pte_atomic(pte_t *ptep, pte_t pte)
        ptep->pte_high = 0;
 }
 
-static inline void native_pmd_clear(pmd_t *pmd)
+static inline void native_pmd_clear(pmd_t *pmdp)
 {
-       u32 *tmp = (u32 *)pmd;
-       *tmp = 0;
+       pmdp->pmd_low = 0;
        smp_wmb();
-       *(tmp + 1) = 0;
+       pmdp->pmd_high = 0;
 }
 
 static inline void native_pud_clear(pud_t *pudp)
 #define native_ptep_get_and_clear(xp) native_local_ptep_get_and_clear(xp)
 #endif
 
-union split_pmd {
-       struct {
-               u32 pmd_low;
-               u32 pmd_high;
-       };
-       pmd_t pmd;
-};
-
 #ifdef CONFIG_SMP
 static inline pmd_t native_pmdp_get_and_clear(pmd_t *pmdp)
 {
-       union split_pmd res, *orig = (union split_pmd *)pmdp;
+       pmd_t res;
 
        /* xchg acts as a barrier before setting of the high bits */
-       res.pmd_low = xchg(&orig->pmd_low, 0);
-       res.pmd_high = orig->pmd_high;
-       orig->pmd_high = 0;
+       res.pmd_low = xchg(&pmdp->pmd_low, 0);
+       res.pmd_high = READ_ONCE(pmdp->pmd_high);
+       WRITE_ONCE(pmdp->pmd_high, 0);
 
-       return res.pmd;
+       return res;
 }
 #else
 #define native_pmdp_get_and_clear(xp) native_local_pmdp_get_and_clear(xp)
         * anybody.
         */
        if (!(pmd_val(pmd) & _PAGE_PRESENT)) {
-               union split_pmd old, new, *ptr;
-
-               ptr = (union split_pmd *)pmdp;
-
-               new.pmd = pmd;
-
                /* xchg acts as a barrier before setting of the high bits */
-               old.pmd_low = xchg(&ptr->pmd_low, new.pmd_low);
-               old.pmd_high = ptr->pmd_high;
-               ptr->pmd_high = new.pmd_high;
-               return old.pmd;
+               old.pmd_low = xchg(&pmdp->pmd_low, pmd.pmd_low);
+               old.pmd_high = READ_ONCE(pmdp->pmd_high);
+               WRITE_ONCE(pmdp->pmd_high, pmd.pmd_high);
+
+               return old;
        }
 
        do {