On Fri, Mar 09, 2018 at 01:18:40PM +0000, Andrew Cooper wrote: > The only relevent initialisation for the idle domain is the context switch and ^ relevant > poisoned pointers. Collect these bits together early in the function and exit > when complete (although as a consequence, the e820 and vtsc lock > initialisation are moved forwards). This allows us to remove subsequent > is_idle_domain() checks and unindent most of the logic. > > Furthermore, we no longer call these functions for the idle domain: > * mapcache_domain_init() and tsc_set_info() were previously guarded against > the idle domain, and have had their guards turned into ASSERT()s. > * pit_init() is implicitly guarded by has_vpit(). > * psr_domain_init() no longer allocates a socket array. > > Finally, two changes are introduced for the benefit of the following patch: > * For PV hardware domains, or XEN_X86_EMU_PIT into emflags rather than into > config->emulation_flags, to facilitating config becoming const. > * References to domcr_flags are moved until after the idle early exist, to ^ exit > facilitiate them being unavailable for system domains. > > No practical change in behaviour. > > Signed-off-by: Andrew Cooper <andrew.coop...@citrix.com>
Reviewed-by: Roger Pau Monné <roger....@citrix.com> > --- > CC: Jan Beulich <jbeul...@suse.com> > CC: Wei Liu <wei.l...@citrix.com> > CC: Roger Pau Monné <roger....@citrix.com> > --- > xen/arch/x86/domain.c | 152 > ++++++++++++++++++++++----------------------- > xen/arch/x86/domain_page.c | 3 +- > xen/arch/x86/time.c | 4 +- > 3 files changed, 78 insertions(+), 81 deletions(-) > > diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c > index 81ee992..48dc2b9 100644 > --- a/xen/arch/x86/domain.c > +++ b/xen/arch/x86/domain.c > @@ -430,20 +430,37 @@ int arch_domain_create(struct domain *d, unsigned int > domcr_flags, > struct xen_arch_domainconfig *config) > { > bool paging_initialised = false; > + uint32_t emflags; > int rc; > > - if ( config == NULL && !is_idle_domain(d) ) > - return -EINVAL; > - > - d->arch.s3_integrity = domcr_flags & XEN_DOMCTL_CDF_s3_integrity; > - > INIT_LIST_HEAD(&d->arch.pdev_list); > > d->arch.relmem = RELMEM_not_started; > INIT_PAGE_LIST_HEAD(&d->arch.relmem_list); > > - if ( d->domain_id && !is_idle_domain(d) && > - cpu_has_amd_erratum(&boot_cpu_data, AMD_ERRATUM_121) ) > + spin_lock_init(&d->arch.e820_lock); > + spin_lock_init(&d->arch.vtsc_lock); > + > + /* Minimal initialisation for the idle domain. */ > + if ( unlikely(is_idle_domain(d)) ) > + { > + static const struct arch_csw idle_csw = { > + .from = paravirt_ctxt_switch_from, > + .to = paravirt_ctxt_switch_to, > + .tail = continue_idle_domain, > + }; > + > + d->arch.ctxt_switch = &idle_csw; > + > + d->arch.cpuid = ZERO_BLOCK_PTR; /* Catch stray misuses. */ > + d->arch.msr = ZERO_BLOCK_PTR; > + > + return 0; > + } > + else if ( !config ) Unneeded else. Thanks, Roger. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel