[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH v2] libxl: make libxl_device_{vkb, vfb}_add async operations.



Add an ao parameter to both functions, since they may become slow in
the future.

Also move the functions to libxl_device.c, as done with disk and nic
add fuctions, so libxl_device_{vkb,vfb}_add are mere wrappers arround
libxl__device_{vkb,vfb}_add, that can be called from a running AO
operation. Quite a lot of code motion here also, and integration with
the new AO domain creation.

This should be applied after my "libxl: call hotplug scripts from
libxl for vif" series.

Changes since v1:

 * Everything as far as I can tell.

Signed-off-by: Roger Pau Monne <roger.pau@xxxxxxxxxx>
---
 tools/libxl/libxl.c          |  148 +++++++-----------------------------------
 tools/libxl/libxl.h          |    6 +-
 tools/libxl/libxl_create.c   |  100 ++++++++++++++++++++++++++--
 tools/libxl/libxl_device.c   |  147 +++++++++++++++++++++++++++++++++++++++++
 tools/libxl/libxl_dm.c       |    4 +-
 tools/libxl/libxl_internal.h |   13 ++++-
 6 files changed, 281 insertions(+), 137 deletions(-)

diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 5a681b1..f50ecaf 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -1962,69 +1962,25 @@ int libxl__device_vkb_setdefault(libxl__gc *gc, 
libxl_device_vkb *vkb)
     return 0;
 }
 
-static int libxl__device_from_vkb(libxl__gc *gc, uint32_t domid,
-                                  libxl_device_vkb *vkb,
-                                  libxl__device *device)
-{
-    device->backend_devid = vkb->devid;
-    device->backend_domid = vkb->backend_domid;
-    device->backend_kind = LIBXL__DEVICE_KIND_VKBD;
-    device->devid = vkb->devid;
-    device->domid = domid;
-    device->kind = LIBXL__DEVICE_KIND_VKBD;
-
-    return 0;
-}
-
-int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb)
+int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb,
+                         const libxl_asyncop_how *ao_how)
 {
-    GC_INIT(ctx);
-    flexarray_t *front;
-    flexarray_t *back;
-    libxl__device device;
+    AO_CREATE(ctx, domid, ao_how);
+    libxl__ao_device *device;
     int rc;
 
-    rc = libxl__device_vkb_setdefault(gc, vkb);
-    if (rc) goto out;
-
-    front = flexarray_make(16, 1);
-    if (!front) {
-        rc = ERROR_NOMEM;
+    GCNEW(device);
+    libxl__init_ao_device(device, ao, NULL);
+    device->callback = libxl__device_cb;
+    rc = libxl__device_vkb_add(egc, domid, vkb, device);
+    if (rc) {
+        LOGE(ERROR, "unable to add vkb %d", vkb->devid);
         goto out;
     }
-    back = flexarray_make(16, 1);
-    if (!back) {
-        rc = ERROR_NOMEM;
-        goto out_free;
-    }
-
-    rc = libxl__device_from_vkb(gc, domid, vkb, &device);
-    if (rc != 0) goto out_free;
-
-    flexarray_append(back, "frontend-id");
-    flexarray_append(back, libxl__sprintf(gc, "%d", domid));
-    flexarray_append(back, "online");
-    flexarray_append(back, "1");
-    flexarray_append(back, "state");
-    flexarray_append(back, libxl__sprintf(gc, "%d", 1));
-    flexarray_append(back, "domain");
-    flexarray_append(back, libxl__domid_to_name(gc, domid));
-
-    flexarray_append(front, "backend-id");
-    flexarray_append(front, libxl__sprintf(gc, "%d", vkb->backend_domid));
-    flexarray_append(front, "state");
-    flexarray_append(front, libxl__sprintf(gc, "%d", 1));
 
-    libxl__device_generic_add(gc, &device,
-                             libxl__xs_kvs_of_flexarray(gc, back, back->count),
-                             libxl__xs_kvs_of_flexarray(gc, front, 
front->count));
-    rc = 0;
-out_free:
-    flexarray_free(back);
-    flexarray_free(front);
 out:
-    GC_FREE;
-    return rc;
+    if (rc) return AO_ABORT(rc);
+    return AO_INPROGRESS;
 }
 
 int libxl_device_vkb_remove(libxl_ctx *ctx, uint32_t domid,
@@ -2089,81 +2045,25 @@ int libxl__device_vfb_setdefault(libxl__gc *gc, 
libxl_device_vfb *vfb)
     return 0;
 }
 
-static int libxl__device_from_vfb(libxl__gc *gc, uint32_t domid,
-                                  libxl_device_vfb *vfb,
-                                  libxl__device *device)
-{
-    device->backend_devid = vfb->devid;
-    device->backend_domid = vfb->backend_domid;
-    device->backend_kind = LIBXL__DEVICE_KIND_VFB;
-    device->devid = vfb->devid;
-    device->domid = domid;
-    device->kind = LIBXL__DEVICE_KIND_VFB;
-    return 0;
-}
-
-int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb)
+int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb,
+                         const libxl_asyncop_how *ao_how)
 {
-    GC_INIT(ctx);
-    flexarray_t *front;
-    flexarray_t *back;
-    libxl__device device;
+    AO_CREATE(ctx, domid, ao_how);
+    libxl__ao_device *device;
     int rc;
 
-    rc = libxl__device_vfb_setdefault(gc, vfb);
-    if (rc) goto out;
-
-    front = flexarray_make(16, 1);
-    if (!front) {
-        rc = ERROR_NOMEM;
+    GCNEW(device);
+    libxl__init_ao_device(device, ao, NULL);
+    device->callback = libxl__device_cb;
+    rc = libxl__device_vfb_add(egc, domid, vfb, device);
+    if (rc) {
+        LOGE(ERROR, "unable to add vfb %d", vfb->devid);
         goto out;
     }
-    back = flexarray_make(16, 1);
-    if (!back) {
-        rc = ERROR_NOMEM;
-        goto out_free;
-    }
-
-    rc = libxl__device_from_vfb(gc, domid, vfb, &device);
-    if (rc != 0) goto out_free;
-
-    flexarray_append_pair(back, "frontend-id", libxl__sprintf(gc, "%d", 
domid));
-    flexarray_append_pair(back, "online", "1");
-    flexarray_append_pair(back, "state", libxl__sprintf(gc, "%d", 1));
-    flexarray_append_pair(back, "domain", libxl__domid_to_name(gc, domid));
-    flexarray_append_pair(back, "vnc",
-                          libxl_defbool_val(vfb->vnc.enable) ? "1" : "0");
-    flexarray_append_pair(back, "vnclisten", vfb->vnc.listen);
-    flexarray_append_pair(back, "vncpasswd", vfb->vnc.passwd);
-    flexarray_append_pair(back, "vncdisplay",
-                          libxl__sprintf(gc, "%d", vfb->vnc.display));
-    flexarray_append_pair(back, "vncunused",
-                          libxl_defbool_val(vfb->vnc.findunused) ? "1" : "0");
-    flexarray_append_pair(back, "sdl",
-                          libxl_defbool_val(vfb->sdl.enable) ? "1" : "0");
-    flexarray_append_pair(back, "opengl",
-                          libxl_defbool_val(vfb->sdl.opengl) ? "1" : "0");
-    if (vfb->sdl.xauthority) {
-        flexarray_append_pair(back, "xauthority", vfb->sdl.xauthority);
-    }
-    if (vfb->sdl.display) {
-        flexarray_append_pair(back, "display", vfb->sdl.display);
-    }
-
-    flexarray_append_pair(front, "backend-id",
-                          libxl__sprintf(gc, "%d", vfb->backend_domid));
-    flexarray_append_pair(front, "state", libxl__sprintf(gc, "%d", 1));
 
-    libxl__device_generic_add(gc, &device,
-                             libxl__xs_kvs_of_flexarray(gc, back, back->count),
-                             libxl__xs_kvs_of_flexarray(gc, front, 
front->count));
-    rc = 0;
-out_free:
-    flexarray_free(front);
-    flexarray_free(back);
 out:
-    GC_FREE;
-    return rc;
+    if (rc) return AO_ABORT(rc);
+    return AO_INPROGRESS;
 }
 
 int libxl_device_vfb_remove(libxl_ctx *ctx, uint32_t domid,
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index 6689baf..0497175 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -700,14 +700,16 @@ int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t 
domid,
                               libxl_device_nic *nic, libxl_nicinfo *nicinfo);
 
 /* Keyboard */
-int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb 
*vkb);
+int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb,
+                         const libxl_asyncop_how *ao_how);
 int libxl_device_vkb_remove(libxl_ctx *ctx, uint32_t domid,
                             libxl_device_vkb *vkb,
                             const libxl_asyncop_how *ao_how);
 int libxl_device_vkb_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb 
*vkb);
 
 /* Framebuffer */
-int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb 
*vfb);
+int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb,
+                         const libxl_asyncop_how *ao_how);
 int libxl_device_vfb_remove(libxl_ctx *ctx, uint32_t domid,
                             libxl_device_vfb *vfb,
                             const libxl_asyncop_how *ao_how);
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index 69f4e4d..974ed89 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -602,6 +602,11 @@ static void domcreate_bootloader_done(libxl__egc *egc,
 static void domcreate_disk_connected(libxl__egc *egc,
                                      libxl__ao_device *aorm);
 
+static void domcreate_misc_connected(libxl__egc *egc, libxl__ao_device *aorm);
+
+static void domcreate_start_devmodel(libxl__egc *egc,
+                                     libxl__domain_create_state *dcs);
+
 static void domcreate_console_available(libxl__egc *egc,
                                         libxl__domain_create_state *dcs);
 
@@ -775,7 +780,6 @@ static void domcreate_disk_connected(libxl__egc *egc, 
libxl__ao_device *aorm)
     const uint32_t domid = dcs->guest_domid;
     libxl_domain_config *const d_config = dcs->guest_config;
     libxl__domain_build_state *const state = &dcs->build_state;
-    libxl_ctx *const ctx = CTX;
 
     ret = libxl__ao_device_check_last(gc, aorm, dcs->devices,
                                       dcs->num_devices, &last);
@@ -797,8 +801,8 @@ static void domcreate_disk_connected(libxl__egc *egc, 
libxl__ao_device *aorm)
     switch (d_config->c_info.type) {
     case LIBXL_DOMAIN_TYPE_HVM:
     {
-        libxl__device_console console;
         libxl_device_vkb vkb;
+        libxl__device_console console;
 
         ret = init_console_info(&console, 0);
         if ( ret )
@@ -806,10 +810,94 @@ static void domcreate_disk_connected(libxl__egc *egc, 
libxl__ao_device *aorm)
         libxl__device_console_add(gc, domid, &console, state);
         libxl__device_console_dispose(&console);
 
+        GCNEW_ARRAY(dcs->devices, 1);
+        dcs->num_devices = 1;
+        libxl__init_ao_device(&dcs->devices[0], ao, &dcs->devices);
+        dcs->devices[0].callback = domcreate_misc_connected;
         libxl_device_vkb_init(&vkb);
-        libxl_device_vkb_add(ctx, domid, &vkb);
+        libxl__device_vkb_add(egc, domid, &vkb, &dcs->devices[0]);
         libxl_device_vkb_dispose(&vkb);
 
+        return;
+    }
+    case LIBXL_DOMAIN_TYPE_PV:
+    {
+        GCNEW_ARRAY(dcs->devices, d_config->num_vfbs*2);
+        dcs->num_devices = d_config->num_vfbs*2;
+        for (i = 0; i < d_config->num_vfbs; i++) {
+            libxl__init_ao_device(&dcs->devices[i], ao, &dcs->devices);
+            dcs->devices[i].callback = domcreate_misc_connected;
+            libxl__init_ao_device(&dcs->devices[i+1], ao, &dcs->devices);
+            dcs->devices[i+1].callback = domcreate_misc_connected;
+            libxl__device_vfb_add(egc, domid, &d_config->vfbs[i],
+                                  &dcs->devices[i]);
+            libxl__device_vkb_add(egc, domid, &d_config->vkbs[i],
+                                  &dcs->devices[i+1]);
+        }
+
+        if (!dcs->num_devices)
+            domcreate_start_devmodel(egc, dcs);
+
+        return;
+    }
+    default:
+        ret = ERROR_INVAL;
+        goto error_out;
+    }
+    abort(); /* not reached */
+
+ error_out:
+    assert(ret);
+    domcreate_complete(egc, dcs, ret);
+}
+
+static void domcreate_misc_connected(libxl__egc *egc, libxl__ao_device *aorm)
+{
+    STATE_AO_GC(aorm->ao);
+    libxl__domain_create_state *dcs = CONTAINER_OF(aorm->base, *dcs, devices);
+    int last, ret = 0;
+
+    aorm->state = DEVICE_FINISHED;
+
+    ret = libxl__ao_device_check_last(gc, aorm, dcs->devices,
+                                      dcs->num_devices, &last);
+    if (!last) return;
+    if (last && ret) {
+        LOGE(ERROR, "error connecting misc devices");
+        goto error_out;
+    }
+
+    domcreate_start_devmodel(egc, dcs);
+    return;
+
+error_out:
+    assert(ret);
+    domcreate_complete(egc, dcs, ret);
+}
+
+static void domcreate_start_devmodel(libxl__egc *egc,
+                                     libxl__domain_create_state *dcs)
+{
+    STATE_AO_GC(dcs->ao);
+    int ret;
+
+    /* convenience aliases */
+    const uint32_t domid = dcs->guest_domid;
+    libxl_domain_config *const d_config = dcs->guest_config;
+    libxl__domain_build_state *const state = &dcs->build_state;
+
+    /* We might be going to call libxl__spawn_local_dm, or _spawn_stub_dm.
+     * Fill in any field required by either, including both relevant
+     * callbacks (_spawn_stub_dm will overwrite our trespass if needed). */
+    dcs->dmss.dm.spawn.ao = ao;
+    dcs->dmss.dm.guest_config = dcs->guest_config;
+    dcs->dmss.dm.build_state = &dcs->build_state;
+    dcs->dmss.dm.callback = domcreate_devmodel_started;
+    dcs->dmss.callback = domcreate_devmodel_started;
+
+    switch (d_config->c_info.type) {
+    case LIBXL_DOMAIN_TYPE_HVM:
+    {
         dcs->dmss.dm.guest_domid = domid;
         if (libxl_defbool_val(d_config->b_info.device_model_stubdomain))
             libxl__spawn_stub_dm(egc, &dcs->dmss);
@@ -822,11 +910,6 @@ static void domcreate_disk_connected(libxl__egc *egc, 
libxl__ao_device *aorm)
         int need_qemu = 0;
         libxl__device_console console;
 
-        for (i = 0; i < d_config->num_vfbs; i++) {
-            libxl_device_vfb_add(ctx, domid, &d_config->vfbs[i]);
-            libxl_device_vkb_add(ctx, domid, &d_config->vkbs[i]);
-        }
-
         ret = init_console_info(&console, 0);
         if ( ret )
             goto error_out;
@@ -862,6 +945,7 @@ static void domcreate_disk_connected(libxl__egc *egc, 
libxl__ao_device *aorm)
     domcreate_complete(egc, dcs, ret);
 }
 
+
 static void domcreate_devmodel_started(libxl__egc *egc,
                                        libxl__dm_spawn_state *dmss,
                                        int ret)
diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c
index 6b431a2..f2c4d50 100644
--- a/tools/libxl/libxl_device.c
+++ b/tools/libxl/libxl_device.c
@@ -205,6 +205,33 @@ int libxl__device_from_nic(libxl__gc *gc, uint32_t domid,
     return 0;
 }
 
+int libxl__device_from_vkb(libxl__gc *gc, uint32_t domid,
+                           libxl_device_vkb *vkb,
+                           libxl__device *device)
+{
+    device->backend_devid = vkb->devid;
+    device->backend_domid = vkb->backend_domid;
+    device->backend_kind = LIBXL__DEVICE_KIND_VKBD;
+    device->devid = vkb->devid;
+    device->domid = domid;
+    device->kind = LIBXL__DEVICE_KIND_VKBD;
+
+    return 0;
+}
+
+int libxl__device_from_vfb(libxl__gc *gc, uint32_t domid,
+                           libxl_device_vfb *vfb,
+                           libxl__device *device)
+{
+    device->backend_devid = vfb->devid;
+    device->backend_domid = vfb->backend_domid;
+    device->backend_kind = LIBXL__DEVICE_KIND_VFB;
+    device->devid = vfb->devid;
+    device->domid = domid;
+    device->kind = LIBXL__DEVICE_KIND_VFB;
+    return 0;
+}
+
 int libxl__device_disk_add(libxl__egc *egc, uint32_t domid,
                            libxl_device_disk *disk,
                            libxl__ao_device *aorm)
@@ -445,6 +472,126 @@ out:
     return rc;
 }
 
+int libxl__device_vkb_add(libxl__egc *egc, uint32_t domid,
+                          libxl_device_vkb *vkb, libxl__ao_device *aorm)
+{
+    STATE_AO_GC(aorm->ao);
+    flexarray_t *front;
+    flexarray_t *back;
+    libxl__device *device;
+    int rc;
+
+    rc = libxl__device_vkb_setdefault(gc, vkb);
+    if (rc) goto out;
+
+    front = flexarray_make(16, 1);
+    if (!front) {
+        rc = ERROR_NOMEM;
+        goto out;
+    }
+    back = flexarray_make(16, 1);
+    if (!back) {
+        rc = ERROR_NOMEM;
+        goto out_free;
+    }
+
+    GCNEW(device);
+    rc = libxl__device_from_vkb(gc, domid, vkb, device);
+    if (rc != 0) goto out_free;
+
+    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));
+    flexarray_append(back, "domain");
+    flexarray_append(back, libxl__domid_to_name(gc, domid));
+
+    flexarray_append(front, "backend-id");
+    flexarray_append(front, GCSPRINTF("%d", vkb->backend_domid));
+    flexarray_append(front, "state");
+    flexarray_append(front, GCSPRINTF("%d", 1));
+
+    libxl__device_generic_add(gc, device,
+                        libxl__xs_kvs_of_flexarray(gc, back, back->count),
+                        libxl__xs_kvs_of_flexarray(gc, front, front->count));
+    rc = 0;
+out_free:
+    flexarray_free(back);
+    flexarray_free(front);
+out:
+    aorm->rc = rc;
+    aorm->callback(egc, aorm);
+    return rc;
+}
+
+int libxl__device_vfb_add(libxl__egc *egc, uint32_t domid,
+                          libxl_device_vfb *vfb, libxl__ao_device *aorm)
+{
+    STATE_AO_GC(aorm->ao);
+    flexarray_t *front;
+    flexarray_t *back;
+    libxl__device *device;
+    int rc;
+
+    rc = libxl__device_vfb_setdefault(gc, vfb);
+    if (rc) goto out;
+
+    front = flexarray_make(16, 1);
+    if (!front) {
+        rc = ERROR_NOMEM;
+        goto out;
+    }
+    back = flexarray_make(16, 1);
+    if (!back) {
+        rc = ERROR_NOMEM;
+        goto out_free;
+    }
+
+    GCNEW(device);
+    rc = libxl__device_from_vfb(gc, domid, vfb, device);
+    if (rc != 0) goto out_free;
+
+    flexarray_append_pair(back, "frontend-id", GCSPRINTF("%d", domid));
+    flexarray_append_pair(back, "online", "1");
+    flexarray_append_pair(back, "state", GCSPRINTF("%d", 1));
+    flexarray_append_pair(back, "domain", libxl__domid_to_name(gc, domid));
+    flexarray_append_pair(back, "vnc",
+                          libxl_defbool_val(vfb->vnc.enable) ? "1" : "0");
+    flexarray_append_pair(back, "vnclisten", vfb->vnc.listen);
+    flexarray_append_pair(back, "vncpasswd", vfb->vnc.passwd);
+    flexarray_append_pair(back, "vncdisplay",
+                                GCSPRINTF("%d", vfb->vnc.display));
+    flexarray_append_pair(back, "vncunused",
+                          libxl_defbool_val(vfb->vnc.findunused) ? "1" : "0");
+    flexarray_append_pair(back, "sdl",
+                          libxl_defbool_val(vfb->sdl.enable) ? "1" : "0");
+    flexarray_append_pair(back, "opengl",
+                          libxl_defbool_val(vfb->sdl.opengl) ? "1" : "0");
+    if (vfb->sdl.xauthority) {
+        flexarray_append_pair(back, "xauthority", vfb->sdl.xauthority);
+    }
+    if (vfb->sdl.display) {
+        flexarray_append_pair(back, "display", vfb->sdl.display);
+    }
+
+    flexarray_append_pair(front, "backend-id",
+                                 GCSPRINTF("%d", vfb->backend_domid));
+    flexarray_append_pair(front, "state", GCSPRINTF("%d", 1));
+
+    libxl__device_generic_add(gc, device,
+                        libxl__xs_kvs_of_flexarray(gc, back, back->count),
+                        libxl__xs_kvs_of_flexarray(gc, front, front->count));
+    rc = 0;
+out_free:
+    flexarray_free(front);
+    flexarray_free(back);
+out:
+    aorm->rc = rc;
+    aorm->callback(egc, aorm);
+    return rc;
+}
 
 typedef struct {
     libxl__gc *gc;
diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index c0d7ca1..ed3aae4 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -859,10 +859,10 @@ static void spawn_stub_disk_connected(libxl__egc *egc, 
libxl__ao_device *aorm)
          */
         libxl__device_nic_setdefault(gc, &dm_config->vifs[i]);
     }
-    ret = libxl_device_vfb_add(ctx, dm_domid, &dm_config->vfbs[0]);
+    ret = libxl_device_vfb_add(ctx, dm_domid, &dm_config->vfbs[0], 0);
     if (ret)
         goto out;
-    ret = libxl_device_vkb_add(ctx, dm_domid, &dm_config->vkbs[0]);
+    ret = libxl_device_vkb_add(ctx, dm_domid, &dm_config->vkbs[0], 0);
     if (ret)
         goto out;
 
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 91eba63..d57200f 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -788,6 +788,12 @@ _hidden int libxl__device_from_nic(libxl__gc *gc, uint32_t 
domid,
 _hidden int libxl__device_from_disk(libxl__gc *gc, uint32_t domid,
                                     libxl_device_disk *disk,
                                     libxl__device *device);
+_hidden int libxl__device_from_vkb(libxl__gc *gc, uint32_t domid,
+                                   libxl_device_vkb *vkb,
+                                   libxl__device *device);
+_hidden int libxl__device_from_vfb(libxl__gc *gc, uint32_t domid,
+                                   libxl_device_vfb *vfb,
+                                   libxl__device *device);
 
 _hidden int libxl__device_physdisk_major_minor(const char *physpath, int 
*major, int *minor);
 _hidden int libxl__device_disk_dev_number(const char *virtpath,
@@ -981,7 +987,12 @@ _hidden int libxl__device_disk_add(libxl__egc *egc, 
uint32_t domid,
 _hidden int libxl__device_nic_add(libxl__egc *egc, uint32_t domid,
                                   libxl_device_nic *nic,
                                   libxl__ao_device *aorm);
-
+_hidden int libxl__device_vkb_add(libxl__egc *egc, uint32_t domid,
+                                  libxl_device_vkb *vkb,
+                                  libxl__ao_device *aorm);
+_hidden int libxl__device_vfb_add(libxl__egc *egc, uint32_t domid,
+                                  libxl_device_vfb *vfb,
+                                  libxl__ao_device *aorm);
 /*
  *----- spawn -----
  *
-- 
1.7.7.5 (Apple Git-26)


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.