> On Wed, 2007-08-01 at 16:02 +1000, Michael Neuling wrote: > > We sometimes change the vmalloc segment in slb_flush_and_rebolt but we > > never updated with slb shadow buffer. This fixes it. Thanks to paulus > > for finding this. > > > > Also added some write barriers to ensure the shadow buffer is always > > valid. > > The shadow is global or per-cpu ? > > Because in the later case, I think you need more than that.
It's per CPU. > > @@ -759,6 +762,9 @@ int hash_page(unsigned long ea, unsigned > > mmu_psize_defs[mmu_vmalloc_psize].sllp) { > > get_paca()->vmalloc_sllp = > > mmu_psize_defs[mmu_vmalloc_psize].sllp; > > + vflags = SLB_VSID_KERNEL | > > + mmu_psize_defs[mmu_vmalloc_psize].sllp; > > + slb_shadow_update(VMALLOC_START, vflags, 1); > > slb_flush_and_rebolt(); > > } > > Later on: > > } else if (get_paca()->vmalloc_sllp != > mmu_psize_defs[mmu_vmalloc_psize].sllp) { > get_paca()->vmalloc_sllp = > mmu_psize_defs[mmu_vmalloc_psize].sllp; > slb_flush_and_rebolt(); > } > > If your shadow is per-cpu, you need to fix that up too. I'm confused... isn't that the same section of code? > I'm tempted to think you should just expose an slb_vmalloc_update() > from slb.c that does the shadow update and calls flush_and_rebolt. > That would also get rid of your ifdef on vflags definition (which > wasn't necessary in the first place if you had put it inside the > if statement anyway). OK, I'll create an slb_vmalloc_update for the next rev. Mikey _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev