1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-07 17:28:15 +00:00

qemu: monitor: Add support for BLOCK_WRITE_THRESHOLD event

The event is fired when a given block backend node (identified by the
node name) experiences a write beyond the bound set via
block-set-write-threshold QMP command. This wires up the monitor code to
extract the data and allow us receiving the events and the capability.
This commit is contained in:
Peter Krempa 2017-02-22 16:52:22 +01:00
parent 085e794a86
commit 73d4b32427
16 changed files with 72 additions and 0 deletions

View File

@ -363,6 +363,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
"pcie-root-port", "pcie-root-port",
"query-cpu-definitions", /* 250 */ "query-cpu-definitions", /* 250 */
"block-write-threshold",
); );
@ -1534,6 +1535,7 @@ struct virQEMUCapsStringFlags virQEMUCapsEvents[] = {
{ "MIGRATION", QEMU_CAPS_MIGRATION_EVENT }, { "MIGRATION", QEMU_CAPS_MIGRATION_EVENT },
{ "VSERPORT_CHANGE", QEMU_CAPS_VSERPORT_CHANGE }, { "VSERPORT_CHANGE", QEMU_CAPS_VSERPORT_CHANGE },
{ "DEVICE_TRAY_MOVED", QEMU_CAPS_DEVICE_TRAY_MOVED }, { "DEVICE_TRAY_MOVED", QEMU_CAPS_DEVICE_TRAY_MOVED },
{ "BLOCK_WRITE_THRESHOLD", QEMU_CAPS_BLOCK_WRITE_THRESHOLD },
}; };
struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = { struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {

View File

@ -399,6 +399,7 @@ typedef enum {
/* 250 */ /* 250 */
QEMU_CAPS_QUERY_CPU_DEFINITIONS, /* qmp query-cpu-definitions */ QEMU_CAPS_QUERY_CPU_DEFINITIONS, /* qmp query-cpu-definitions */
QEMU_CAPS_BLOCK_WRITE_THRESHOLD, /* BLOCK_WRITE_THRESHOLD event */
QEMU_CAPS_LAST /* this must always be the last item */ QEMU_CAPS_LAST /* this must always be the last item */
} virQEMUCapsFlags; } virQEMUCapsFlags;

View File

@ -1604,6 +1604,24 @@ qemuMonitorEmitAcpiOstInfo(qemuMonitorPtr mon,
} }
int
qemuMonitorEmitBlockThreshold(qemuMonitorPtr mon,
const char *nodename,
unsigned long long threshold,
unsigned long long excess)
{
int ret = -1;
VIR_DEBUG("mon=%p, node-name='%s', threshold='%llu', excess='%llu'",
mon, nodename, threshold, excess);
QEMU_MONITOR_CALLBACK(mon, ret, domainBlockThreshold, mon->vm,
nodename, threshold, excess);
return ret;
}
int int
qemuMonitorSetCapabilities(qemuMonitorPtr mon) qemuMonitorSetCapabilities(qemuMonitorPtr mon)
{ {

View File

@ -207,6 +207,14 @@ typedef int (*qemuMonitorDomainAcpiOstInfoCallback)(qemuMonitorPtr mon,
void *opaque); void *opaque);
typedef int (*qemuMonitorDomainBlockThresholdCallback)(qemuMonitorPtr mon,
virDomainObjPtr vm,
const char *nodename,
unsigned long long threshold,
unsigned long long excess,
void *opaque);
typedef struct _qemuMonitorCallbacks qemuMonitorCallbacks; typedef struct _qemuMonitorCallbacks qemuMonitorCallbacks;
typedef qemuMonitorCallbacks *qemuMonitorCallbacksPtr; typedef qemuMonitorCallbacks *qemuMonitorCallbacksPtr;
struct _qemuMonitorCallbacks { struct _qemuMonitorCallbacks {
@ -238,6 +246,7 @@ struct _qemuMonitorCallbacks {
qemuMonitorDomainMigrationStatusCallback domainMigrationStatus; qemuMonitorDomainMigrationStatusCallback domainMigrationStatus;
qemuMonitorDomainMigrationPassCallback domainMigrationPass; qemuMonitorDomainMigrationPassCallback domainMigrationPass;
qemuMonitorDomainAcpiOstInfoCallback domainAcpiOstInfo; qemuMonitorDomainAcpiOstInfoCallback domainAcpiOstInfo;
qemuMonitorDomainBlockThresholdCallback domainBlockThreshold;
}; };
char *qemuMonitorEscapeArg(const char *in); char *qemuMonitorEscapeArg(const char *in);
@ -358,6 +367,11 @@ int qemuMonitorEmitAcpiOstInfo(qemuMonitorPtr mon,
unsigned int source, unsigned int source,
unsigned int status); unsigned int status);
int qemuMonitorEmitBlockThreshold(qemuMonitorPtr mon,
const char *nodename,
unsigned long long threshold,
unsigned long long excess);
int qemuMonitorStartCPUs(qemuMonitorPtr mon, int qemuMonitorStartCPUs(qemuMonitorPtr mon,
virConnectPtr conn); virConnectPtr conn);
int qemuMonitorStopCPUs(qemuMonitorPtr mon); int qemuMonitorStopCPUs(qemuMonitorPtr mon);

View File

@ -89,6 +89,7 @@ static void qemuMonitorJSONHandleSpiceMigrated(qemuMonitorPtr mon, virJSONValueP
static void qemuMonitorJSONHandleMigrationStatus(qemuMonitorPtr mon, virJSONValuePtr data); static void qemuMonitorJSONHandleMigrationStatus(qemuMonitorPtr mon, virJSONValuePtr data);
static void qemuMonitorJSONHandleMigrationPass(qemuMonitorPtr mon, virJSONValuePtr data); static void qemuMonitorJSONHandleMigrationPass(qemuMonitorPtr mon, virJSONValuePtr data);
static void qemuMonitorJSONHandleAcpiOstInfo(qemuMonitorPtr mon, virJSONValuePtr data); static void qemuMonitorJSONHandleAcpiOstInfo(qemuMonitorPtr mon, virJSONValuePtr data);
static void qemuMonitorJSONHandleBlockThreshold(qemuMonitorPtr mon, virJSONValuePtr data);
typedef struct { typedef struct {
const char *type; const char *type;
@ -102,6 +103,7 @@ static qemuEventHandler eventHandlers[] = {
{ "BLOCK_JOB_CANCELLED", qemuMonitorJSONHandleBlockJobCanceled, }, { "BLOCK_JOB_CANCELLED", qemuMonitorJSONHandleBlockJobCanceled, },
{ "BLOCK_JOB_COMPLETED", qemuMonitorJSONHandleBlockJobCompleted, }, { "BLOCK_JOB_COMPLETED", qemuMonitorJSONHandleBlockJobCompleted, },
{ "BLOCK_JOB_READY", qemuMonitorJSONHandleBlockJobReady, }, { "BLOCK_JOB_READY", qemuMonitorJSONHandleBlockJobReady, },
{ "BLOCK_WRITE_THRESHOLD", qemuMonitorJSONHandleBlockThreshold, },
{ "DEVICE_DELETED", qemuMonitorJSONHandleDeviceDeleted, }, { "DEVICE_DELETED", qemuMonitorJSONHandleDeviceDeleted, },
{ "DEVICE_TRAY_MOVED", qemuMonitorJSONHandleTrayChange, }, { "DEVICE_TRAY_MOVED", qemuMonitorJSONHandleTrayChange, },
{ "GUEST_PANICKED", qemuMonitorJSONHandleGuestPanic, }, { "GUEST_PANICKED", qemuMonitorJSONHandleGuestPanic, },
@ -1065,6 +1067,30 @@ qemuMonitorJSONHandleAcpiOstInfo(qemuMonitorPtr mon, virJSONValuePtr data)
} }
static void
qemuMonitorJSONHandleBlockThreshold(qemuMonitorPtr mon, virJSONValuePtr data)
{
const char *nodename;
unsigned long long threshold;
unsigned long long excess;
if (!(nodename = virJSONValueObjectGetString(data, "node-name")))
goto error;
if (virJSONValueObjectGetNumberUlong(data, "write-threshold", &threshold) < 0)
goto error;
if (virJSONValueObjectGetNumberUlong(data, "amount-exceeded", &excess) < 0)
goto error;
qemuMonitorEmitBlockThreshold(mon, nodename, threshold, excess);
return;
error:
VIR_WARN("malformed 'BLOCK_WRITE_THRESHOLD' event");
}
int int
qemuMonitorJSONHumanCommandWithFd(qemuMonitorPtr mon, qemuMonitorJSONHumanCommandWithFd(qemuMonitorPtr mon,
const char *cmd_str, const char *cmd_str,

View File

@ -183,6 +183,7 @@
<flag name='vhost-scsi'/> <flag name='vhost-scsi'/>
<flag name='drive-iotune-group'/> <flag name='drive-iotune-group'/>
<flag name='query-cpu-definitions'/> <flag name='query-cpu-definitions'/>
<flag name='block-write-threshold'/>
<version>2004000</version> <version>2004000</version>
<kvmVersion>0</kvmVersion> <kvmVersion>0</kvmVersion>
<package></package> <package></package>

View File

@ -189,6 +189,7 @@
<flag name='vhost-scsi'/> <flag name='vhost-scsi'/>
<flag name='drive-iotune-group'/> <flag name='drive-iotune-group'/>
<flag name='query-cpu-definitions'/> <flag name='query-cpu-definitions'/>
<flag name='block-write-threshold'/>
<version>2005000</version> <version>2005000</version>
<kvmVersion>0</kvmVersion> <kvmVersion>0</kvmVersion>
<package></package> <package></package>

View File

@ -165,6 +165,7 @@
<flag name='vhost-scsi'/> <flag name='vhost-scsi'/>
<flag name='drive-iotune-group'/> <flag name='drive-iotune-group'/>
<flag name='query-cpu-definitions'/> <flag name='query-cpu-definitions'/>
<flag name='block-write-threshold'/>
<version>2006000</version> <version>2006000</version>
<kvmVersion>0</kvmVersion> <kvmVersion>0</kvmVersion>
<package></package> <package></package>

View File

@ -165,6 +165,7 @@
<flag name='vhost-scsi'/> <flag name='vhost-scsi'/>
<flag name='drive-iotune-group'/> <flag name='drive-iotune-group'/>
<flag name='query-cpu-definitions'/> <flag name='query-cpu-definitions'/>
<flag name='block-write-threshold'/>
<version>2006000</version> <version>2006000</version>
<kvmVersion>0</kvmVersion> <kvmVersion>0</kvmVersion>
<package></package> <package></package>

View File

@ -160,6 +160,7 @@
<flag name='vhost-scsi'/> <flag name='vhost-scsi'/>
<flag name='drive-iotune-group'/> <flag name='drive-iotune-group'/>
<flag name='query-cpu-definitions'/> <flag name='query-cpu-definitions'/>
<flag name='block-write-threshold'/>
<version>2006000</version> <version>2006000</version>
<kvmVersion>0</kvmVersion> <kvmVersion>0</kvmVersion>
<package></package> <package></package>

View File

@ -198,6 +198,7 @@
<flag name='vhost-scsi'/> <flag name='vhost-scsi'/>
<flag name='drive-iotune-group'/> <flag name='drive-iotune-group'/>
<flag name='query-cpu-definitions'/> <flag name='query-cpu-definitions'/>
<flag name='block-write-threshold'/>
<version>2006000</version> <version>2006000</version>
<kvmVersion>0</kvmVersion> <kvmVersion>0</kvmVersion>
<package></package> <package></package>

View File

@ -128,6 +128,7 @@
<flag name='vhost-scsi'/> <flag name='vhost-scsi'/>
<flag name='drive-iotune-group'/> <flag name='drive-iotune-group'/>
<flag name='query-cpu-definitions'/> <flag name='query-cpu-definitions'/>
<flag name='block-write-threshold'/>
<version>2007000</version> <version>2007000</version>
<kvmVersion>0</kvmVersion> <kvmVersion>0</kvmVersion>
<package></package> <package></package>

View File

@ -200,6 +200,7 @@
<flag name='vhost-scsi'/> <flag name='vhost-scsi'/>
<flag name='drive-iotune-group'/> <flag name='drive-iotune-group'/>
<flag name='query-cpu-definitions'/> <flag name='query-cpu-definitions'/>
<flag name='block-write-threshold'/>
<version>2007000</version> <version>2007000</version>
<kvmVersion>0</kvmVersion> <kvmVersion>0</kvmVersion>
<package> (v2.7.0)</package> <package> (v2.7.0)</package>

View File

@ -130,6 +130,7 @@
<flag name='drive-iotune-group'/> <flag name='drive-iotune-group'/>
<flag name='query-cpu-model-expansion'/> <flag name='query-cpu-model-expansion'/>
<flag name='query-cpu-definitions'/> <flag name='query-cpu-definitions'/>
<flag name='block-write-threshold'/>
<version>2007093</version> <version>2007093</version>
<kvmVersion>0</kvmVersion> <kvmVersion>0</kvmVersion>
<package></package> <package></package>

View File

@ -201,6 +201,7 @@
<flag name='vhost-scsi'/> <flag name='vhost-scsi'/>
<flag name='drive-iotune-group'/> <flag name='drive-iotune-group'/>
<flag name='query-cpu-definitions'/> <flag name='query-cpu-definitions'/>
<flag name='block-write-threshold'/>
<version>2008000</version> <version>2008000</version>
<kvmVersion>0</kvmVersion> <kvmVersion>0</kvmVersion>
<package> (v2.8.0)</package> <package> (v2.8.0)</package>

View File

@ -205,6 +205,7 @@
<flag name='spice-rendernode'/> <flag name='spice-rendernode'/>
<flag name='pcie-root-port'/> <flag name='pcie-root-port'/>
<flag name='query-cpu-definitions'/> <flag name='query-cpu-definitions'/>
<flag name='block-write-threshold'/>
<version>2008090</version> <version>2008090</version>
<kvmVersion>0</kvmVersion> <kvmVersion>0</kvmVersion>
<package> (v2.9.0-rc0-142-g940a8ce)</package> <package> (v2.9.0-rc0-142-g940a8ce)</package>