@@ -1384,26 +1384,32 @@ typedef struct libxl__qmp_handler libxl__qmp_handler;
* Return an handler or NULL if there is an error
*/
_hidden libxl__qmp_handler *libxl__qmp_initialize(libxl__gc *gc,
- uint32_t domid);
+ libxl_domid domid,
+ libxl_dmid dmid);
/* ask to QEMU the serial port information and store it in xenstore. */
_hidden int libxl__qmp_query_serial(libxl__qmp_handler *qmp);
-_hidden int libxl__qmp_pci_add(libxl__gc *gc, int d, libxl_device_pci *pcidev);
-_hidden int libxl__qmp_pci_del(libxl__gc *gc, int domid,
- libxl_device_pci *pcidev);
+_hidden int libxl__qmp_pci_add(libxl__gc *gc, libxl_domid d,
+ libxl_dmid dmid, libxl_device_pci *pcidev);
+_hidden int libxl__qmp_pci_del(libxl__gc *gc, libxl_domid domid,
+ libxl_dmid dmid, libxl_device_pci *pcidev);
/* Suspend QEMU. */
-_hidden int libxl__qmp_stop(libxl__gc *gc, int domid);
+_hidden int libxl__qmp_stop(libxl__gc *gc, libxl_domid domid, libxl_dmid dmid);
/* Resume QEMU. */
-_hidden int libxl__qmp_resume(libxl__gc *gc, int domid);
+_hidden int libxl__qmp_resume(libxl__gc *gc, libxl_domid domid,
+ libxl_dmid dmid);
/* Save current QEMU state into fd. */
-_hidden int libxl__qmp_save(libxl__gc *gc, int domid, const char *filename);
+_hidden int libxl__qmp_save(libxl__gc *gc, libxl_domid domid,
+ libxl_dmid dmid, const char *filename);
/* close and free the QMP handler */
_hidden void libxl__qmp_close(libxl__qmp_handler *qmp);
/* remove the socket file, if the file has already been removed,
* nothing happen */
-_hidden void libxl__qmp_cleanup(libxl__gc *gc, uint32_t domid);
+_hidden void libxl__qmp_cleanup(libxl__gc *gc, libxl_domid domid,
+ libxl_dmid dmid);
/* this helper calls qmp_initialize, query_serial and qmp_close */
-_hidden int libxl__qmp_initializations(libxl__gc *gc, uint32_t domid,
+_hidden int libxl__qmp_initializations(libxl__gc *gc, libxl_domid domid,
+ libxl_dmid dmid,
const libxl_domain_config *guest_config);
/* on failure, logs */
@@ -627,7 +627,8 @@ static void qmp_free_handler(libxl__qmp_handler *qmp)
* API
*/
-libxl__qmp_handler *libxl__qmp_initialize(libxl__gc *gc, uint32_t domid)
+libxl__qmp_handler *libxl__qmp_initialize(libxl__gc *gc, libxl_domid domid,
+ libxl_dmid dmid)
{
int ret = 0;
libxl__qmp_handler *qmp = NULL;
@@ -635,8 +636,8 @@ libxl__qmp_handler *libxl__qmp_initialize(libxl__gc *gc, uint32_t domid)
qmp = qmp_init_handler(gc, domid);
- qmp_socket = libxl__sprintf(gc, "%s/qmp-libxl-%d",
- libxl__run_dir_path(), domid);
+ qmp_socket = libxl__sprintf(gc, "%s/qmp-libxl-%u-%u",
+ libxl__run_dir_path(), domid, dmid);
if ((ret = qmp_open(qmp, qmp_socket, QMP_SOCKET_CONNECT_TIMEOUT)) < 0) {
LIBXL__LOG_ERRNO(qmp->ctx, LIBXL__LOG_ERROR, "Connection error");
qmp_free_handler(qmp);
@@ -668,13 +669,13 @@ void libxl__qmp_close(libxl__qmp_handler *qmp)
qmp_free_handler(qmp);
}
-void libxl__qmp_cleanup(libxl__gc *gc, uint32_t domid)
+void libxl__qmp_cleanup(libxl__gc *gc, libxl_domid domid, libxl_dmid dmid)
{
libxl_ctx *ctx = libxl__gc_owner(gc);
char *qmp_socket;
- qmp_socket = libxl__sprintf(gc, "%s/qmp-libxl-%d",
- libxl__run_dir_path(), domid);
+ qmp_socket = libxl__sprintf(gc, "%s/qmp-libxl-%u-%u",
+ libxl__run_dir_path(), domid, dmid);
if (unlink(qmp_socket) == -1) {
if (errno != ENOENT) {
LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
@@ -746,7 +747,9 @@ out:
return rc;
}
-int libxl__qmp_pci_add(libxl__gc *gc, int domid, libxl_device_pci *pcidev)
+int libxl__qmp_pci_add(libxl__gc *gc, libxl_domid domid,
+ libxl_dmid dmid,
+ libxl_device_pci *pcidev)
{
libxl__qmp_handler *qmp = NULL;
flexarray_t *parameters = NULL;
@@ -754,7 +757,7 @@ int libxl__qmp_pci_add(libxl__gc *gc, int domid, libxl_device_pci *pcidev)
char *hostaddr = NULL;
int rc = 0;
- qmp = libxl__qmp_initialize(gc, domid);
+ qmp = libxl__qmp_initialize(gc, domid, 0);
if (!qmp)
return -1;
@@ -792,14 +795,15 @@ int libxl__qmp_pci_add(libxl__gc *gc, int domid, libxl_device_pci *pcidev)
return rc;
}
-static int qmp_device_del(libxl__gc *gc, int domid, char *id)
+static int qmp_device_del(libxl__gc *gc, libxl_domid domid,
+ libxl_dmid dmid, char *id)
{
libxl__qmp_handler *qmp = NULL;
flexarray_t *parameters = NULL;
libxl_key_value_list args = NULL;
int rc = 0;
- qmp = libxl__qmp_initialize(gc, domid);
+ qmp = libxl__qmp_initialize(gc, domid, 0);
if (!qmp)
return ERROR_FAIL;
@@ -817,24 +821,26 @@ static int qmp_device_del(libxl__gc *gc, int domid, char *id)
return rc;
}
-int libxl__qmp_pci_del(libxl__gc *gc, int domid, libxl_device_pci *pcidev)
+int libxl__qmp_pci_del(libxl__gc *gc, libxl_domid domid,
+ libxl_domid dmid, libxl_device_pci *pcidev)
{
char *id = NULL;
id = libxl__sprintf(gc, PCI_PT_QDEV_ID,
pcidev->bus, pcidev->dev, pcidev->func);
- return qmp_device_del(gc, domid, id);
+ return qmp_device_del(gc, domid, dmid, id);
}
-int libxl__qmp_save(libxl__gc *gc, int domid, const char *filename)
+int libxl__qmp_save(libxl__gc *gc, libxl_domid domid,
+ libxl_dmid dmid, const char *filename)
{
libxl__qmp_handler *qmp = NULL;
flexarray_t *parameters = NULL;
libxl_key_value_list args = NULL;
int rc = 0;
- qmp = libxl__qmp_initialize(gc, domid);
+ qmp = libxl__qmp_initialize(gc, domid, dmid);
if (!qmp)
return ERROR_FAIL;
@@ -883,12 +889,12 @@ static int qmp_change(libxl__gc *gc, libxl__qmp_handler *qmp,
return rc;
}
-int libxl__qmp_stop(libxl__gc *gc, int domid)
+int libxl__qmp_stop(libxl__gc *gc, libxl_domid domid, libxl_dmid dmid)
{
libxl__qmp_handler *qmp = NULL;
int rc = 0;
- qmp = libxl__qmp_initialize(gc, domid);
+ qmp = libxl__qmp_initialize(gc, domid, dmid);
if (!qmp)
return ERROR_FAIL;
@@ -899,12 +905,12 @@ int libxl__qmp_stop(libxl__gc *gc, int domid)
return rc;
}
-int libxl__qmp_resume(libxl__gc *gc, int domid)
+int libxl__qmp_resume(libxl__gc *gc, libxl_domid domid, libxl_dmid dmid)
{
libxl__qmp_handler *qmp = NULL;
int rc = 0;
- qmp = libxl__qmp_initialize(gc, domid);
+ qmp = libxl__qmp_initialize(gc, domid, dmid);
if (!qmp)
return ERROR_FAIL;
@@ -915,14 +921,15 @@ int libxl__qmp_resume(libxl__gc *gc, int domid)
return rc;
}
-int libxl__qmp_initializations(libxl__gc *gc, uint32_t domid,
+int libxl__qmp_initializations(libxl__gc *gc, libxl_domid domid,
+ libxl_dmid dmid,
const libxl_domain_config *guest_config)
{
- const libxl_vnc_info *vnc = libxl__dm_vnc(guest_config);
+ const libxl_vnc_info *vnc = libxl__dm_vnc(dmid, guest_config);
libxl__qmp_handler *qmp = NULL;
int ret = 0;
- qmp = libxl__qmp_initialize(gc, domid);
+ qmp = libxl__qmp_initialize(gc, domid, dmid);
if (!qmp)
return -1;
ret = libxl__qmp_query_serial(qmp);
With the support of multiple device model, the qmp library need to know which device models is currently used. Signed-off-by: Julien Grall <julien.grall@citrix.com> --- tools/libxl/libxl_internal.h | 24 ++++++++++++------- tools/libxl/libxl_qmp.c | 49 ++++++++++++++++++++++++------------------ 2 files changed, 43 insertions(+), 30 deletions(-)