[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 ]libxl: allow to set more than 31 vcpus
On Thu, 2012-05-17 at 06:02 +0100, Zhang, Yang Z wrote: > In current implementation, it uses integer for record current avail cpus and > this only allows user to specify 31 vcpus. > In following patch, it uses cpumap instead interger which make more sense > than before. Also there is no limit to the max vcpus. > > Signed-off-by: Yang Zhang <yang.z.zhang@xxxxxxxxx> > > diff -r c8a01e966ec8 tools/libxl/libxl_create.c > --- a/tools/libxl/libxl_create.c Thu May 17 12:59:49 2012 +0800 > +++ b/tools/libxl/libxl_create.c Thu May 17 13:01:26 2012 +0800 > @@ -142,8 +142,11 @@ int libxl__domain_build_info_setdefault( > > if (!b_info->max_vcpus) > b_info->max_vcpus = 1; > - if (!b_info->cur_vcpus) > - b_info->cur_vcpus = 1; > + if (!b_info->avail_vcpus.size) { > + if (libxl_cpumap_alloc_size(CTX, &b_info->avail_vcpus, 1)) > + return ERROR_NOMEM; After your previous patch the only thing cpumap_alloc_size can fail with is ERROR_FAIL (inability to determine number of processors), converting that into ERROR_NOMEM seems inappropriate. This should propagate the actual error code. It might also be reasonable for libxl to abort/crash if libxl_get_max_cpus fails in which case cpumap_alloc_size would return void. > + libxl_cpumap_set(&b_info->avail_vcpus, 0); > + } > > if (!b_info->cpumap.size) { > if (libxl_cpumap_alloc(CTX, &b_info->cpumap)) > diff -r c8a01e966ec8 tools/libxl/libxl_dm.c > --- a/tools/libxl/libxl_dm.c Thu May 17 12:59:49 2012 +0800 > +++ b/tools/libxl/libxl_dm.c Thu May 17 13:01:26 2012 +0800 > @@ -200,10 +200,19 @@ static char ** libxl__build_device_model > libxl__sprintf(gc, "%d", b_info->max_vcpus), > NULL); > } > - if (b_info->cur_vcpus) { > + if (b_info->avail_vcpus.size) { Can never be false, due to allocation in setdefaults? > + int nr_set_cpus = 0; > + char *s; > + > + nr_set_cpus = libxl_cpumap_count_set( > + &(((libxl_domain_build_info *)b_info)->avail_vcpus)); > + > + s = libxl_cpumap_to_hex_string( > + &(((libxl_domain_build_info *)b_info)->avail_vcpus)); Why the casts to (libxl_domain_build_info *)? > flexarray_vappend(dm_args, "-vcpu_avail", > - libxl__sprintf(gc, "0x%x", b_info->cur_vcpus), > + libxl__sprintf(gc, "0x%s", s), > NULL); > + free(s); > } > for (i = 0; i < num_vifs; i++) { > if (vifs[i].nictype == LIBXL_NIC_TYPE_IOEMU) { > @@ -441,11 +450,15 @@ static char ** libxl__build_device_model > } > if (b_info->max_vcpus > 1) { > flexarray_append(dm_args, "-smp"); > - if (b_info->cur_vcpus) > + if (b_info->avail_vcpus.size) { > + int nr_set_cpus = 0; > + nr_set_cpus = libxl_cpumap_count_set( > + &(((libxl_domain_build_info *)b_info)->avail_vcpus)); Another strange looking cast. Are you perhaps casting away the const-ness of b_info? You most likely want to make libxl_cpumap_count_set const-correct instead. > + > flexarray_append(dm_args, libxl__sprintf(gc, "%d,maxcpus=%d", > b_info->max_vcpus, > - b_info->cur_vcpus)); > - else > + nr_set_cpus)); > + } else > flexarray_append(dm_args, libxl__sprintf(gc, "%d", > b_info->max_vcpus)); > } > diff -r c8a01e966ec8 tools/libxl/libxl_dom.c > --- a/tools/libxl/libxl_dom.c Thu May 17 12:59:49 2012 +0800 > +++ b/tools/libxl/libxl_dom.c Thu May 17 13:01:26 2012 +0800 > @@ -195,7 +195,8 @@ int libxl__build_post(libxl__gc *gc, uin > ents[11] = libxl__sprintf(gc, "%lu", state->store_mfn); > for (i = 0; i < info->max_vcpus; i++) { > ents[12+(i*2)] = libxl__sprintf(gc, "cpu/%d/availability", i); > - ents[12+(i*2)+1] = (i && info->cur_vcpus && !(info->cur_vcpus & (1 > << i))) > + ents[12+(i*2)+1] = (i && info->avail_vcpus.size "!info->avail_vcpus.size" should always be a bug here since you always allocate one in setdefaults. I think you can also stop special casing i == 0, that would be a user error to supply a cpumap without cpu0 set in it. Might be worth checking that in the setdefaults fn. > + && !libxl_cpumap_test(&info->avail_vcpus, i)) > ? "offline" : "online"; > } > > @@ -346,7 +347,7 @@ static int hvm_build_set_params(xc_inter > va_hvm = (struct hvm_info_table *)(va_map + HVM_INFO_OFFSET); > va_hvm->apic_mode = libxl_defbool_val(info->u.hvm.apic); > va_hvm->nr_vcpus = info->max_vcpus; > - memcpy(va_hvm->vcpu_online, &info->cur_vcpus, sizeof(info->cur_vcpus)); > + memcpy(va_hvm->vcpu_online, info->avail_vcpus.map, > info->avail_vcpus.size); > for (i = 0, sum = 0; i < va_hvm->length; i++) > sum += ((uint8_t *) va_hvm)[i]; > va_hvm->checksum -= sum; > diff -r c8a01e966ec8 tools/libxl/libxl_types.idl > --- a/tools/libxl/libxl_types.idl Thu May 17 12:59:49 2012 +0800 > +++ b/tools/libxl/libxl_types.idl Thu May 17 13:01:26 2012 +0800 > @@ -242,7 +242,7 @@ libxl_sched_params = Struct("sched_param > # libxl_file_reference_unmap. > libxl_domain_build_info = Struct("domain_build_info",[ > ("max_vcpus", integer), > - ("cur_vcpus", integer), > + ("avail_vcpus", libxl_cpumap), > ("cpumap", libxl_cpumap), > ("tsc_mode", libxl_tsc_mode), > ("max_memkb", MemKB), > diff -r c8a01e966ec8 tools/libxl/libxl_utils.c > --- a/tools/libxl/libxl_utils.c Thu May 17 12:59:49 2012 +0800 > +++ b/tools/libxl/libxl_utils.c Thu May 17 13:01:26 2012 +0800 > @@ -503,6 +503,19 @@ int libxl_cpumap_alloc(libxl_ctx *ctx, l > return 0; > } > > +int libxl_cpumap_alloc_size(libxl_ctx *ctx, libxl_cpumap *cpumap, int > max_cpus) > +{ > + int sz; > + > + if (max_cpus == 0) <= ? > + return ERROR_FAIL; > + > + sz = (max_cpus + 7) / 8; > + cpumap->map = libxl__zalloc(NULL, sz * sizeof(*cpumap->map)); > + cpumap->size = sz; > + return 0; > +} Can you reimplement libxl_cpumap_alloc in terms of this function? Alternatively add a new max_cpus param to the existing function and have it do: if (max_cpus == 0) max_cpus = libxl_get_max_cpus(ctx); (IOW libxl_cpumap_alloc_size(ctx, &map, 0) means allocate the biggest possibly required map). > + > void libxl_cpumap_dispose(libxl_cpumap *map) > { > free(map->map); > @@ -529,6 +542,29 @@ void libxl_cpumap_reset(libxl_cpumap *cp > cpumap->map[cpu / 8] &= ~(1 << (cpu & 7)); > } > > +int libxl_cpumap_count_set(libxl_cpumap *cpumap) > +{ > + int i, nr_set_cpus = 0; > + libxl_for_each_set_cpu(i, *cpumap) > + nr_set_cpus++; > + > + return nr_set_cpus; > +} > + > +void *libxl_cpumap_to_hex_string(libxl_cpumap *cpumap) shouldn't this return char *? Other libxl types provide a _to_string method -- is the fact that this one happens to be hex formatted especially relevant? The general form of those is (const?) char *libxl_FOO_to_string(libxl_FOO *foo); > +{ > + int i = cpumap->size; > + uint8_t *p = libxl__zalloc(NULL, cpumap->size * 2 + 1); > + uint8_t *q = p; Why are the uint8_t and not char *? > + while(--i >= 0) { > + fprintf(stderr,"i:%d, p :%p, map[%d]: %x\n", i, p, i, > cpumap->map[i]); libxl shouldn't be logging to stderr. If this function needs to log then it should take a ctx and use the logging primitives. I expect this is just left over debugging which can be removed (it'd be rather verbose for the final verison) > + sprintf((char *)p, "%02x", cpumap->map[i]); > + p += 2; > + } > + *p = '\0'; > + return q; > +} > + > int libxl_get_max_cpus(libxl_ctx *ctx) > { > return xc_get_max_cpus(ctx->xch); > diff -r c8a01e966ec8 tools/libxl/libxl_utils.h > --- a/tools/libxl/libxl_utils.h Thu May 17 12:59:49 2012 +0800 > +++ b/tools/libxl/libxl_utils.h Thu May 17 13:01:26 2012 +0800 > @@ -64,9 +64,12 @@ int libxl_vdev_to_device_disk(libxl_ctx > libxl_device_disk *disk); > > int libxl_cpumap_alloc(libxl_ctx *ctx, libxl_cpumap *cpumap); > +int libxl_cpumap_alloc_size(libxl_ctx *ctx, libxl_cpumap *cpumap, int > max_cpus); > int libxl_cpumap_test(libxl_cpumap *cpumap, int cpu); > void libxl_cpumap_set(libxl_cpumap *cpumap, int cpu); > void libxl_cpumap_reset(libxl_cpumap *cpumap, int cpu); > +int libxl_cpumap_count_set(libxl_cpumap *cpumap); > +void *libxl_cpumap_to_hex_string(libxl_cpumap *cpumap); > static inline void libxl_cpumap_set_any(libxl_cpumap *cpumap) > { > memset(cpumap->map, -1, cpumap->size); > diff -r c8a01e966ec8 tools/libxl/xl_cmdimpl.c > --- a/tools/libxl/xl_cmdimpl.c Thu May 17 12:59:49 2012 +0800 > +++ b/tools/libxl/xl_cmdimpl.c Thu May 17 13:01:26 2012 +0800 > @@ -647,7 +647,14 @@ static void parse_config_data(const char > > if (!xlu_cfg_get_long (config, "vcpus", &l, 0)) { > b_info->max_vcpus = l; > - b_info->cur_vcpus = (1 << l) - 1; > + > + if (libxl_cpumap_alloc_size(ctx, &b_info->avail_vcpus, l)) { > + fprintf(stderr, "Unable to allocate cpumap\n"); > + exit(1); > + } > + libxl_cpumap_set_none(&b_info->avail_vcpus); > + while (l-- > 0) > + libxl_cpumap_set((&b_info->avail_vcpus), l); > } > > if (!xlu_cfg_get_long (config, "maxvcpus", &l, 0)) > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > http://lists.xen.org/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |