* [PATCH 1 of 4 v2] blktap3/libxl: add new device kind and disk back-end
2013-07-15 11:45 [PATCH 0 of 4 v2] blktap3/libxl: add support for blktap3 in libxl Thanos Makatos
@ 2013-07-15 11:45 ` Thanos Makatos
2013-07-15 11:45 ` [PATCH 2 of 4 v2] blktap3/libxl: Check whether blktap3 is available Thanos Makatos
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Thanos Makatos @ 2013-07-15 11:45 UTC (permalink / raw)
To: xen-devel; +Cc: thanos.makatos
We use new identifiers so that blktap2 and blktap3 can co-exist.
Signed-off-by: Thanos Makatos <thanos.makatos@citrix.com>
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -58,6 +58,7 @@ libxl_disk_backend = Enumeration("disk_b
(1, "PHY"),
(2, "TAP"),
(3, "QDISK"),
+ (4, "TAP3"),
])
libxl_nic_type = Enumeration("nic_type", [
diff --git a/tools/libxl/libxl_types_internal.idl b/tools/libxl/libxl_types_internal.idl
--- a/tools/libxl/libxl_types_internal.idl
+++ b/tools/libxl/libxl_types_internal.idl
@@ -20,6 +20,7 @@ libxl__device_kind = Enumeration("device
(6, "VKBD"),
(7, "CONSOLE"),
(8, "VTPM"),
+ (9, "VBD3"),
])
libxl__console_backend = Enumeration("console_backend", [
diff --git a/tools/libxl/libxlu_disk_l.c b/tools/libxl/libxlu_disk_l.c
--- a/tools/libxl/libxlu_disk_l.c
+++ b/tools/libxl/libxlu_disk_l.c
@@ -859,6 +859,7 @@ static void setformat(DiskParseContext *
static void setbackendtype(DiskParseContext *dpc, const char *str) {
if ( !strcmp(str,"phy")) DSET(dpc,backend,BACKEND,str,PHY);
else if (!strcmp(str,"tap")) DSET(dpc,backend,BACKEND,str,TAP);
+ else if (!strcmp(str,"tap3")) DSET(dpc,backend,BACKEND,str,TAP3);
else if (!strcmp(str,"qdisk")) DSET(dpc,backend,BACKEND,str,QDISK);
else xlu__disk_err(dpc,str,"unknown value for backendtype");
}
diff --git a/tools/libxl/libxlu_disk_l.l b/tools/libxl/libxlu_disk_l.l
--- a/tools/libxl/libxlu_disk_l.l
+++ b/tools/libxl/libxlu_disk_l.l
@@ -109,6 +109,7 @@ static void setformat(DiskParseContext *
static void setbackendtype(DiskParseContext *dpc, const char *str) {
if ( !strcmp(str,"phy")) DSET(dpc,backend,BACKEND,str,PHY);
else if (!strcmp(str,"tap")) DSET(dpc,backend,BACKEND,str,TAP);
+ else if (!strcmp(str,"tap3")) DSET(dpc,backend,BACKEND,str,TAP3);
else if (!strcmp(str,"qdisk")) DSET(dpc,backend,BACKEND,str,QDISK);
else xlu__disk_err(dpc,str,"unknown value for backendtype");
}
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 2 of 4 v2] blktap3/libxl: Check whether blktap3 is available
2013-07-15 11:45 [PATCH 0 of 4 v2] blktap3/libxl: add support for blktap3 in libxl Thanos Makatos
2013-07-15 11:45 ` [PATCH 1 of 4 v2] blktap3/libxl: add new device kind and disk back-end Thanos Makatos
@ 2013-07-15 11:45 ` Thanos Makatos
2013-07-15 11:45 ` [PATCH 3 of 4 v2] blktap3/libxl: Handles blktap3 device in libxl Thanos Makatos
2013-07-15 11:45 ` [PATCH 4 of 4 v2] blktap3/libxl: pygrub support for RAW and VHD images Thanos Makatos
3 siblings, 0 replies; 5+ messages in thread
From: Thanos Makatos @ 2013-07-15 11:45 UTC (permalink / raw)
To: xen-devel; +Cc: thanos.makatos
This patch implements function libxl__blktap3_enabled, the equivalent of the
existing libxl__blktap_enabled for blktap2. The checks performed are rather
simple and should be extended.
Signed-off-by: Thanos Makatos <thanos.makatos@citrix.com>
---
Changed since v1:
* Check whether tapback's control socket exists instead of checking whether
the process exists.
* Include the blktap3 header when compiling as this is where the path of
tapback's control socket is defined.
diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
--- a/tools/libxl/Makefile
+++ b/tools/libxl/Makefile
@@ -37,8 +37,11 @@ LIBXLU_LIBS =
LIBXL_OBJS-y = osdeps.o libxl_paths.o libxl_bootloader.o flexarray.o
ifeq ($(LIBXL_BLKTAP),y)
LIBXL_OBJS-y += libxl_blktap2.o
+LIBXL_OBJS-y += libxl_blktap3.o
+CFLAGS += -I$(XEN_ROOT)/tools/blktap3/include
else
LIBXL_OBJS-y += libxl_noblktap2.o
+LIBXL_OBJS-y += libxl_noblktap3.o
endif
LIBXL_OBJS-$(CONFIG_X86) += libxl_cpuid.o libxl_x86.o
LIBXL_OBJS-$(CONFIG_IA64) += libxl_nocpuid.o libxl_noarch.o
diff --git a/tools/libxl/libxl_blktap3.c b/tools/libxl/libxl_blktap3.c
new file mode 100644
--- /dev/null
+++ b/tools/libxl/libxl_blktap3.c
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2012 Citrix Ltd.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include "libxl_osdeps.h" /* must come before any other headers */
+#include "libxl_internal.h"
+#include <unistd.h>
+#include "blktap3.h"
+
+/*
+ * Simple sanity checks. Most of these checks are not race-free (e.g. checking
+ * wether the tapdisk binary exists), but at least we get some protection
+ * against spectacularly silly mistakes.
+ *
+ * We don't check whether the tapdisk binary exists as this is done by the
+ * tapback daemon.
+ */
+int libxl__blktap3_enabled(libxl__gc *gc)
+{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
+ int err;
+
+ /*
+ * Check whether the tapback daemon is running.
+ */
+ err = access(TAPBACK_CTL_SOCK_PATH, F_OK);
+ if (err) {
+ if (errno != ENOENT)
+ LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
+ "failed to check whether the tapback daemon is running\n");
+ return 0;
+ }
+
+ /*
+ * TODO Check for evtchn, gntdev. How do we do that!?
+ */
+
+ return 1;
+}
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -1343,6 +1343,14 @@ struct libxl__cpuid_policy {
};
/*
+ * blktap3 support
+ */
+/* libxl__blktap_enabled:
+ * return true if blktap3 support is available.
+ */
+_hidden int libxl__blktap3_enabled(libxl__gc *gc);
+
+/*
* blktap2 support
*/
diff --git a/tools/libxl/libxl_noblktap3.c b/tools/libxl/libxl_noblktap3.c
new file mode 100644
--- /dev/null
+++ b/tools/libxl/libxl_noblktap3.c
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2012 Citrix Ltd.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include "libxl_osdeps.h" /* must come before any other headers */
+#include "libxl_internal.h"
+
+int libxl__blktap3_enabled(libxl__gc *gc)
+{
+ return 0;
+}
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 3 of 4 v2] blktap3/libxl: Handles blktap3 device in libxl
2013-07-15 11:45 [PATCH 0 of 4 v2] blktap3/libxl: add support for blktap3 in libxl Thanos Makatos
2013-07-15 11:45 ` [PATCH 1 of 4 v2] blktap3/libxl: add new device kind and disk back-end Thanos Makatos
2013-07-15 11:45 ` [PATCH 2 of 4 v2] blktap3/libxl: Check whether blktap3 is available Thanos Makatos
@ 2013-07-15 11:45 ` Thanos Makatos
2013-07-15 11:45 ` [PATCH 4 of 4 v2] blktap3/libxl: pygrub support for RAW and VHD images Thanos Makatos
3 siblings, 0 replies; 5+ messages in thread
From: Thanos Makatos @ 2013-07-15 11:45 UTC (permalink / raw)
To: xen-devel; +Cc: thanos.makatos
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@citrix.com>
---
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);
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 4 of 4 v2] blktap3/libxl: pygrub support for RAW and VHD images
2013-07-15 11:45 [PATCH 0 of 4 v2] blktap3/libxl: add support for blktap3 in libxl Thanos Makatos
` (2 preceding siblings ...)
2013-07-15 11:45 ` [PATCH 3 of 4 v2] blktap3/libxl: Handles blktap3 device in libxl Thanos Makatos
@ 2013-07-15 11:45 ` Thanos Makatos
3 siblings, 0 replies; 5+ messages in thread
From: Thanos Makatos @ 2013-07-15 11:45 UTC (permalink / raw)
To: xen-devel; +Cc: thanos.makatos
This patch allows guests to boot from RAW and VHD images using pygrub.
Signed-off-by: Thanos Makatos <thanos.makatos@citrix.com>
diff --git a/tools/blktap3/drivers/tapdisk-control.c b/tools/blktap3/drivers/tapdisk-control.c
--- a/tools/blktap3/drivers/tapdisk-control.c
+++ b/tools/blktap3/drivers/tapdisk-control.c
@@ -910,7 +910,7 @@ tapdisk_control_xenblkif_connect(
assert(request);
assert(response);
- len = strnlen(request->u.string.text, TAPDISK_MESSAGE_STRING_LENGTH);
+ len = strnlen(request->u.blkif.params, TAPDISK_MESSAGE_STRING_LENGTH);
/* TODO boilerplate */
if (len < 1) {
err = -EINVAL;
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -2636,6 +2636,7 @@ void libxl__device_disk_local_initiate_a
}
break;
case LIBXL_DISK_BACKEND_QDISK:
+ case LIBXL_DISK_BACKEND_TAP3:
if (disk->format != LIBXL_DISK_FORMAT_RAW) {
libxl__prepare_ao_device(ao, &dls->aodev);
dls->aodev.callback = local_device_attach_cb;
@@ -2728,6 +2729,7 @@ void libxl__device_disk_local_initiate_d
switch (disk->backend) {
case LIBXL_DISK_BACKEND_QDISK:
+ case LIBXL_DISK_BACKEND_TAP3:
if (disk->vdev != NULL) {
GCNEW(device);
rc = libxl__device_from_disk(gc, LIBXL_TOOLSTACK_DOMID,
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
@@ -753,8 +753,8 @@ void libxl__wait_device_connection(libxl
*/
device_hotplug(egc, aodev);
return;
- }
-
+ } else if (aodev->dev->backend_kind == LIBXL__DEVICE_KIND_VBD3)
+ goto out;
rc = libxl__ev_devstate_wait(gc, &aodev->backend_ds,
device_backend_callback,
state_path, XenbusStateInitWait,
^ permalink raw reply [flat|nested] 5+ messages in thread