From: Juergen Gross <jgross@suse.com>
To: xen-devel@lists.xen.org
Cc: Juergen Gross <jgross@suse.com>,
wei.liu2@citrix.com, ian.jackson@eu.citrix.com
Subject: [PATCH 1/3] libxl: add framework for device types
Date: Tue, 21 Jun 2016 16:24:49 +0200 [thread overview]
Message-ID: <1466519091-29348-2-git-send-email-jgross@suse.com> (raw)
In-Reply-To: <1466519091-29348-1-git-send-email-jgross@suse.com>
Instead of duplicate coding for each device type (vtpms, usbctrls, ...)
especially on domain creation introduce a framework for that purpose.
Signed-off-by: Juergen Gross <jgross@suse.com>
---
tools/libxl/libxl.c | 12 ++++
tools/libxl/libxl_create.c | 163 +++++++++++++------------------------------
tools/libxl/libxl_internal.h | 13 ++++
tools/libxl/libxl_pvusb.c | 13 ++++
4 files changed, 87 insertions(+), 114 deletions(-)
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 1c81239..df94f2e 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -7434,6 +7434,18 @@ out:
return rc;
}
+struct libxl_device_type libxl__nic_devtype = {
+ .type = "nic",
+ .num_offset = offsetof(libxl_domain_config, num_nics),
+ .add = libxl__add_nics,
+};
+
+struct libxl_device_type libxl__vtpm_devtype = {
+ .type = "vtpm",
+ .num_offset = offsetof(libxl_domain_config, num_vtpms),
+ .add = libxl__add_vtpms,
+};
+
/*
* Local variables:
* mode: C
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index 1b99472..bb0f535 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -742,12 +742,6 @@ 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_usbctrls(libxl__egc *egc,
- libxl__multidev *multidev, int ret);
-static void domcreate_attach_usbdevs(libxl__egc *egc, libxl__multidev *multidev,
- int ret);
static void domcreate_attach_pci(libxl__egc *egc, libxl__multidev *aodevs,
int ret);
static void domcreate_attach_dtdev(libxl__egc *egc,
@@ -1407,6 +1401,53 @@ static void domcreate_launch_dm(libxl__egc *egc, libxl__multidev *multidev,
domcreate_complete(egc, dcs, ret);
}
+static struct libxl_device_type *device_type_tbl[] = {
+ &libxl__nic_devtype,
+ &libxl__vtpm_devtype,
+ &libxl__usbctrl_devtype,
+ &libxl__usbdev_devtype,
+};
+
+static void domcreate_attach_devices(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;
+ struct libxl_device_type *dt;
+
+ if (ret) {
+ LOG(ERROR, "unable to add %s devices",
+ device_type_tbl[dcs->device_type_idx]->type);
+ goto error_out;
+ }
+
+ dcs->device_type_idx++;
+ if (dcs->device_type_idx < ARRAY_SIZE(device_type_tbl)) {
+ dt = device_type_tbl[dcs->device_type_idx];
+ if (*(int *)((void *)d_config + dt->num_offset) > 0) {
+ /* Attach devices */
+ libxl__multidev_begin(ao, &dcs->multidev);
+ dcs->multidev.callback = domcreate_attach_devices;
+ dt->add(egc, ao, domid, d_config, &dcs->multidev);
+ libxl__multidev_prepared(egc, &dcs->multidev, 0);
+ return;
+ }
+
+ domcreate_attach_devices(egc, &dcs->multidev, 0);
+ return;
+ }
+
+ domcreate_attach_pci(egc, multidev, 0);
+ return;
+
+error_out:
+ assert(ret);
+ domcreate_complete(egc, dcs, ret);
+}
+
static void domcreate_devmodel_started(libxl__egc *egc,
libxl__dm_spawn_state *dmss,
int ret)
@@ -1430,113 +1471,8 @@ static void domcreate_devmodel_started(libxl__egc *egc,
}
}
- /* Plug nic interfaces */
- if (d_config->num_nics > 0) {
- /* Attach nics */
- libxl__multidev_begin(ao, &dcs->multidev);
- dcs->multidev.callback = domcreate_attach_vtpms;
- libxl__add_nics(egc, ao, domid, d_config, &dcs->multidev);
- libxl__multidev_prepared(egc, &dcs->multidev, 0);
- return;
- }
-
- domcreate_attach_vtpms(egc, &dcs->multidev, 0);
- return;
-
-error_out:
- assert(ret);
- 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_usbctrls;
- libxl__add_vtpms(egc, ao, domid, d_config, &dcs->multidev);
- libxl__multidev_prepared(egc, &dcs->multidev, 0);
- return;
- }
-
- domcreate_attach_usbctrls(egc, multidev, 0);
- return;
-
-error_out:
- assert(ret);
- domcreate_complete(egc, dcs, ret);
-}
-
-static void domcreate_attach_usbctrls(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 vtpm devices");
- goto error_out;
- }
-
- if (d_config->num_usbctrls > 0) {
- /* Attach usbctrls */
- libxl__multidev_begin(ao, &dcs->multidev);
- dcs->multidev.callback = domcreate_attach_usbdevs;
- libxl__add_usbctrls(egc, ao, domid, d_config, &dcs->multidev);
- libxl__multidev_prepared(egc, &dcs->multidev, 0);
- return;
- }
-
- domcreate_attach_usbdevs(egc, multidev, 0);
- return;
-
-error_out:
- assert(ret);
- domcreate_complete(egc, dcs, ret);
-}
-
-
-static void domcreate_attach_usbdevs(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 usbctrl devices");
- goto error_out;
- }
-
- if (d_config->num_usbdevs > 0) {
- /* Attach usbctrls */
- libxl__multidev_begin(ao, &dcs->multidev);
- dcs->multidev.callback = domcreate_attach_pci;
- libxl__add_usbdevs(egc, ao, domid, d_config, &dcs->multidev);
- libxl__multidev_prepared(egc, &dcs->multidev, 0);
- return;
- }
-
- domcreate_attach_pci(egc, multidev, 0);
+ dcs->device_type_idx = -1;
+ domcreate_attach_devices(egc, &dcs->multidev, 0);
return;
error_out:
@@ -1556,7 +1492,6 @@ 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 usb devices");
goto error_out;
}
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index e7ab85d..2603b33 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -3389,6 +3389,18 @@ _hidden void libxl__bootloader_init(libxl__bootloader_state *bl);
* If callback is passed rc==0, will have updated st->info appropriately */
_hidden void libxl__bootloader_run(libxl__egc*, libxl__bootloader_state *st);
+/*----- Generic Device Handling -----*/
+struct libxl_device_type {
+ char *type;
+ int num_offset; /* Offset of # of devices in libxl_domain_config */
+ void (*add)(libxl__egc *, libxl__ao *, uint32_t, libxl_domain_config *,
+ libxl__multidev *);
+};
+
+extern struct libxl_device_type libxl__nic_devtype;
+extern struct libxl_device_type libxl__vtpm_devtype;
+extern struct libxl_device_type libxl__usbctrl_devtype;
+extern struct libxl_device_type libxl__usbdev_devtype;
/*----- Domain destruction -----*/
/* Domain destruction has been split into two functions:
@@ -3565,6 +3577,7 @@ struct libxl__domain_create_state {
libxl_asyncprogress_how aop_console_how;
/* private to domain_create */
int guest_domid;
+ int device_type_idx;
const char *colo_proxy_script;
libxl__domain_build_state build_state;
libxl__colo_restore_state crs;
diff --git a/tools/libxl/libxl_pvusb.c b/tools/libxl/libxl_pvusb.c
index 885f0d4..31c38b9 100644
--- a/tools/libxl/libxl_pvusb.c
+++ b/tools/libxl/libxl_pvusb.c
@@ -1667,6 +1667,19 @@ out:
GC_FREE;
return rc;
}
+
+struct libxl_device_type libxl__usbctrl_devtype = {
+ .type = "usbctrl",
+ .num_offset = offsetof(libxl_domain_config, num_usbctrls),
+ .add = libxl__add_usbctrls,
+};
+
+struct libxl_device_type libxl__usbdev_devtype = {
+ .type = "usbdev",
+ .num_offset = offsetof(libxl_domain_config, num_usbdevs),
+ .add = libxl__add_usbdevs,
+};
+
/*
* Local variables:
* mode: C
--
2.6.6
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2016-06-21 14:24 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-21 14:24 [PATCH 0/3] libxl: add framework for device types Juergen Gross
2016-06-21 14:24 ` Juergen Gross [this message]
2016-06-21 14:24 ` [PATCH 2/3] libxl: refactor domcreate_attach_pci() to use device type framework Juergen Gross
2016-06-21 14:24 ` [PATCH 3/3] libxl: refactor domcreate_attach_dtdev() " Juergen Gross
2016-07-04 10:26 ` [PATCH 0/3] libxl: add framework for device types Juergen Gross
2016-07-06 11:04 ` Ian Jackson
2016-07-06 12:40 ` Juergen Gross
2016-07-06 12:47 ` Ian Jackson
2016-07-06 12:55 ` Juergen Gross
2016-07-06 16:09 ` Ian Jackson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1466519091-29348-2-git-send-email-jgross@suse.com \
--to=jgross@suse.com \
--cc=ian.jackson@eu.citrix.com \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).