|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 3 of 4 v2] blktap3/libxl: Handles blktap3 device in libxl
Handling of blktap3 devices is similar to blktap2, except that libxl doesn't
spawn the tapdisk and doesn't create the physical device in dom0.
Signed-off-by: Thanos Makatos <thanos.makatos@xxxxxxxxxx>
---
Changed since v1:
* Don't duplicate code for writing the type:/path/to/file to XenStore.
Changed since v2:
* Fixed a warning in libxl when destroying a blktap3-based domain.
* Removed TODO comment regarding scripts.
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -1159,6 +1159,8 @@ static void disk_eject_xswatch_callback(
disk->backend = LIBXL_DISK_BACKEND_TAP;
} else if (!strcmp(backend_type, "qdisk")) {
disk->backend = LIBXL_DISK_BACKEND_QDISK;
+ } else if (!strcmp(backend_type, "tap3")) {
+ disk->backend = LIBXL_DISK_BACKEND_TAP3;
} else {
disk->backend = LIBXL_DISK_BACKEND_UNKNOWN;
}
@@ -2013,6 +2015,9 @@ int libxl__device_from_disk(libxl__gc *g
case LIBXL_DISK_BACKEND_QDISK:
device->backend_kind = LIBXL__DEVICE_KIND_QDISK;
break;
+ case LIBXL_DISK_BACKEND_TAP3:
+ device->backend_kind = LIBXL__DEVICE_KIND_VBD3;
+ break;
default:
LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type:
%d\n",
disk->backend);
@@ -2138,11 +2143,15 @@ static void device_disk_add(libxl__egc *
/* now create a phy device to export the device to the guest */
goto do_backend_phy;
+ case LIBXL_DISK_BACKEND_TAP3:
case LIBXL_DISK_BACKEND_QDISK:
flexarray_append(back, "params");
flexarray_append(back, libxl__sprintf(gc, "%s:%s",
libxl__device_disk_string_of_format(disk->format), disk->pdev_path));
- assert(device->backend_kind == LIBXL__DEVICE_KIND_QDISK);
+ assert(
+ (disk->backend == LIBXL_DISK_BACKEND_QDISK
+ && device->backend_kind == LIBXL__DEVICE_KIND_QDISK)
+ || (disk->backend == LIBXL_DISK_BACKEND_TAP3));
break;
default:
LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend
type: %d\n", disk->backend);
diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c
+++ b/tools/libxl/libxl_device.c
@@ -218,6 +218,22 @@ static int disk_try_backend(disk_try_bac
}
return backend;
+ case LIBXL_DISK_BACKEND_TAP3:
+ if (a->disk->script) goto bad_script;
+
+ if (!libxl__blktap3_enabled(a->gc)) {
+ LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Disk vdev=%s, backend tap"
+ " unsuitable because blktap3 not available",
+ a->disk->vdev);
+ return 0;
+ }
+ /* TODO other formats supported by blktap3? */
+ if (!(a->disk->format == LIBXL_DISK_FORMAT_RAW ||
+ a->disk->format == LIBXL_DISK_FORMAT_VHD)) {
+ goto bad_format;
+ }
+ return backend;
+
case LIBXL_DISK_BACKEND_QDISK:
if (a->disk->script) goto bad_script;
return backend;
@@ -289,6 +305,7 @@ int libxl__device_disk_set_backend(libxl
ok=
disk_try_backend(&a, LIBXL_DISK_BACKEND_PHY) ?:
disk_try_backend(&a, LIBXL_DISK_BACKEND_TAP) ?:
+ disk_try_backend(&a, LIBXL_DISK_BACKEND_TAP3) ?:
disk_try_backend(&a, LIBXL_DISK_BACKEND_QDISK);
if (ok)
LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Disk vdev=%s, using backend %s",
@@ -321,6 +338,7 @@ char *libxl__device_disk_string_of_backe
switch (backend) {
case LIBXL_DISK_BACKEND_QDISK: return "qdisk";
case LIBXL_DISK_BACKEND_TAP: return "phy";
+ case LIBXL_DISK_BACKEND_TAP3: return "phy";
case LIBXL_DISK_BACKEND_PHY: return "phy";
default: return NULL;
}
@@ -790,7 +808,8 @@ void libxl__initiate_device_remove(libxl
goto out;
}
return;
- }
+ } else if (aodev->dev->backend_kind == LIBXL__DEVICE_KIND_VBD3)
+ goto out;
for (;;) {
rc = libxl__xs_transaction_start(gc, &t);
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |