[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] xl: fix vcpus to vnode assignement in config file
On Fri, Jul 17, 2015 at 05:57:49PM +0200, Dario Faggioli wrote: > In fact, right now, if the "vcpus=" list (where the > user specifies what vcpus should be part of a vnode) > has multiple elements, things don't work. > E.g., the following examples all result in failure > to create the guest: > > [ "pnode=0","size=512","vcpus=0,2","vdistances=10,20" ] > [ "pnode=0","size=512","vcpus=0-1,4","vdistances=10,20" ] > > Reason is we need either a multidimentional array, > or a bitmap, to temporary store the vcpus of a > vnode, while parsing the vnuma config entry. > > Let's use the latter, which happens to also make it > easier to copy the outcome of the parsing to its > final destination in b_info, if everything goes ok. > > Signed-off-by: Dario Faggioli <dario.faggioli@xxxxxxxxxx> > --- > Cc: Wei Liu <wei.liu2@xxxxxxxxxx> > Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> > Cc: Ian Campbell <ian.campbell@xxxxxxxxxx> With two issues mentioned below fixed: Acked-by: Wei Liu <wei.liu2@xxxxxxxxxx> > --- > tools/libxl/xl_cmdimpl.c | 34 ++++++++++++++++++---------------- > 1 file changed, 18 insertions(+), 16 deletions(-) > > diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c > index 8cbf30e..67d732f 100644 > --- a/tools/libxl/xl_cmdimpl.c > +++ b/tools/libxl/xl_cmdimpl.c > @@ -1076,9 +1076,7 @@ static void parse_vnuma_config(const XLU_Config *config, > /* Temporary storage for parsed vcpus information to avoid > * parsing config twice. This array has num_vnuma elements. > */ Delete this comment as well. > - struct vcpu_range_parsed { > - unsigned long start, end; > - } *vcpu_range_parsed; > + libxl_bitmap *vcpu_parsed; > > libxl_physinfo_init(&physinfo); > if (libxl_get_physinfo(ctx, &physinfo) != 0) { > @@ -1095,7 +1093,14 @@ static void parse_vnuma_config(const XLU_Config > *config, > > b_info->num_vnuma_nodes = num_vnuma; > b_info->vnuma_nodes = xcalloc(num_vnuma, sizeof(libxl_vnode_info)); > - vcpu_range_parsed = xcalloc(num_vnuma, sizeof(*vcpu_range_parsed)); > + vcpu_parsed = xcalloc(num_vnuma, sizeof(libxl_bitmap)); > + for (i = 0; i < num_vnuma; i++) { > + libxl_bitmap_init(&vcpu_parsed[i]); > + if (libxl_cpu_bitmap_alloc(ctx, &vcpu_parsed[i], b_info->max_vcpus)) > { > + fprintf(stderr, "libxl_node_bitmap_alloc failed.\n"); > + exit(1); > + } > + } > > for (i = 0; i < b_info->num_vnuma_nodes; i++) { > libxl_vnode_info *p = &b_info->vnuma_nodes[i]; > @@ -1165,12 +1170,14 @@ static void parse_vnuma_config(const XLU_Config > *config, > split_string_into_string_list(value, ",", > &cpu_spec_list); > len = libxl_string_list_length(&cpu_spec_list); > > - for (j = 0; j < len; j++) > + for (j = 0; j < len; j++) { > parse_range(cpu_spec_list[j], &s, &e); > + for (; s <=e; s++) { Space before e. > + libxl_bitmap_set(&vcpu_parsed[i], s); > + max_vcpus++; > + } > + } > > - vcpu_range_parsed[i].start = s; > - vcpu_range_parsed[i].end = e; > - max_vcpus += (e - s + 1); > libxl_string_list_dispose(&cpu_spec_list); > } else if (!strcmp("vdistances", option)) { > libxl_string_list vdist; > @@ -1209,17 +1216,12 @@ static void parse_vnuma_config(const XLU_Config > *config, > > for (i = 0; i < b_info->num_vnuma_nodes; i++) { > libxl_vnode_info *p = &b_info->vnuma_nodes[i]; > - int cpu; > > - libxl_cpu_bitmap_alloc(ctx, &p->vcpus, b_info->max_vcpus); > - libxl_bitmap_set_none(&p->vcpus); > - for (cpu = vcpu_range_parsed[i].start; > - cpu <= vcpu_range_parsed[i].end; > - cpu++) > - libxl_bitmap_set(&p->vcpus, cpu); > + libxl_bitmap_copy_alloc(ctx, &p->vcpus, &vcpu_parsed[i]); > + libxl_bitmap_dispose(&vcpu_parsed[i]); > } > > - free(vcpu_range_parsed); > + free(vcpu_parsed); > } > > static void parse_config_data(const char *config_source, _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |