qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2 3/3] target-ppc: tlbie should have global eff


From: David Gibson
Subject: Re: [Qemu-devel] [PATCH v2 3/3] target-ppc: tlbie should have global effect
Date: Mon, 12 Sep 2016 13:02:58 +1000
User-agent: Mutt/1.7.0 (2016-08-17)

On Sat, Sep 10, 2016 at 09:03:56AM +1000, Benjamin Herrenschmidt wrote:
> On Fri, 2016-09-09 at 18:44 +0530, Nikunj A Dadhania wrote:
> > +static inline void tlb_clear_flag(CPUState *cs)
> > +{
> > +    PowerPCCPU *cpu = POWERPC_CPU(cs);
> > +    CPUPPCState *env = &cpu->env;
> > +
> > +    env->tlb_need_flush = 0;
> > +}
> 
> What is the point of making this a separate function ?
> 
> Also I'm not 100% certain about the correctness of clearing
> TLB_NEED_GLOBAL_FLUSH on the "other" guy.
> 
> We could have the situation where:
> 
>       cpu 1:                                  cpu 2:
>       sets both                               ..
>       isync (clears local flush)              ..
>       <insert new translation>
>       ..                                      set both
>       ..                                      ..
>       ..                                      ..
>       ptesync (clears global flush)           .. (both gets cleared)
> 
> Now here, you can see that cpu2 never does a global flush and so the
> new translation inserted by cpu 1 is not cleared while architecturally
> it should be.
> 
> That being said, I doubt the above scenario can happen in practice,
> but I think it's safer if you only clear the local bit on the "other"
> CPUs.

I'll wait for a respin addressing these comments.

Please also add a cover letter on the next version.

> 
> >  static inline void check_tlb_flush(CPUPPCState *env, uint32_t
> > global)
> >  {
> >      CPUState *cs = CPU(ppc_env_get_cpu(env));
> > @@ -161,6 +169,17 @@ static inline void check_tlb_flush(CPUPPCState
> > *env, uint32_t global)
> >          tlb_flush(cs, 1);
> >          env->tlb_need_flush &= ~TLB_NEED_LOCAL_FLUSH;
> >      }
> > +
> > +    if (global && (env->tlb_need_flush & TLB_NEED_GLOBAL_FLUSH)) {
> > +        CPUState *other_cs;
> > +        CPU_FOREACH(other_cs) {
> > +            if (other_cs != cs) {
> > +                tlb_clear_flag(other_cs);
> > +                tlb_flush(other_cs, 1);
> > +            }
> > +        }
> > +        env->tlb_need_flush &= ~TLB_NEED_GLOBAL_FLUSH;
> > +    }
> >  }
> >  #else
> 

-- 
David Gibson                    | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
                                | _way_ _around_!
http://www.ozlabs.org/~dgibson

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]