[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] dom0less: Introduce kernel_info into the domain creation loop
commit 83e9b3541214680131070069294092b91f3e1ece Author: Alejandro Vallejo <alejandro.garciavallejo@xxxxxxx> AuthorDate: Tue Jul 22 13:59:45 2025 +0200 Commit: Stefano Stabellini <stefano.stabellini@xxxxxxx> CommitDate: Wed Jul 23 13:35:51 2025 -0700 dom0less: Introduce kernel_info into the domain creation loop In later patches boot_domain becomes the common ground for the bindings to drop the extracted information. In preparation for the bindings themselves to be in a separate function, introduce kernel_info early in the domain construction loop. This simplifies a later diff, turning it into a strict cut-and-paste, rather than a mutate-on-move. Lines after domain_create() don't make use of the "d_cfg" and "flags" variables because those will disappear when the bindings move to a separate file. Signed-off-by: Alejandro Vallejo <alejandro.garciavallejo@xxxxxxx> Acked-by: Stefano Stabellini <stefano.stabellini@xxxxxxx> Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xxxxxxx> Reviewed-by: Jason Andryuk <jason.andryuk@xxxxxxx> --- xen/common/device-tree/dom0less-build.c | 109 ++++++++++++++++---------------- 1 file changed, 54 insertions(+), 55 deletions(-) diff --git a/xen/common/device-tree/dom0less-build.c b/xen/common/device-tree/dom0less-build.c index e49213e763..cee666786e 100644 --- a/xen/common/device-tree/dom0less-build.c +++ b/xen/common/device-tree/dom0less-build.c @@ -732,10 +732,10 @@ static inline int __init domain_p2m_set_allocation( } #endif /* CONFIG_ARCH_PAGING_MEMPOOL */ -static int __init construct_domU(struct domain *d, +static int __init construct_domU(struct kernel_info *kinfo, const struct dt_device_node *node) { - struct kernel_info kinfo = KERNEL_INFO_INIT; + struct domain *d = kinfo->bd.d; const char *dom0less_enhanced; int rc; u64 mem; @@ -746,7 +746,7 @@ static int __init construct_domU(struct domain *d, printk("Error building DomU: cannot read \"memory\" property\n"); return -EINVAL; } - kinfo.unassigned_mem = (paddr_t)mem * SZ_1K; + kinfo->unassigned_mem = (paddr_t)mem * SZ_1K; rc = domain_p2m_set_allocation(d, mem, node); if ( rc != 0 ) @@ -761,66 +761,64 @@ static int __init construct_domU(struct domain *d, (rc == 0 && !strcmp(dom0less_enhanced, "enabled")) ) { need_xenstore = true; - kinfo.dom0less_feature = DOM0LESS_ENHANCED; + kinfo->dom0less_feature = DOM0LESS_ENHANCED; } else if ( rc == 0 && !strcmp(dom0less_enhanced, "legacy") ) { need_xenstore = true; - kinfo.dom0less_feature = DOM0LESS_ENHANCED_LEGACY; + kinfo->dom0less_feature = DOM0LESS_ENHANCED_LEGACY; } else if ( rc == 0 && !strcmp(dom0less_enhanced, "no-xenstore") ) - kinfo.dom0less_feature = DOM0LESS_ENHANCED_NO_XS; + kinfo->dom0less_feature = DOM0LESS_ENHANCED_NO_XS; if ( vcpu_create(d, 0) == NULL ) return -ENOMEM; d->max_pages = ((paddr_t)mem * SZ_1K) >> PAGE_SHIFT; - kinfo.bd.d = d; - - rc = kernel_probe(&kinfo, node); + rc = kernel_probe(kinfo, node); if ( rc < 0 ) return rc; - set_domain_type(d, &kinfo); + set_domain_type(d, kinfo); if ( is_hardware_domain(d) ) { - rc = construct_hwdom(&kinfo, node); + rc = construct_hwdom(kinfo, node); if ( rc < 0 ) return rc; } else { if ( !dt_find_property(node, "xen,static-mem", NULL) ) - allocate_memory(d, &kinfo); + allocate_memory(d, kinfo); else if ( !is_domain_direct_mapped(d) ) - allocate_static_memory(d, &kinfo, node); + allocate_static_memory(d, kinfo, node); else - assign_static_memory_11(d, &kinfo, node); + assign_static_memory_11(d, kinfo, node); - rc = process_shm(d, &kinfo, node); + rc = process_shm(d, kinfo, node); if ( rc < 0 ) return rc; - rc = init_vuart(d, &kinfo, node); + rc = init_vuart(d, kinfo, node); if ( rc < 0 ) return rc; - rc = prepare_dtb_domU(d, &kinfo); + rc = prepare_dtb_domU(d, kinfo); if ( rc < 0 ) return rc; - rc = construct_domain(d, &kinfo); + rc = construct_domain(d, kinfo); if ( rc < 0 ) return rc; } domain_vcpu_affinity(d, node); - rc = alloc_xenstore_params(&kinfo); + rc = alloc_xenstore_params(kinfo); - rangeset_destroy(kinfo.xen_reg_assigned); + rangeset_destroy(kinfo->xen_reg_assigned); return rc; } @@ -837,9 +835,9 @@ void __init create_domUs(void) dt_for_each_child_node(chosen, node) { const char *llc_colors_str = NULL; - struct domain *d; - struct xen_domctl_createdomain d_cfg = {0}; - unsigned int flags = 0U; + struct kernel_info ki = KERNEL_INFO_INIT; + struct xen_domctl_createdomain *d_cfg = &ki.bd.create_cfg; + unsigned int *flags = &ki.bd.create_flags; bool has_dtb = false; uint32_t val; int rc; @@ -850,10 +848,10 @@ void __init create_domUs(void) if ( (max_init_domid + 1) >= DOMID_FIRST_RESERVED ) panic("No more domain IDs available\n"); - d_cfg.max_evtchn_port = 1023; - d_cfg.max_grant_frames = -1; - d_cfg.max_maptrack_frames = -1; - d_cfg.grant_opts = XEN_DOMCTL_GRANT_version(opt_gnttab_max_version); + d_cfg->max_evtchn_port = 1023; + d_cfg->max_grant_frames = -1; + d_cfg->max_maptrack_frames = -1; + d_cfg->grant_opts = XEN_DOMCTL_GRANT_version(opt_gnttab_max_version); if ( dt_property_read_u32(node, "capabilities", &val) ) { @@ -861,7 +859,7 @@ void __init create_domUs(void) panic("Invalid capabilities (%"PRIx32")\n", val); if ( val & DOMAIN_CAPS_CONTROL ) - flags |= CDF_privileged; + *flags |= CDF_privileged; if ( val & DOMAIN_CAPS_HARDWARE ) { @@ -870,17 +868,17 @@ void __init create_domUs(void) hardware_domain); #ifdef CONFIG_GRANT_TABLE - d_cfg.max_grant_frames = gnttab_dom0_frames(); + d_cfg->max_grant_frames = gnttab_dom0_frames(); #endif - d_cfg.max_evtchn_port = -1; - flags |= CDF_hardware; + d_cfg->max_evtchn_port = -1; + *flags |= CDF_hardware; iommu = true; } if ( val & DOMAIN_CAPS_XENSTORE ) { - d_cfg.flags |= XEN_DOMCTL_CDF_xs_domain; - d_cfg.max_evtchn_port = -1; + d_cfg->flags |= XEN_DOMCTL_CDF_xs_domain; + d_cfg->max_evtchn_port = -1; } } @@ -889,45 +887,45 @@ void __init create_domUs(void) if ( llc_coloring_enabled ) panic("LLC coloring and static memory are incompatible\n"); - flags |= CDF_staticmem; + *flags |= CDF_staticmem; } if ( dt_property_read_bool(node, "direct-map") ) { - if ( !(flags & CDF_staticmem) ) + if ( !(*flags & CDF_staticmem) ) panic("direct-map is not valid for domain %s without static allocation.\n", dt_node_name(node)); - flags |= CDF_directmap; + *flags |= CDF_directmap; } - if ( !dt_property_read_u32(node, "cpus", &d_cfg.max_vcpus) ) + if ( !dt_property_read_u32(node, "cpus", &d_cfg->max_vcpus) ) panic("Missing property 'cpus' for domain %s\n", dt_node_name(node)); if ( !dt_property_read_string(node, "passthrough", &dom0less_iommu) ) { - if ( flags & CDF_hardware ) + if ( *flags & CDF_hardware ) panic("Don't specify passthrough for hardware domain\n"); if ( !strcmp(dom0less_iommu, "enabled") ) iommu = true; } - if ( (flags & CDF_hardware) && !(flags & CDF_directmap) && + if ( (*flags & CDF_hardware) && !(*flags & CDF_directmap) && !iommu_enabled ) panic("non-direct mapped hardware domain requires iommu\n"); if ( dt_find_compatible_node(node, NULL, "multiboot,device-tree") ) { - if ( flags & CDF_hardware ) + if ( *flags & CDF_hardware ) panic("\"multiboot,device-tree\" incompatible with hardware domain\n"); has_dtb = true; } if ( iommu_enabled && (iommu || has_dtb) ) - d_cfg.flags |= XEN_DOMCTL_CDF_iommu; + d_cfg->flags |= XEN_DOMCTL_CDF_iommu; /* Get the optional property domain-cpupool */ cpupool_node = dt_parse_phandle(node, "domain-cpupool", 0); @@ -937,57 +935,58 @@ void __init create_domUs(void) if ( pool_id < 0 ) panic("Error getting cpupool id from domain-cpupool (%d)\n", pool_id); - d_cfg.cpupool_id = pool_id; + d_cfg->cpupool_id = pool_id; } if ( dt_property_read_u32(node, "max_grant_version", &val) ) - d_cfg.grant_opts = XEN_DOMCTL_GRANT_version(val); + d_cfg->grant_opts = XEN_DOMCTL_GRANT_version(val); if ( dt_property_read_u32(node, "max_grant_frames", &val) ) { if ( val > INT32_MAX ) panic("max_grant_frames (%"PRIu32") overflow\n", val); - d_cfg.max_grant_frames = val; + d_cfg->max_grant_frames = val; } if ( dt_property_read_u32(node, "max_maptrack_frames", &val) ) { if ( val > INT32_MAX ) panic("max_maptrack_frames (%"PRIu32") overflow\n", val); - d_cfg.max_maptrack_frames = val; + d_cfg->max_maptrack_frames = val; } dt_property_read_string(node, "llc-colors", &llc_colors_str); if ( !llc_coloring_enabled && llc_colors_str ) panic("'llc-colors' found, but LLC coloring is disabled\n"); - arch_create_domUs(node, &d_cfg, flags); + arch_create_domUs(node, d_cfg, *flags); /* * The variable max_init_domid is initialized with zero, so here it's * very important to use the pre-increment operator to call * domain_create() with a domid > 0. (domid == 0 is reserved for Dom0) */ - d = domain_create(++max_init_domid, &d_cfg, flags); - if ( IS_ERR(d) ) + ki.bd.d = domain_create(++max_init_domid, + &ki.bd.create_cfg, ki.bd.create_flags); + if ( IS_ERR(ki.bd.d) ) panic("Error creating domain %s (rc = %ld)\n", - dt_node_name(node), PTR_ERR(d)); + dt_node_name(node), PTR_ERR(ki.bd.d)); if ( llc_coloring_enabled && - (rc = domain_set_llc_colors_from_str(d, llc_colors_str)) ) + (rc = domain_set_llc_colors_from_str(ki.bd.d, llc_colors_str)) ) panic("Error initializing LLC coloring for domain %s (rc = %d)\n", dt_node_name(node), rc); - d->is_console = true; - dt_device_set_used_by(node, d->domain_id); + ki.bd.d->is_console = true; + dt_device_set_used_by(node, ki.bd.d->domain_id); - rc = construct_domU(d, node); + rc = construct_domU(&ki, node); if ( rc ) panic("Could not set up domain %s (rc = %d)\n", dt_node_name(node), rc); - if ( d_cfg.flags & XEN_DOMCTL_CDF_xs_domain ) - set_xs_domain(d); + if ( ki.bd.create_cfg.flags & XEN_DOMCTL_CDF_xs_domain ) + set_xs_domain(ki.bd.d); } if ( need_xenstore && xs_domid == DOMID_INVALID ) -- generated by git-patchbot for /home/xen/git/xen.git#staging
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |