On Tue Jul 22, 2025 at 4:45 PM CEST, Jan Beulich wrote: > On 17.07.2025 19:51, Alejandro Vallejo wrote: >> Make alloc_dom0_vcpu0() viable as a general vcpu0 allocator. Keep >> behaviour on any hwdom/ctldom identical to that dom0 used to have, and >> make non-dom0 have auto node affinity. >> >> Rename the function to alloc_dom_vcpu0() to reflect this change in >> scope, and move the prototype to asm/domain.h from xen/domain.h as it's >> only used in x86. > > Which makes we wonder what's really x86-specific about it. Yes, the use of > ...
Mostly that it's the only arch doing it. > >> --- a/xen/arch/x86/dom0_build.c >> +++ b/xen/arch/x86/dom0_build.c >> @@ -254,12 +254,16 @@ unsigned int __init dom0_max_vcpus(void) >> return max_vcpus; >> } >> >> -struct vcpu *__init alloc_dom0_vcpu0(struct domain *dom0) >> +struct vcpu *__init alloc_dom_vcpu0(struct domain *d) >> { >> - dom0->node_affinity = dom0_nodes; >> - dom0->auto_node_affinity = !dom0_nr_pxms; >> + d->auto_node_affinity = true; >> + if ( is_hardware_domain(d) || is_control_domain(d) ) >> + { >> + d->node_affinity = dom0_nodes; >> + d->auto_node_affinity = !dom0_nr_pxms; > > ... dom0_nr_pxms here perhaps is. Yet that could be sorted e.g. by making > this a function parameter. ARM doesn't dabble with affinities while allocating the first vcpu. It's a straight vcpu_create(). We could definitely inline setting that affinity setting and forego the function altogether. I'm not a big fan of functions with non-obvious side-effects, and this is one such case. > >> --- a/xen/arch/x86/include/asm/dom0_build.h >> +++ b/xen/arch/x86/include/asm/dom0_build.h >> @@ -23,6 +23,11 @@ unsigned long dom0_paging_pages(const struct domain *d, >> void dom0_update_physmap(bool compat, unsigned long pfn, >> unsigned long mfn, unsigned long vphysmap_s); >> >> +/* general domain construction */ > > Nit: Comment style. Ack > >> @@ -1054,9 +1055,11 @@ static struct domain *__init create_dom0(struct >> boot_info *bi) >> if ( IS_ERR(d) ) >> panic("Error creating d%u: %ld\n", bd->domid, PTR_ERR(d)); >> >> + bd->d = d; >> + >> init_dom0_cpuid_policy(d); >> >> - if ( alloc_dom0_vcpu0(d) == NULL ) >> + if ( alloc_dom_vcpu0(d) == NULL ) >> panic("Error creating %pdv0\n", d); >> >> cmdline_size = domain_cmdline_size(bi, bd); >> @@ -1093,7 +1096,6 @@ static struct domain *__init create_dom0(struct >> boot_info *bi) >> bd->cmdline = cmdline; >> } >> >> - bd->d = d; >> if ( construct_dom0(bd) != 0 ) >> panic("Could not construct domain 0\n"); > > Isn't this movement of the bd->d assignment entirely unrelated? > > Jan The prior incarnation of this patch (see Daniel's RFC) took a boot_domain, I think, for which the change would be required. It indeed doesn't seem to be required any longer. Cheers, Alejandro