[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC] Supporting more than 4 emulated NICs
Any opinions regarding this patch? >>> On 5/15/2018 at 11:34 AM, Charles Arnold wrote: > Some time ago this bug was written up, > > https://bugs.xenproject.org/xen/bug/46 > "qemu-upstream: limitation on 4 emulated NICs prevents guest from starting > unless PV override is used." > > While there were some proposed patches and discussion in the bug and on the > mailing list back in 2014/2015 to address this issue it hasn't seen much > movement since then. > > The last proposed patch in the bug by Stefano Stabellini is below with some > small adjustments I've made. > > What is the status of this patch? Does it break migration? > > > libxl: account for romfile memory > > Account for memory needed for emulated network card rom files. > Assume 256K for each romfile. > > Reviewed-by: Charles Arnold <carnold@xxxxxxxx> > Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> > > diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c > index f0fd5fd..56a0575 100644 > --- a/tools/libxl/libxl_dom.c > +++ b/tools/libxl/libxl_dom.c > @@ -471,7 +471,8 @@ int libxl__build_pre(libxl__gc *gc, uint32_t domid, > return ERROR_FAIL; > } > > - if (xc_domain_setmaxmem(ctx->xch, domid, info->target_memkb + size) < > 0) { > + if (xc_domain_setmaxmem(ctx->xch, domid, info->target_memkb + size > + + libxl__get_rom_memory_kb(gc, domid, d_config)) < 0) { > LOGE(ERROR, "Couldn't set max memory"); > return ERROR_FAIL; > } > diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h > index c582894..ec99fc0 100644 > --- a/tools/libxl/libxl_internal.h > +++ b/tools/libxl/libxl_internal.h > @@ -102,8 +102,9 @@ > #define LIBXL_XENCONSOLE_LIMIT 1048576 > #define LIBXL_XENCONSOLE_PROTOCOL "vt100" > #define LIBXL_MAXMEM_CONSTANT 1024 > +#define LIBXL_ROMSIZE_KB 256 > #define LIBXL_PV_EXTRA_MEMORY 1024 > -#define LIBXL_HVM_EXTRA_MEMORY 2048 > +#define LIBXL_HVM_EXTRA_MEMORY (LIBXL_MAXMEM_CONSTANT + 1024) > #define LIBXL_MIN_DOM0_MEM (128*1024) > #define LIBXL_INVALID_GFN (~(uint64_t)0) > #define LIBXL_VGA_HOLE_SIZE 0x20 > @@ -1200,6 +1201,13 @@ _hidden char * libxl__domain_pvcontrol_read(libxl__gc > *gc, > _hidden int libxl__domain_pvcontrol_write(libxl__gc *gc, xs_transaction_t > t, > uint32_t domid, const char *cmd); > > +/* Returns the amount of extra mem required to allocate roms or an libxl > + * error code on error. > + * The *d_config parameter is optional. > + */ > +_hidden int libxl__get_rom_memory_kb(libxl__gc *gc, uint32_t domid, > + libxl_domain_config *d_config); > + > /* from xl_device */ > _hidden char *libxl__device_disk_string_of_backend(libxl_disk_backend > backend); > _hidden char *libxl__device_disk_string_of_format(libxl_disk_format > format); > diff --git a/tools/libxl/libxl_mem.c b/tools/libxl/libxl_mem.c > index e551e09..b6f9440 100644 > --- a/tools/libxl/libxl_mem.c > +++ b/tools/libxl/libxl_mem.c > @@ -17,6 +17,30 @@ > #include "libxl_internal.h" > #include "libxl_arch.h" > > +int libxl__get_rom_memory_kb(libxl__gc *gc, uint32_t domid, > libxl_domain_config *d_config) > +{ > + int i, count_rom, rc; > + libxl_domain_config local_d_config; > + > + if (d_config == NULL) { > + libxl_domain_config_init(&local_d_config); > + rc = libxl__get_domain_configuration(gc, domid, &local_d_config); > + if (rc < 0) > + return rc; > + d_config = &local_d_config; > + } > + > + if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_PV) > + return 0; > + > + for (i = 0, count_rom = 0; i < d_config->num_nics; i++) { > + if (d_config->nics[i].nictype == LIBXL_NIC_TYPE_VIF_IOEMU) > + count_rom++; > + } > + > + return count_rom*LIBXL_ROMSIZE_KB; > +} > + > /* > * Set the maximum memory size of the domain in the hypervisor. There is no > * change of the current memory size involved. The specified memory size > can > @@ -74,11 +98,13 @@ int libxl_domain_setmaxmem(libxl_ctx *ctx, uint32_t > domid, uint64_t max_memkb) > goto out; > } > > - rc = xc_domain_setmaxmem(ctx->xch, domid, max_memkb + size); > + rc = xc_domain_setmaxmem(ctx->xch, domid, max_memkb + size > + + libxl__get_rom_memory_kb(gc, domid, NULL)); > if (rc != 0) { > LOGED(ERROR, domid, > - "xc_domain_setmaxmem domid=%d memkb=%"PRIu64" failed > ""rc=%d\n", > - domid, max_memkb + size, rc); > + "xc_domain_setmaxmem domid=%d memkb=%"PRIu64" failed > rc=%d\n", > + domid, max_memkb + size + > + libxl__get_rom_memory_kb(gc, domid, NULL), rc); > goto out; > } > > @@ -286,11 +312,12 @@ retry_transaction: > > if (enforce) { > memorykb = new_target_memkb + videoram; > - r = xc_domain_setmaxmem(ctx->xch, domid, memorykb + size); > + r = xc_domain_setmaxmem(ctx->xch, domid, memorykb + size > + + libxl__get_rom_memory_kb(gc, domid, NULL)); > if (r != 0) { > LOGED(ERROR, domid, > "xc_domain_setmaxmem memkb=%"PRIu64" failed ""rc=%d\n", > - memorykb + size, > + memorykb + size + libxl__get_rom_memory_kb(gc, domid, > NULL), > r); > abort_transaction = 1; > rc = ERROR_FAIL; > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |