[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 11/11] add vtpm support to libxl
On Thu, Sep 27, 2012 at 6:11 PM, Matthew Fioravante <matthew.fioravante@xxxxxxxxxx> wrote: > This patch adds vtpm support to libxl. It adds vtpm parsing to config > files and 3 new xl commands: > vtpm-attach > vtpm-detach > vtpm-list > > Signed-off-by: Matthew Fioravante <matthew.fioravante@xxxxxxxxxx> Overall looks good to me -- just a few comments below about the config file handling (see below). Thanks for all your work on this. > @@ -601,6 +605,8 @@ static void domcreate_bootloader_done(libxl__egc *egc, > static void domcreate_launch_dm(libxl__egc *egc, libxl__multidev *aodevs, > int ret); > > +static void domcreate_attach_vtpms(libxl__egc *egc, libxl__multidev > *multidev, > + int ret); > static void domcreate_attach_pci(libxl__egc *egc, libxl__multidev *aodevs, > int ret); > > @@ -1084,13 +1090,13 @@ static void domcreate_devmodel_started(libxl__egc > *egc, > if (d_config->num_nics > 0) { > /* Attach nics */ > libxl__multidev_begin(ao, &dcs->multidev); > - dcs->multidev.callback = domcreate_attach_pci; > + dcs->multidev.callback = domcreate_attach_vtpms; Wow -- what a weird convention you've had to try to figure out and modify here. Well done. :-) > libxl__add_nics(egc, ao, domid, d_config, &dcs->multidev); > libxl__multidev_prepared(egc, &dcs->multidev, 0); > return; > } > > - domcreate_attach_pci(egc, &dcs->multidev, 0); > + domcreate_attach_vtpms(egc, &dcs->multidev, 0); > return; > > error_out: > @@ -1098,6 +1104,36 @@ error_out: > domcreate_complete(egc, dcs, ret); > } > > +static void domcreate_attach_vtpms(libxl__egc *egc, libxl__multidev > *multidev, int ret) { > + libxl__domain_create_state *dcs = CONTAINER_OF(multidev, *dcs, multidev); > + STATE_AO_GC(dcs->ao); > + int domid = dcs->guest_domid; > + > + libxl_domain_config* const d_config = dcs->guest_config; > + > + if(ret) { > + LOG(ERROR, "unable to add nic devices"); > + goto error_out; > + } > + > + /* Plug vtpm devices */ > + if (d_config->num_vtpms > 0) { > + /* Attach vtpms */ > + libxl__multidev_begin(ao, &dcs->multidev); > + dcs->multidev.callback = domcreate_attach_pci; > + libxl__add_vtpms(egc, ao, domid, d_config, &dcs->multidev); > + libxl__multidev_prepared(egc, &dcs->multidev, 0); > + return; > + } > + > + domcreate_attach_pci(egc, multidev, 0); > + return; > + > +error_out: > + assert(ret); > + domcreate_complete(egc, dcs, ret); > +} > + > static void domcreate_attach_pci(libxl__egc *egc, libxl__multidev *multidev, > int ret) > { > @@ -1111,7 +1147,7 @@ static void domcreate_attach_pci(libxl__egc *egc, > libxl__multidev *multidev, > libxl_domain_config *const d_config = dcs->guest_config; > > if (ret) { > - LOG(ERROR, "unable to add nic devices"); > + LOG(ERROR, "unable to add vtpm devices"); > goto error_out; > } > [snip] > @@ -1045,6 +1045,47 @@ static void parse_config_data(const char > *config_source, > } > } > > + if (!xlu_cfg_get_list(config, "vtpm", &vtpms, 0, 0)) { > + d_config->num_vtpms = 0; > + d_config->vtpms = NULL; > + while ((buf = xlu_cfg_get_listitem (vtpms, d_config->num_vtpms)) != > NULL) { > + libxl_device_vtpm *vtpm; > + char * buf2 = strdup(buf); > + char *p, *p2; > + > + d_config->vtpms = (libxl_device_vtpm *) realloc(d_config->vtpms, > sizeof(libxl_device_vtpm) * (d_config->num_vtpms+1)); > + vtpm = d_config->vtpms + d_config->num_vtpms; > + libxl_device_vtpm_init(vtpm); > + vtpm->devid = d_config->num_vtpms; > + > + p = strtok(buf2, ","); > + if (!p) > + goto skip_vtpm; Is the purpose of this so that you can have "empty" vtpm slots? (Since even when skipping, you still increment the num_vtpms counter?) > + do { > + while(*p == ' ') > + ++p; > + if ((p2 = strchr(p, '=')) == NULL) > + break; > + *p2 = '\0'; > + if (!strcmp(p, "backend")) { > + if(domain_qualifier_to_domid(p2 + 1, > &(vtpm->backend_domid), 0)) > + { > + fprintf(stderr, "Specified backend domain does not > exist, defaulting to Dom0\n"); > + vtpm->backend_domid = 0; So wait; if someone specifies a domain, and that turns out not to work, you just change it to 0? It seems like if the *specified* domain doesn't exist, the command should fail instead of choosing something at random. > + } > + } else if(!strcmp(p, "uuid")) { > + if( libxl_uuid_from_string(&vtpm->uuid, p2 + 1) ) { > + fprintf(stderr, "Failed to parse vtpm UUID: %s\n", > p2 + 1); > + exit(1); > + } > + } If I'm parsing this right, it looks like you will just silently ignore other arguments -- it seems like throwing an error would be better; especially to catch things like typos. Otherwise, if someone does something like "uid=[whatever]", it will act like uuid isn't there and create a new one, instead of alerting the user to the fact that he'd made a typo in the config file. -George _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |