[PATCH] fixes for the SLB shadow buffer
Michael Neuling
mikey at neuling.org
Thu Aug 2 09:32:12 EST 2007
> 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
More information about the Linuxppc-dev
mailing list