* [PATCH 0 of 4 v2] blktap3/libxl: add support for blktap3 in libxl
@ 2013-07-15 11:45 Thanos Makatos
2013-07-15 11:45 ` [PATCH 1 of 4 v2] blktap3/libxl: add new device kind and disk back-end Thanos Makatos
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Thanos Makatos @ 2013-07-15 11:45 UTC (permalink / raw)
To: xen-devel; +Cc: thanos.makatos
This patch series implements support for blktap3 in libxl.
Supporting blktap3 requires rather few changes:
1. We introduce a new disk back-end type (TAP3) and a new device kind (VBD3) to
allow blktap3 to co-exist with blktap3. blktap2 remains the default back-end
for tap devices. Switching in the future to blktap3 as the default handler
of tap devices should be trivial.
2. libxl doesn't spawn the tapdisk process any more, as is the case for
blktap2, since the tapback daemon is responsible for that. Thus, libxl only
needs to write to XenStore the file/partition/whatever backing the virtual
disk so that the tapback daemon can pass it to tapdisk.
3. Booting with pygrub from VHD files is trivially done by attaching blkfront
to dom0.
Signed-off-by: Thanos Makatos <thanos.makatos@citrix.com>
---
Changed since v1:
* Check whether tapback's control socket exists instead of checking whether
a process named "tapback" exists.
* Don't duplicate code for writing the type:/path/to/file to XenStore.
Changed since v2:
* Support for booting from RAW and VHD images using pygrub.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [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
end of thread, other threads:[~2013-07-15 11:45 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 ` [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
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).