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

[Xen-devel] [PATCH 20 of 29 RFC] libxl: introduce libxl hotplug public API functions



# HG changeset patch
# User Roger Pau Monne <roger.pau@xxxxxxxxxxxxx>
# Date 1328178807 -3600
# Node ID bc38aa2e11e21b34dbc29a81f069133a3276848a
# Parent  937bbe68a1942e22c40aa18c8bb66490aec56945
libxl: introduce libxl hotplug public API functions

These functions mimic the name used by the local device functions,
following the nomenclature:

libxl_device_<type>_hotplug_<action>

They also take the same parameters as they local counterparts (ctx,
domid and libxl_device_<type>). The list of added functions:

libxl_device_disk_hotplug_add
libxl_device_disk_hotplug_remove
libxl_device_disk_hotplug_destroy
libxl_device_nic_hotplug_add
libxl_device_nic_hotplug_remove
libxl_device_nic_hotplug_destroy

The xenstore structure used by vbd disk entries:

/hotplug/<backend_domid>/<frontend_domid>/vbd/<devid>
/hotplug/<backend_domid>/<frontend_domid>/vbd/<devid>/pdev_path
/hotplug/<backend_domid>/<frontend_domid>/vbd/<devid>/vdev
/hotplug/<backend_domid>/<frontend_domid>/vbd/<devid>/script
/hotplug/<backend_domid>/<frontend_domid>/vbd/<devid>/removable
/hotplug/<backend_domid>/<frontend_domid>/vbd/<devid>/readwrite
/hotplug/<backend_domid>/<frontend_domid>/vbd/<devid>/is_cdrom
/hotplug/<backend_domid>/<frontend_domid>/vbd/<devid>/state

and vif devices use the following:

/hotplug/<backend_domid>/<frontend_domid>/vif/<devid>
/hotplug/<backend_domid>/<frontend_domid>/vif/<devid>/mtu
/hotplug/<backend_domid>/<frontend_domid>/vif/<devid>/model
/hotplug/<backend_domid>/<frontend_domid>/vif/<devid>/mac
/hotplug/<backend_domid>/<frontend_domid>/vif/<devid>/ip
/hotplug/<backend_domid>/<frontend_domid>/vif/<devid>/bridge
/hotplug/<backend_domid>/<frontend_domid>/vif/<devid>/ifname
/hotplug/<backend_domid>/<frontend_domid>/vif/<devid>/script
/hotplug/<backend_domid>/<frontend_domid>/vif/<devid>/nictype

This will allow us to pass the libxl_device_disk and libxl_device_nic
struct from Dom0 to driver domain, and execute the necessary backends
there.

Signed-off-by: Roger Pau Monne <roger.pau@xxxxxxxxxxxxx>

diff -r 937bbe68a194 -r bc38aa2e11e2 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c       Thu Feb 02 11:30:27 2012 +0100
+++ b/tools/libxl/libxl.c       Thu Feb 02 11:33:27 2012 +0100
@@ -996,6 +996,85 @@ static int libxl__device_from_disk(libxl
     return 0;
 }
 
+int libxl_device_disk_hotplug_add(libxl_ctx *ctx, uint32_t domid,
+                                  libxl_device_disk *disk)
+{
+    GC_INIT(ctx);
+    flexarray_t *hotplug;
+    libxl__device device;
+    char *h_path, *state_path, *state;
+    struct timeval tv;
+    int rc;
+
+    /* 
+     * Always set backend to PHY and let the driver domain decide the most
+     * suitable backend to use
+     */
+    disk->backend = LIBXL_DISK_BACKEND_PHY;
+
+    hotplug = flexarray_make(14, 1);
+    if (!hotplug) {
+        rc = ERROR_NOMEM;
+        goto out;
+    }
+
+    rc = libxl__device_from_disk(gc, domid, disk, &device);
+    if (rc != 0) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Invalid or unsupported"
+               " virtual disk identifier %s", disk->vdev);
+        goto out_free;
+    }
+
+    flexarray_append(hotplug, "pdev_path");
+    flexarray_append(hotplug, libxl__strdup(gc, disk->pdev_path));
+    flexarray_append(hotplug, "vdev");
+    flexarray_append(hotplug, libxl__strdup(gc, disk->vdev));
+    if (disk->script) {
+        flexarray_append(hotplug, "script");
+        flexarray_append(hotplug, libxl__strdup(gc, disk->script));
+    }
+    flexarray_append(hotplug, "removable");
+    flexarray_append(hotplug, libxl__sprintf(gc, "%d", disk->removable));
+    flexarray_append(hotplug, "readwrite");
+    flexarray_append(hotplug, libxl__sprintf(gc, "%d", disk->readwrite));
+    flexarray_append(hotplug, "is_cdrom");
+    flexarray_append(hotplug, libxl__sprintf(gc, "%d", disk->is_cdrom));
+    flexarray_append(hotplug, "format");
+    flexarray_append(hotplug, libxl__sprintf(gc, "%d", disk->format));
+    flexarray_append(hotplug, "state");
+    flexarray_append(hotplug, "1");
+
+    libxl__device_generic_hotplug_add(gc, &device,
+        libxl__xs_kvs_of_flexarray(gc, hotplug, hotplug->count));
+
+    /* Wait for device init or error */
+    h_path = libxl__device_hotplug_path(gc, &device);
+    state_path = libxl__sprintf(gc, "%s/state", h_path);
+    state = libxl__xs_read(gc, XBT_NULL, state_path);
+
+    if (atoi(state) != HOTPLUG_DEVICE_CONNECTED) {
+        xs_watch(ctx->xsh, state_path, h_path);
+        tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
+        tv.tv_usec = 0;
+        rc = libxl__wait_for_device_state(gc, &tv, HOTPLUG_DEVICE_CONNECTED,
+                                          NULL);
+        xs_unwatch(ctx->xsh, state_path, h_path);
+        if (rc < 0) {
+            LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+                       "unable to initialize disk device: %s",
+                       disk->pdev_path);
+            goto out_free;
+        }
+    }
+
+    rc = 0;
+out_free:
+    flexarray_free(hotplug);
+out:
+    GC_FREE;
+    return rc;
+}
+
 int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk 
*disk)
 {
     GC_INIT(ctx);
@@ -1174,6 +1253,23 @@ out:
     return rc;
 }
 
+int libxl_device_disk_hotplug_remove(libxl_ctx *ctx, uint32_t domid,
+                                     libxl_device_disk *disk)
+{
+    GC_INIT(ctx);
+    libxl__device device;
+    int rc;
+
+    rc = libxl__device_from_disk(gc, domid, disk, &device);
+    if (rc != 0) goto out;
+
+    rc = libxl__device_hotplug_disconnect(gc, &device,
+                                          HOTPLUG_DEVICE_DISCONNECT);
+out:
+    GC_FREE;
+    return rc;
+}
+
 int libxl_device_disk_destroy(libxl_ctx *ctx, uint32_t domid,
                               libxl_device_disk *disk)
 {
@@ -1190,6 +1286,23 @@ out:
     return rc;
 }
 
+int libxl_device_disk_hotplug_destroy(libxl_ctx *ctx, uint32_t domid,
+                                      libxl_device_disk *disk)
+{
+    GC_INIT(ctx);
+    libxl__device device;
+    int rc;
+
+    rc = libxl__device_from_disk(gc, domid, disk, &device);
+    if (rc != 0) goto out;
+
+    rc = libxl__device_hotplug_disconnect(gc, &device,
+                                          HOTPLUG_DEVICE_FORCE_DISCONNECT);
+out:
+    GC_FREE;
+    return rc;
+}
+
 static void libxl__device_disk_from_xs_be(libxl__gc *gc,
                                           const char *be_path,
                                           libxl_device_disk *disk)
@@ -1516,6 +1629,85 @@ static int libxl__device_from_nic(libxl_
     return 0;
 }
 
+int libxl_device_nic_hotplug_add(libxl_ctx *ctx, uint32_t domid,
+                                  libxl_device_nic *nic)
+{
+    GC_INIT(ctx);
+    flexarray_t *hotplug;
+    libxl__device device;
+    char *h_path, *state_path, *state;
+    struct timeval tv;
+    int rc;
+
+    hotplug = flexarray_make(18, 1);
+    if (!hotplug) {
+        rc = ERROR_NOMEM;
+        goto out;
+    }
+
+    rc = libxl__device_from_nic(gc, domid, nic, &device);
+    if (rc != 0)
+        goto out_free;
+
+    flexarray_append(hotplug, "mtu");
+    flexarray_append(hotplug, libxl__sprintf(gc, "%d", nic->mtu));
+    if (nic->model) {
+        flexarray_append(hotplug, "model");
+        flexarray_append(hotplug, libxl__strdup(gc, nic->model));
+    }
+    flexarray_append(hotplug, "mac");
+    flexarray_append(hotplug, libxl__sprintf(gc,
+                                    LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nic->mac)));
+    if (nic->ip) {
+        flexarray_append(hotplug, "ip");
+        flexarray_append(hotplug, libxl__strdup(gc, nic->ip));
+    }
+    flexarray_append(hotplug, "bridge");
+    flexarray_append(hotplug, libxl__strdup(gc, nic->bridge));
+    if (nic->ifname) {
+        flexarray_append(hotplug, "ifname");
+        flexarray_append(hotplug, libxl__strdup(gc, nic->ifname));
+    }
+    if (nic->script) {
+        flexarray_append(hotplug, "script");
+        flexarray_append(hotplug, libxl__strdup(gc, nic->script));
+    }
+    flexarray_append(hotplug, "nictype");
+    flexarray_append(hotplug, libxl__sprintf(gc, "%d", nic->nictype));
+    flexarray_append(hotplug, "state");
+    flexarray_append(hotplug, "1");
+
+    libxl__device_generic_hotplug_add(gc, &device,
+        libxl__xs_kvs_of_flexarray(gc, hotplug, hotplug->count));
+
+    /* Wait for device init or error */
+    h_path = libxl__device_hotplug_path(gc, &device);
+    state_path = libxl__sprintf(gc, "%s/state", h_path);
+    state = libxl__xs_read(gc, XBT_NULL, state_path);
+
+    if (atoi(state) != HOTPLUG_DEVICE_CONNECTED) {
+        xs_watch(ctx->xsh, state_path, h_path);
+        tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
+        tv.tv_usec = 0;
+        rc = libxl__wait_for_device_state(gc, &tv, HOTPLUG_DEVICE_CONNECTED,
+                                          NULL);
+        xs_unwatch(ctx->xsh, state_path, h_path);
+        if (rc < 0) {
+            LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+                       "unable to initialize nic device: %s",
+                       nic->ifname);
+            goto out_free;
+        }
+    }
+
+    rc = 0;
+out_free:
+    flexarray_free(hotplug);
+out:
+    GC_FREE;
+    return rc;
+}
+
 int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic)
 {
     GC_INIT(ctx);
@@ -1652,6 +1844,22 @@ out:
     return rc;
 }
 
+int libxl_device_nic_hotplug_remove(libxl_ctx *ctx, uint32_t domid,
+                                    libxl_device_nic *nic)
+{
+    GC_INIT(ctx);
+    libxl__device device;
+    int rc;
+
+    rc = libxl__device_from_nic(gc, domid, nic, &device);
+    if (rc != 0) goto out;
+
+    rc = libxl__device_hotplug_disconnect(gc, &device, 
HOTPLUG_DEVICE_DISCONNECT);
+out:
+    GC_FREE;
+    return rc;
+}
+
 int libxl_device_nic_destroy(libxl_ctx *ctx, uint32_t domid,
                                   libxl_device_nic *nic)
 {
@@ -1668,6 +1876,23 @@ out:
     return rc;
 }
 
+int libxl_device_nic_hotplug_destroy(libxl_ctx *ctx, uint32_t domid,
+                                     libxl_device_nic *nic)
+{
+    GC_INIT(ctx);
+    libxl__device device;
+    int rc;
+
+    rc = libxl__device_from_nic(gc, domid, nic, &device);
+    if (rc != 0) goto out;
+
+    rc = libxl__device_hotplug_disconnect(gc, &device,
+                                          HOTPLUG_DEVICE_FORCE_DISCONNECT);
+out:
+    GC_FREE;
+    return rc;
+}
+
 static void libxl__device_nic_from_xs_be(libxl__gc *gc,
                                          const char *be_path,
                                          libxl_device_nic *nic)
diff -r 937bbe68a194 -r bc38aa2e11e2 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h       Thu Feb 02 11:30:27 2012 +0100
+++ b/tools/libxl/libxl.h       Thu Feb 02 11:33:27 2012 +0100
@@ -416,6 +416,11 @@ libxl_vminfo * libxl_list_vm(libxl_ctx *
  *
  *    Initalises device to a default configuration.
  *
+ * libxl_device_<type>_hotplug_add(ctx, domid, device):
+ *
+ *   Creates the necessary xenstore entries to trigger the execution of
+ *   a device addition, possibly on a different domain.
+ *
  * libxl_device_<type>_add(ctx, domid, device):
  *
  *   Adds the given device to the specified domain. This can be called
@@ -425,6 +430,10 @@ libxl_vminfo * libxl_list_vm(libxl_ctx *
  *   domain to connect to the device and therefore cannot block on the
  *   guest.
  *
+ * libxl_device_<type>_hotplug_remove(ctx, domid, device):
+ *
+ *   Request the removal of the given device and waits for the result.
+ *
  * libxl_device_<type>_remove(ctx, domid, device):
  *
  *   Removes the given device from the specified domain by performing
@@ -442,14 +451,25 @@ libxl_vminfo * libxl_list_vm(libxl_ctx *
  *
  *   This function does not interact with the guest and therefore
  *   cannot block on the guest.
+ *
+ * libxl_device_<type>_hotplug_destroy(ctx, domid, device):
+ *
+ *   Requests de destruction of the given device and waits for the result.
+ *
  */
 
 /* Disks */
 int libxl_device_disk_init(libxl_ctx *ctx, libxl_device_disk *disk);
+int libxl_device_disk_hotplug_add(libxl_ctx *ctx, uint32_t domid,
+                                  libxl_device_disk *disk);
 int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk 
*disk);
 int libxl_device_disk_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_disk 
*disk);
+int libxl_device_disk_hotplug_remove(libxl_ctx *ctx, uint32_t domid,
+                                     libxl_device_disk *disk);
 int libxl_device_disk_destroy(libxl_ctx *ctx, uint32_t domid,
                               libxl_device_disk *disk);
+int libxl_device_disk_hotplug_destroy(libxl_ctx *ctx, uint32_t domid,
+                                      libxl_device_disk *disk);
 
 libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int 
*num);
 int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid,
@@ -470,9 +490,15 @@ int libxl_device_disk_local_detach(libxl
 
 /* Network Interfaces */
 int libxl_device_nic_init(libxl_ctx *ctx, libxl_device_nic *nic);
+int libxl_device_nic_hotplug_add(libxl_ctx *ctx, uint32_t domid,
+                                 libxl_device_nic *nic);
 int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic 
*nic);
 int libxl_device_nic_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_nic 
*nic);
+int libxl_device_nic_hotplug_remove(libxl_ctx *ctx, uint32_t domid,
+                                    libxl_device_nic *nic);
 int libxl_device_nic_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_nic 
*nic);
+int libxl_device_nic_hotplug_destroy(libxl_ctx *ctx, uint32_t domid,
+                                     libxl_device_nic *nic);
 
 libxl_device_nic *libxl_device_nic_list(libxl_ctx *ctx, uint32_t domid, int 
*num);
 int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid,

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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