|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 ]libxl: allow to set more than 31 vcpus
On Fri, 2012-06-01 at 12:44 +0100, Ian Campbell wrote:
> On Fri, 2012-06-01 at 03:48 +0100, Zhang, Yang Z wrote:
> > Change from v2:
> > Add function libxl_cpumap_to_hex_string to covert cpumap to hex string.
> > According to Ian's comments, modified some codes to make the logic more
> > reasonable.
> >
> > In current implementation, it uses integer to record current avail cpus and
> > this only allows user to specify 31 vcpus.
> > In following patch, it uses cpumap instead integer which make more sense
> > than before. Also there is no limit to the max vcpus.
> >
> > Signed-off-by: Yang Zhang <yang.z.zhang@xxxxxxxxx>
Hi Yang,
Have I missed a follow up posting of this patch somewhere? Or is it
still pending?
Thanks,
Ian.
> >
> > diff -r 3b0eed731020 tools/libxl/libxl_create.c
> > --- a/tools/libxl/libxl_create.c Fri Jun 01 09:27:17 2012 +0800
> > +++ b/tools/libxl/libxl_create.c Fri Jun 01 10:34:13 2012 +0800
> > @@ -146,8 +146,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(CTX, &b_info->avail_vcpus, 1))
> > + return ERROR_FAIL;
> > + libxl_cpumap_set(&b_info->avail_vcpus, 0);
> > + }
> >
> > if (!b_info->cpumap.size) {
> > if (libxl_cpumap_alloc(CTX, &b_info->cpumap, 0))
> > diff -r 3b0eed731020 tools/libxl/libxl_dm.c
> > --- a/tools/libxl/libxl_dm.c Fri Jun 01 09:27:17 2012 +0800
> > +++ b/tools/libxl/libxl_dm.c Fri Jun 01 10:34:13 2012 +0800
> > @@ -160,6 +160,8 @@ static char ** libxl__build_device_model
> > }
> > if (b_info->type == LIBXL_DOMAIN_TYPE_HVM) {
> > int ioemu_vifs = 0;
> > + int nr_set_cpus = 0;
> > + char *s;
> >
> > if (b_info->u.hvm.serial) {
> > flexarray_vappend(dm_args, "-serial", b_info->u.hvm.serial,
> > NULL);
> > @@ -200,11 +202,14 @@ static char ** libxl__build_device_model
> > libxl__sprintf(gc, "%d", b_info->max_vcpus),
> > NULL);
> > }
> > - if (b_info->cur_vcpus) {
> > - flexarray_vappend(dm_args, "-vcpu_avail",
> > - libxl__sprintf(gc, "0x%x",
> > b_info->cur_vcpus),
> > - NULL);
> > - }
> > +
> > + nr_set_cpus = libxl_cpumap_count_set(&b_info->avail_vcpus);
> > + s = libxl_cpumap_to_hex_string(&b_info->avail_vcpus);
> > + flexarray_vappend(dm_args, "-vcpu_avail",
> > + libxl__sprintf(gc, "0x%s", s),
>
> You might as well make to_hex_string include the 0x?
>
> > + NULL);
> > + free(s);
> > +
> > for (i = 0; i < num_vifs; i++) {
> > if (vifs[i].nictype == LIBXL_NIC_TYPE_IOEMU) {
> > char *smac = libxl__sprintf(gc,
> > diff -r 3b0eed731020 tools/libxl/libxl_dom.c
> > --- a/tools/libxl/libxl_dom.c Fri Jun 01 09:27:17 2012 +0800
> > +++ b/tools/libxl/libxl_dom.c Fri Jun 01 10:34:13 2012 +0800
> > @@ -195,7 +195,7 @@ 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 && !libxl_cpumap_test(&info->avail_vcpus, i))
> > ? "offline" : "online";
>
> Weren't you going to drop the "i &&" and invert the ternary?
>
> > }
> >
> > @@ -350,7 +350,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);
>
> This needs some sort of limit check, probably in terms of HVM_MAX_VCPUS.
> otherwise a particularly large vcpus= in the config will cause mayhem...
>
> I guess this should probably be done in
> libxl__domain_build_info_setdefaults.
>
> > diff -r 3b0eed731020 tools/libxl/libxl_utils.c
> > --- a/tools/libxl/libxl_utils.c Fri Jun 01 09:27:17 2012 +0800
> > +++ b/tools/libxl/libxl_utils.c Fri Jun 01 10:34:13 2012 +0800
> > @@ -533,6 +533,28 @@ void libxl_cpumap_reset(libxl_cpumap *cp
> > cpumap->map[cpu / 8] &= ~(1 << (cpu & 7));
> > }
> >
> > +int libxl_cpumap_count_set(const libxl_cpumap *cpumap)
> > +{
> > + int i, nr_set_cpus = 0;
> > + libxl_for_each_set_cpu(i, *((libxl_cpumap *)cpumap))
>
> Please stop this habit of yours of casting away the const to make the
> warning go away, it is almost always wrong and on the odd occasion that
> it is right it should have a comment explaining why...
>
> In this case please make libxl_cpumap_test const correct instead.
>
> > + nr_set_cpus++;
> > +
> > + return nr_set_cpus;
> > +}
> > +
> > +char *libxl_cpumap_to_hex_string(const libxl_cpumap *cpumap)
> > +{
> > + int i = cpumap->size;
> > + char *p = libxl__zalloc(NULL, cpumap->size * 2 + 1);
> > + char *q = p;
> > + while(--i >= 0) {
> > + sprintf((char *)p, "%02x", cpumap->map[i]);
>
> Why this cast?
>
> > + p += 2;
> > + }
> > + *p = '\0';
> > + return q;
> > +}
> > +
> > int libxl_get_max_cpus(libxl_ctx *ctx)
> > {
> > return xc_get_max_cpus(ctx->xch);
> > diff -r 3b0eed731020 tools/libxl/libxl_utils.h
> > --- a/tools/libxl/libxl_utils.h Fri Jun 01 09:27:17 2012 +0800
> > +++ b/tools/libxl/libxl_utils.h Fri Jun 01 10:34:13 2012 +0800
> > @@ -67,6 +67,8 @@ int libxl_cpumap_alloc(libxl_ctx *ctx, l
> > 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(const libxl_cpumap *cpumap);
>
> Please add a comment describing this function, it should remind the
> caller that they are responsible for freeing the result.
>
> > +char *libxl_cpumap_to_hex_string(const libxl_cpumap *cpumap);
> > static inline void libxl_cpumap_set_any(libxl_cpumap *cpumap)
> > {
> > memset(cpumap->map, -1, cpumap->size);
> > diff -r 3b0eed731020 tools/libxl/xl_cmdimpl.c
> > --- a/tools/libxl/xl_cmdimpl.c Fri Jun 01 09:27:17 2012 +0800
> > +++ b/tools/libxl/xl_cmdimpl.c Fri Jun 01 10:34:13 2012 +0800
> > @@ -650,7 +650,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(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);
>
> This while loop is == libxl_cpumap_set_any.
>
> > }
> >
> > 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 |