diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c
index 1b6e127..31c7924 100644
--- a/arch/powerpc/mm/hash_utils_64.c
+++ b/arch/powerpc/mm/hash_utils_64.c
@@ -1231,11 +1231,28 @@ static void kernel_map_linear_page(unsigned long vaddr, unsigned long lmi)
 	int ret;
 
 	hash = hpt_hash(vpn, PAGE_SHIFT, mmu_kernel_ssize);
+
+repeat:
 	hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP);
 
 	ret = ppc_md.hpte_insert(hpteg, vpn, __pa(vaddr),
 				 mode, HPTE_V_BOLTED,
 				 mmu_linear_psize, mmu_kernel_ssize);
+
+	if (unlikely(ret == -1)) {
+		hpteg = (~hash & htab_hash_mask) * HPTES_PER_GROUP;
+		ret = ppc_md.hpte_insert(hpteg, vpn, __pa(vaddr), mode,
+					 HPTE_V_SECONDARY,
+					 mmu_linear_psize, mmu_kernel_ssize);
+		if (ret == -1) {
+			if (mftb() & 0x1)
+				hpteg = (hash & htab_hash_mask) *
+					 HPTES_PER_GROUP;
+			ppc_md.hpte_remove(hpteg);
+			goto repeat;
+		}
+	}
+
 	BUG_ON (ret < 0);
 	spin_lock(&linear_map_hash_lock);
 	BUG_ON(linear_map_hash_slots[lmi] & 0x80);
