qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v1 08/22] cpu: Add per-cpu address space


From: Edgar E. Iglesias
Subject: Re: [Qemu-devel] [PATCH v1 08/22] cpu: Add per-cpu address space
Date: Tue, 17 Dec 2013 10:34:24 +1000
User-agent: Mutt/1.5.21 (2010-09-15)

On Mon, Dec 16, 2013 at 01:11:47PM +0100, Andreas Färber wrote:
> Am 16.12.2013 09:05, schrieb address@hidden:
> > From: "Edgar E. Iglesias" <address@hidden>
> > 
> > Signed-off-by: Edgar E. Iglesias <address@hidden>
> > ---
> >  cputlb.c                        |    4 ++--
> >  exec.c                          |   31 +++++++++++++++++++++++--------
> >  include/exec/cpu-defs.h         |    3 +++
> >  include/exec/exec-all.h         |    1 +
> >  include/exec/softmmu_template.h |    4 ++--
> >  include/qom/cpu.h               |    2 ++
> >  6 files changed, 33 insertions(+), 12 deletions(-)
> [...]
> > diff --git a/exec.c b/exec.c
> > index 803bbde..edb6a43 100644
> > --- a/exec.c
> > +++ b/exec.c
> > @@ -136,6 +136,7 @@ typedef struct subpage_t {
> >  
> >  static void io_mem_init(void);
> >  static void memory_map_init(void);
> > +static void tcg_commit(MemoryListener *listener);
> >  
> >  static MemoryRegion io_mem_watch;
> >  #endif
> > @@ -434,6 +435,25 @@ CPUState *qemu_get_cpu(int index)
> >      return NULL;
> >  }
> >  
> > +#if !defined(CONFIG_USER_ONLY)
> > +void cpu_address_space_init(CPUState *cpu, AddressSpace *as)
> > +{
> > +    CPUArchState *env = cpu->env_ptr;
> > +
> > +    if (tcg_enabled()) {
> > +        if (cpu->tcg_as_listener) {
> > +            memory_listener_unregister(cpu->tcg_as_listener);
> > +        } else {
> > +            cpu->tcg_as_listener = g_new0(MemoryListener, 1);
> > +        }
> > +        cpu->tcg_as_listener->commit = tcg_commit;
> > +        memory_listener_register(cpu->tcg_as_listener, as);
> > +    }
> > +
> > +    env->as = as;
> > +}
> > +#endif
> > +
> >  void cpu_exec_init(CPUArchState *env)
> >  {
> >      CPUState *cpu = ENV_GET_CPU(env);
> > @@ -453,6 +473,7 @@ void cpu_exec_init(CPUArchState *env)
> >      QTAILQ_INIT(&env->breakpoints);
> >      QTAILQ_INIT(&env->watchpoints);
> >  #ifndef CONFIG_USER_ONLY
> > +    cpu_address_space_init(cpu, &address_space_memory);
> >      cpu->thread_id = qemu_get_thread_id();
> >  #endif
> >      QTAILQ_INSERT_TAIL(&cpus, cpu, node);
> > @@ -482,9 +503,10 @@ static void breakpoint_invalidate(CPUState *cpu, 
> > target_ulong pc)
> >  #else
> >  static void breakpoint_invalidate(CPUState *cpu, target_ulong pc)
> >  {
> > +    CPUArchState *env = cpu->env_ptr;
> >      hwaddr phys = cpu_get_phys_page_debug(cpu, pc);
> >      if (phys != -1) {
> > -        tb_invalidate_phys_addr(&address_space_memory,
> > +        tb_invalidate_phys_addr(env->as,
> >                                  phys | (pc & ~TARGET_PAGE_MASK));
> >      }
> >  }
> [...]
> > diff --git a/include/exec/cpu-defs.h b/include/exec/cpu-defs.h
> > index 01cd8c7..406b36c 100644
> > --- a/include/exec/cpu-defs.h
> > +++ b/include/exec/cpu-defs.h
> > @@ -176,6 +176,9 @@ typedef struct CPUWatchpoint {
> >      sigjmp_buf jmp_env;                                                 \
> >      int exception_index;                                                \
> >                                                                          \
> > +    /* Per CPU address-space.  */                                       \
> > +    AddressSpace *as;                                                   \
> 
> Why are you adding this field here rather than in CPUState alongside the
> other field? This being a pointer I can't imagine problems for
> non-softmmu, and I had posted patches a while ago to move the
> surrounding fields there. Having it in CPUState would avoid some of the
> env_ptr accesses above, which were supposed to be an interim solution only.


Hi,

This was discussed when I posted the RFC. My first try had this member in
CPUState but some of the hot paths for mmio accesses needed to do
ENV_GET_CPU() to get hold of the CS and AS. ENV_GET_CPU does a runtime type
check that would slow things down. That's the reason I moved it to env.

I'm not against moving the field back if it doesnt cost too much. Maybe we
should consider removing the CPU() around ENV_GET_CPU()?

See:
http://lists.gnu.org/archive/html/qemu-devel/2013-11/msg02889.html

Cheers,
Edgar



reply via email to

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