diff --git a/arch/s390/mm/pgalloc.c b/arch/s390/mm/pgalloc.c
index 0f68b7257e08def113fa1633439028bb1f4b4966..66ab68db98428cfeec1e5fb10b6a13f4288230d3 100644
--- a/arch/s390/mm/pgalloc.c
+++ b/arch/s390/mm/pgalloc.c
@@ -133,13 +133,7 @@ int crst_table_upgrade(struct mm_struct *mm, unsigned long end)
 
 static inline unsigned int atomic_xor_bits(atomic_t *v, unsigned int bits)
 {
-	unsigned int old, new;
-
-	do {
-		old = atomic_read(v);
-		new = old ^ bits;
-	} while (atomic_cmpxchg(v, old, new) != old);
-	return new;
+	return atomic_fetch_xor(bits, v) ^ bits;
 }
 
 #ifdef CONFIG_PGSTE