|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 4/5] vTPM: add vTPM device for HVM virtual machine
On Tue, Dec 30, 2014 at 11:45:31PM -0500, Quan Xu wrote:
> Signed-off-by: Quan Xu <quan.xu@xxxxxxxxx>
> ---
> tools/libxl/libxl.c | 62
> ++++++++++++++++++++++++++++++++++++++++++++
> tools/libxl/libxl_create.c | 6 +++++
> tools/libxl/libxl_dm.c | 16 ++++++++++++
> tools/libxl/libxl_internal.h | 3 +++
> 4 files changed, 87 insertions(+)
>
> diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
> index 18561fb..656d4b0 100644
> --- a/tools/libxl/libxl.c
> +++ b/tools/libxl/libxl.c
> @@ -2015,6 +2015,10 @@ void libxl__device_vtpm_add(libxl__egc *egc, uint32_t
> domid,
> flexarray_append(front, "handle");
> flexarray_append(front, GCSPRINTF("%d", vtpm->devid));
>
> + /*for para virtual machine*/
Space after "/*" and before "*/", and capitalise "for".
Please also fix similar issues below.
> + flexarray_append(front, "domain-type");
> + flexarray_append(front, GCSPRINTF("%d", LIBXL_DOMAIN_TYPE_PV));
> +
What is this used for?
> if (aodev->update_json) {
> lock = libxl__lock_domain_userdata(gc, domid);
> if (!lock) {
> @@ -2073,6 +2077,64 @@ out:
> return;
> }
>
> +void libxl__device_hvm_vtpm_add(libxl__gc *gc, uint32_t domid,
> + libxl_device_vtpm *vtpm)
> +{
> + flexarray_t *front;
> + flexarray_t *back;
> + libxl__device *device;
> + unsigned int rc;
> +
> + rc = libxl__device_vtpm_setdefault(gc, vtpm);
> + if (rc) goto out;
> +
> + front = flexarray_make(gc, 16, 1);
> + back = flexarray_make(gc, 16, 1);
> +
> + if (vtpm->devid == -1) {
> + if ((vtpm->devid = libxl__device_nextid(gc, domid, "vtpm")) < 0) {
> + rc = ERROR_FAIL;
> + goto out;
> + }
> + }
> +
> + GCNEW(device);
> + rc = libxl__device_from_vtpm(gc, domid, vtpm, device);
> + if ( rc != 0 ) goto out;
Coding style.
> + flexarray_append(back, "frontend-id");
> + flexarray_append(back, GCSPRINTF("%d", domid));
> + flexarray_append(back, "online");
> + flexarray_append(back, "1");
> + flexarray_append(back, "state");
> + flexarray_append(back, GCSPRINTF("%d", 1));
No need to use GCSPRINT.
> + flexarray_append(back, "handle");
> + flexarray_append(back, GCSPRINTF("%d", vtpm->devid));
> +
> + flexarray_append(back, "uuid");
> + flexarray_append(back, GCSPRINTF(LIBXL_UUID_FMT,
> LIBXL_UUID_BYTES(vtpm->uuid)));
Line too long.
> + flexarray_append(back, "resume");
> + flexarray_append(back, "False");
> +
> + flexarray_append(front, "backend-id");
> + flexarray_append(front, GCSPRINTF("%d", vtpm->backend_domid));
> + flexarray_append(front, "state");
> + flexarray_append(front, GCSPRINTF("%d", 1));
> + flexarray_append(front, "handle");
> + flexarray_append(front, GCSPRINTF("%d", vtpm->devid));
> +
> + flexarray_append(front, "domain-type");
> + flexarray_append(front, GCSPRINTF("%d", LIBXL_DOMAIN_TYPE_HVM));
> +
> + libxl__device_generic_add(gc, XBT_NULL, device,
> + libxl__xs_kvs_of_flexarray(gc, back,
> back->count),
> + libxl__xs_kvs_of_flexarray(gc, front,
> front->count),
> + NULL);
> +
> + rc = 0;
> +out:
> + return;
> +}
> +
There is one major issue with your implementation. You didn't handle
vtpm hot-plug and hot-unplug.
I think what you should do is to refactor libxl__device_vtpm_add to call
the right helpers (say libxl__device_vtpm_add_{pv,hvm}).
With this approach you don't need to worry about all the internal logic
of handling JSON template and locking etc. You might also be able to
nuke b_info->num_vtpms you added in previous patches.
Does this make sense?
> libxl_device_vtpm *libxl_device_vtpm_list(libxl_ctx *ctx, uint32_t domid,
> int *num)
> {
> GC_INIT(ctx);
> diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
> index c6f68fe..b2f61cb 100644
> --- a/tools/libxl/libxl_create.c
> +++ b/tools/libxl/libxl_create.c
> @@ -901,6 +901,12 @@ static void initiate_domain_create(libxl__egc *egc,
> d_config->nics[i].devid = ++last_devid;
> }
>
> + if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_HVM &&
> + d_config->num_vtpms > 0) {
> + ret = libxl__device_vtpm_setdefault(gc, d_config->vtpms);
> + if (ret) goto error_out;
> + }
> +
> if (restore_fd >= 0) {
> LOG(DEBUG, "restoring, not running bootloader");
> domcreate_bootloader_done(egc, &dcs->bl, 0);
> diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
> index 3e191c3..337ac64 100644
> --- a/tools/libxl/libxl_dm.c
> +++ b/tools/libxl/libxl_dm.c
> @@ -414,6 +414,7 @@ static char **
> libxl__build_device_model_args_new(libxl__gc *gc,
> const libxl_device_nic *nics = guest_config->nics;
> const int num_disks = guest_config->num_disks;
> const int num_nics = guest_config->num_nics;
> + const int num_vtpms = guest_config->num_vtpms;
> const libxl_vnc_info *vnc = libxl__dm_vnc(guest_config);
> const libxl_sdl_info *sdl = dm_sdl(guest_config);
> const char *keymap = dm_keymap(guest_config);
> @@ -747,6 +748,15 @@ static char **
> libxl__build_device_model_args_new(libxl__gc *gc,
> abort();
> }
>
> + /*add vTPM parameters for HVM virtual machine*/
> + if (b_info->type == LIBXL_DOMAIN_TYPE_HVM &&
> + num_vtpms >0) {
"> 0".
> + flexarray_vappend(dm_args, "-tpmdev",
> + "xenstubdoms,id=xenvtpm0", NULL);
Hardcoded id? I think we need to be more flexible on this.
Wei.
> + flexarray_vappend(dm_args,"-device",
> + "tpm-tis,tpmdev=xenvtpm0", NULL);
> + }
> +
> ram_size = libxl__sizekb_to_mb(b_info->max_memkb - b_info->video_memkb);
> flexarray_append(dm_args, "-m");
> flexarray_append(dm_args, libxl__sprintf(gc, "%"PRId64, ram_size));
> @@ -1412,6 +1422,12 @@ retry_transaction:
> spawn->failure_cb = device_model_startup_failed;
> spawn->detached_cb = device_model_detached;
>
> + /* Plug vtpm devices*/
> + if (b_info->type == LIBXL_DOMAIN_TYPE_HVM &&
> + guest_config->num_vtpms > 0){
> + libxl__device_hvm_vtpm_add(gc, domid, guest_config->vtpms);
> + }
> +
> rc = libxl__spawn_spawn(egc, spawn);
> if (rc < 0)
> goto out_close;
> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
> index 4361421..946b8cf 100644
> --- a/tools/libxl/libxl_internal.h
> +++ b/tools/libxl/libxl_internal.h
> @@ -2388,6 +2388,9 @@ _hidden void libxl__device_vtpm_add(libxl__egc *egc,
> uint32_t domid,
> libxl_device_vtpm *vtpm,
> libxl__ao_device *aodev);
>
> +void libxl__device_hvm_vtpm_add(libxl__gc *gc, uint32_t domid,
> + libxl_device_vtpm *vtpm);
> +
> /* Internal function to connect a vkb device */
> _hidden int libxl__device_vkb_add(libxl__gc *gc, uint32_t domid,
> libxl_device_vkb *vkb);
> --
> 1.8.3.2
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |