Re: [PATCH 01/14] KVM: PPC: e500: don't translate gfn to pfn with

Avi Kivity
2011-11-01T09:00:31Z

On 10/31/2011 08:52 PM, Scott Wood wrote:
> On 10/31/2011 07:50 AM, Avi Kivity wrote:
> > On 10/31/2011 09:53 AM, Alexander Graf wrote:
> >> +/* sesel is index into the set, not the whole array */
> >> +static void write_stlbe(struct kvmppc_vcpu_e500 *vcpu_e500,
> >> + struct tlbe *gtlbe,
> >> + struct tlbe *stlbe,
> >> + int stlbsel, int sesel)
> >> +{
> >> + int stid;
> >> +
> >> + preempt_disable();
> >> + stid = kvmppc_e500_get_sid(vcpu_e500, get_tlb_ts(gtlbe),
> >> + get_tlb_tid(gtlbe),
> >> + get_cur_pr(&vcpu_e500->vcpu), 0);
> >> +
> >> + stlbe->mas1 |= MAS1_TID(stid);
> >> + write_host_tlbe(vcpu_e500, stlbsel, sesel, stlbe);
> >> + preempt_enable();
> >> +}
> >> +
> >>
> >
> > This naked preempt_disable() is fishy. What happens if we're migrated
> > immediately afterwards? we fault again and redo?
>
> Yes, we'll fault again.
>
> We just want to make sure that the sid is still valid when we write the
> TLB entry. If we migrate, we'll get a new sid and the old TLB entry
> will be irrelevant, even if we migrate back to the same CPU. The entire
> TLB will be flushed before a sid is reused.
>
> If we don't do the preempt_disable(), we could get the sid on one CPU
> and then get migrated and run it on another CPU where that sid is (or
> will be) valid for a different context. Or we could run out of sids
> while preempted, making the sid allocated before this possibly valid for
> a different context.
>
>

Makes sense, thanks.

--
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.