qemu: monitor: Add functions for object hot-add/remove

To allow live modification of device backends in qemu libvirt needs to
be able to hot-add/remove "objects". Add monitor backend functions to
allow this.

This function will be used for hot-add/remove of RNG backends,
IOThreads, memory backing objects, etc.
This commit is contained in:
Peter Krempa 2014-09-23 13:25:25 +02:00
parent ddf52d01f8
commit 6908f8cab3
4 changed files with 121 additions and 0 deletions

View File

@ -3132,6 +3132,54 @@ int qemuMonitorAddDevice(qemuMonitorPtr mon,
return qemuMonitorAddDeviceWithFd(mon, devicestr, -1, NULL);
}
/**
* qemuMonitorAddObject:
* @mon: Pointer to monitor object
* @type: Type name of object to add
* @objalias: Alias of the new object
* @props: Optional arguments for the given type. The object is consumed and
* should not be referenced by the caller after this function returns.
*
* Returns 0 on success -1 on error.
*/
int
qemuMonitorAddObject(qemuMonitorPtr mon,
const char *type,
const char *objalias,
virJSONValuePtr props)
{
VIR_DEBUG("mon=%p type=%s objalias=%s props=%p",
mon, type, objalias, props);
int ret = -1;
if (mon->json)
ret = qemuMonitorJSONAddObject(mon, type, objalias, props);
else
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
_("object adding requires JSON monitor"));
return ret;
}
int
qemuMonitorDelObject(qemuMonitorPtr mon,
const char *objalias)
{
VIR_DEBUG("mon=%p objalias=%s", mon, objalias);
int ret = -1;
if (mon->json)
ret = qemuMonitorJSONDelObject(mon, objalias);
else
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
_("object deletion requires JSON monitor"));
return ret;
}
int qemuMonitorAddDrive(qemuMonitorPtr mon,
const char *drivestr)
{

View File

@ -672,6 +672,14 @@ int qemuMonitorAddDeviceWithFd(qemuMonitorPtr mon,
int qemuMonitorDelDevice(qemuMonitorPtr mon,
const char *devalias);
int qemuMonitorAddObject(qemuMonitorPtr mon,
const char *type,
const char *objalias,
virJSONValuePtr props);
int qemuMonitorDelObject(qemuMonitorPtr mon,
const char *objalias);
int qemuMonitorAddDrive(qemuMonitorPtr mon,
const char *drivestr);

View File

@ -3561,6 +3561,63 @@ int qemuMonitorJSONAddDevice(qemuMonitorPtr mon,
}
int qemuMonitorJSONAddObject(qemuMonitorPtr mon,
const char *type,
const char *objalias,
virJSONValuePtr props)
{
int ret = -1;
virJSONValuePtr cmd;
virJSONValuePtr reply = NULL;
cmd = qemuMonitorJSONMakeCommand("object-add",
"s:qom-type", type,
"s:id", objalias,
"A:props", props,
NULL);
if (!cmd)
goto cleanup;
/* @props is part of @cmd now. Avoid double free */
props = NULL;
ret = qemuMonitorJSONCommand(mon, cmd, &reply);
if (ret == 0)
ret = qemuMonitorJSONCheckError(cmd, reply);
cleanup:
virJSONValueFree(cmd);
virJSONValueFree(reply);
virJSONValueFree(props);
return ret;
}
int qemuMonitorJSONDelObject(qemuMonitorPtr mon,
const char *objalias)
{
int ret;
virJSONValuePtr cmd;
virJSONValuePtr reply = NULL;
cmd = qemuMonitorJSONMakeCommand("object-del",
"s:id", objalias,
NULL);
if (!cmd)
return -1;
ret = qemuMonitorJSONCommand(mon, cmd, &reply);
if (ret == 0)
ret = qemuMonitorJSONCheckError(cmd, reply);
virJSONValueFree(cmd);
virJSONValueFree(reply);
return ret;
}
int qemuMonitorJSONAddDrive(qemuMonitorPtr mon,
const char *drivestr)
{

View File

@ -229,6 +229,14 @@ int qemuMonitorJSONAddDevice(qemuMonitorPtr mon,
int qemuMonitorJSONDelDevice(qemuMonitorPtr mon,
const char *devalias);
int qemuMonitorJSONAddObject(qemuMonitorPtr mon,
const char *type,
const char *objalias,
virJSONValuePtr props);
int qemuMonitorJSONDelObject(qemuMonitorPtr mon,
const char *objalias);
int qemuMonitorJSONAddDrive(qemuMonitorPtr mon,
const char *drivestr);