/* Functions for creating and updating partition table on POWER9 */
 extern void mmu_partition_table_init(void);
 extern void mmu_partition_table_set_entry(unsigned int lpid, unsigned long dw0,
-                                         unsigned long dw1);
+                                         unsigned long dw1, bool flush);
 #endif /* CONFIG_PPC64 */
 
 struct mm_struct;
 
 void kvmhv_set_ptbl_entry(unsigned int lpid, u64 dw0, u64 dw1)
 {
        if (!kvmhv_on_pseries()) {
-               mmu_partition_table_set_entry(lpid, dw0, dw1);
+               mmu_partition_table_set_entry(lpid, dw0, dw1, true);
                return;
        }
 
 
         * For now, UPRT is 0 and we have no segment table.
         */
        htab_size =  __ilog2(htab_size) - 18;
-       mmu_partition_table_set_entry(0, hash_table | htab_size, 0);
+       mmu_partition_table_set_entry(0, hash_table | htab_size, 0, true);
        pr_info("Partition table %p\n", partition_tb);
 }
 
 
 }
 
 void mmu_partition_table_set_entry(unsigned int lpid, unsigned long dw0,
-                                 unsigned long dw1)
+                                 unsigned long dw1, bool flush)
 {
        unsigned long old = be64_to_cpu(partition_tb[lpid].patb0);
 
                uv_register_pate(lpid, dw0, dw1);
                pr_info("PATE registered by ultravisor: dw0 = 0x%lx, dw1 = 0x%lx\n",
                        dw0, dw1);
-       } else {
+       } else if (flush) {
                flush_partition(lpid, (old & PATB_HR));
        }
 }
 
        rts_field = radix__get_tree_size();
        dw0 = rts_field | __pa(init_mm.pgd) | RADIX_PGD_INDEX_SIZE | PATB_HR;
        dw1 = __pa(process_tb) | (PRTB_SIZE_SHIFT - 12) | PATB_GR;
-       mmu_partition_table_set_entry(0, dw0, dw1);
+       mmu_partition_table_set_entry(0, dw0, dw1, true);
 
        asm volatile("ptesync" : : : "memory");
        asm volatile(PPC_TLBIE_5(%0,%1,2,1,1) : :