[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v10 16/19] libxl: call hotplug scripts for nic devices from libxl
On Fri, 2012-07-20 at 17:01 +0100, Ian Campbell wrote: > > + switch (nictype) { > > + case LIBXL_NIC_TYPE_VIF_IOEMU: > > + env[nr++] = "INTERFACE"; > > + env[nr++] = libxl__strdup(gc, libxl__device_nic_devname(gc, > > + dev->domid, > > dev->devid, > > + > > LIBXL_NIC_TYPE_VIF_IOEMU)); > > Is this fall-through of the case deliberate? If so then a comment would > be good. > > However I'm not sure about this. It seems like the hotplug scripts are > only called once in the VIF_IOEMU case? I would expect one call for the > PV VIF device and one for the TAP device? Perhaps I'm just missing the > location of the other one? Is this "num_exec" variable involved in some > way? But you don't propagate that to get_hotplug_env() and therefore > include *both* sets of env vars? > > In any case something related seems to be broken for guests which use a > stub domain and use vifname=foo. What I see in that case is the script > called three times... > 1. For the PV interface of the stub domain (LIBXL_NIC_TYPE_VIF), > renames vifX+1.0 -> foo-emu (*) > 2. For the PV interface of the real domain > (LIBXL_NIC_TYPE_VIF_IOEMU part 1), renames vifX.0 -> foo > 3. For the emu interface of the real domain > (LIBXL_NIC_TYPE_VIF_IOEMU part 2) renames vifX.0 -> foo-emu > > The rename in #3 fails, because foo-emu already exists. But in fact this > call to the script should never happen for a domain with a stub domain > since the emulated device in this case is within the stub domain, not > the driver domain. My slightly skanky fix, still with debugging still, is below. I'm posting it now because it's late and I'm going home. I think a better fix would be to determine up front which scripts needed running and track that instead of num_execs. diff -r 574bece33c88 tools/libxl/libxl_dm.c --- a/tools/libxl/libxl_dm.c Fri Jul 20 15:58:18 2012 +0100 +++ b/tools/libxl/libxl_dm.c Fri Jul 20 17:35:54 2012 +0100 @@ -616,6 +616,25 @@ static char ** libxl__build_device_model } } +static void libxl__dm_nics_from_hvm_guest_config(libxl__gc *gc, + libxl_domain_config * const guest_config, + libxl_domain_config *dm_config) +{ + int i, nr = guest_config->num_nics; + + GCNEW_ARRAY(dm_config->nics, nr); + + for (i=0; i<nr; i++) { + dm_config->nics[i] = guest_config->nics[i]; + if (dm_config->nics[i].ifname) + dm_config->nics[i].ifname = GCSPRINTF("%s" TAP_DEVICE_SUFFIX, + dm_config->nics[i].ifname); + dm_config->nics[i].nictype = LIBXL_NIC_TYPE_VIF; + } + + dm_config->num_nics = nr; +} + static int libxl__vfb_and_vkb_from_hvm_guest_config(libxl__gc *gc, const libxl_domain_config *guest_config, libxl_device_vfb *vfb, @@ -764,8 +783,7 @@ void libxl__spawn_stub_dm(libxl__egc *eg dm_config->disks = guest_config->disks; dm_config->num_disks = guest_config->num_disks; - dm_config->nics = guest_config->nics; - dm_config->num_nics = guest_config->num_nics; + libxl__dm_nics_from_hvm_guest_config(gc, guest_config, dm_config); dm_config->c_info.run_hotplug_scripts = guest_config->c_info.run_hotplug_scripts; diff -r 574bece33c88 tools/libxl/libxl_linux.c --- a/tools/libxl/libxl_linux.c Fri Jul 20 15:58:18 2012 +0100 +++ b/tools/libxl/libxl_linux.c Fri Jul 20 17:35:54 2012 +0100 @@ -117,11 +117,13 @@ static char **get_hotplug_env(libxl__gc env[nr++] = libxl__strdup(gc, libxl__device_nic_devname(gc, dev->domid, dev->devid, LIBXL_NIC_TYPE_VIF_IOEMU)); + fprintf(stderr, "dom%d: %d: VIF_IOEMU %s = %s\n", dev->domid, dev->devid, env[nr-2], env[nr-1]); case LIBXL_NIC_TYPE_VIF: env[nr++] = "vif"; env[nr++] = libxl__strdup(gc, libxl__device_nic_devname(gc, dev->domid, dev->devid, LIBXL_NIC_TYPE_VIF)); + fprintf(stderr, "dom%d: %d: VIF %s = %s\n", dev->domid, dev->devid, env[nr-2], env[nr-1]); break; default: return NULL; @@ -159,11 +161,22 @@ static int libxl__hotplug_nic(libxl__gc rc = ERROR_FAIL; goto out; } + + fprintf(stderr, "%s: type=%s num_exec=%d action=%d hasstubdom=%s isstubdom=%s\n", + __func__, libxl_nic_type_to_string(nictype), + num_exec, action, + libxl_get_stubdom_id(CTX, dev->domid) ? "yes" : "no", + libxl_is_stubdom(CTX, dev->domid, NULL) ? "yes" : "no"); + if (nictype == LIBXL_NIC_TYPE_VIF && num_exec != 0) { rc = 0; goto out; } - + if (nictype == LIBXL_NIC_TYPE_VIF_IOEMU && num_exec != 0 && libxl_get_stubdom_id(CTX, dev->domid)) { + fprintf(stderr, "skipping EMU for domain w/ stubdom\n"); + rc = 0; + goto out; + } *env = get_hotplug_env(gc, dev); if (!env) { rc = ERROR_FAIL; _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |