stats: Move QMP commands from monitor/ to stats/
This moves these commands from MAINTAINERS section "QMP" to new section "Stats". Status is Orphan. Volunteers welcome! Signed-off-by: Markus Armbruster <armbru@redhat.com> Message-Id: <20230124121946.1139465-23-armbru@redhat.com>
This commit is contained in:
parent
bab46b8180
commit
aa09b3d5f8
@ -3038,6 +3038,11 @@ F: net/slirp.c
|
|||||||
F: include/net/slirp.h
|
F: include/net/slirp.h
|
||||||
T: git https://people.debian.org/~sthibault/qemu.git slirp
|
T: git https://people.debian.org/~sthibault/qemu.git slirp
|
||||||
|
|
||||||
|
Stats
|
||||||
|
S: Orphan
|
||||||
|
F: include/sysemu/stats.h
|
||||||
|
F: stats/
|
||||||
|
|
||||||
Streams
|
Streams
|
||||||
M: Edgar E. Iglesias <edgar.iglesias@gmail.com>
|
M: Edgar E. Iglesias <edgar.iglesias@gmail.com>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -50,7 +50,7 @@
|
|||||||
#include "qemu/range.h"
|
#include "qemu/range.h"
|
||||||
|
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "monitor/stats.h"
|
#include "sysemu/stats.h"
|
||||||
|
|
||||||
/* This check must be after config-host.h is included */
|
/* This check must be after config-host.h is included */
|
||||||
#ifdef CONFIG_EVENTFD
|
#ifdef CONFIG_EVENTFD
|
||||||
|
@ -3132,6 +3132,7 @@ subdir('monitor')
|
|||||||
subdir('net')
|
subdir('net')
|
||||||
subdir('replay')
|
subdir('replay')
|
||||||
subdir('semihosting')
|
subdir('semihosting')
|
||||||
|
subdir('stats')
|
||||||
subdir('tcg')
|
subdir('tcg')
|
||||||
subdir('fpu')
|
subdir('fpu')
|
||||||
subdir('accel')
|
subdir('accel')
|
||||||
|
@ -25,13 +25,11 @@
|
|||||||
#include "qapi/qapi-commands-acpi.h"
|
#include "qapi/qapi-commands-acpi.h"
|
||||||
#include "qapi/qapi-commands-control.h"
|
#include "qapi/qapi-commands-control.h"
|
||||||
#include "qapi/qapi-commands-misc.h"
|
#include "qapi/qapi-commands-misc.h"
|
||||||
#include "qapi/qapi-commands-stats.h"
|
|
||||||
#include "qapi/type-helpers.h"
|
#include "qapi/type-helpers.h"
|
||||||
#include "hw/mem/memory-device.h"
|
#include "hw/mem/memory-device.h"
|
||||||
#include "hw/acpi/acpi_dev_interface.h"
|
#include "hw/acpi/acpi_dev_interface.h"
|
||||||
#include "hw/intc/intc.h"
|
#include "hw/intc/intc.h"
|
||||||
#include "hw/rdma/rdma.h"
|
#include "hw/rdma/rdma.h"
|
||||||
#include "monitor/stats.h"
|
|
||||||
|
|
||||||
NameInfo *qmp_query_name(Error **errp)
|
NameInfo *qmp_query_name(Error **errp)
|
||||||
{
|
{
|
||||||
@ -174,153 +172,3 @@ ACPIOSTInfoList *qmp_query_acpi_ospm_status(Error **errp)
|
|||||||
|
|
||||||
return head;
|
return head;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct StatsCallbacks {
|
|
||||||
StatsProvider provider;
|
|
||||||
StatRetrieveFunc *stats_cb;
|
|
||||||
SchemaRetrieveFunc *schemas_cb;
|
|
||||||
QTAILQ_ENTRY(StatsCallbacks) next;
|
|
||||||
} StatsCallbacks;
|
|
||||||
|
|
||||||
static QTAILQ_HEAD(, StatsCallbacks) stats_callbacks =
|
|
||||||
QTAILQ_HEAD_INITIALIZER(stats_callbacks);
|
|
||||||
|
|
||||||
void add_stats_callbacks(StatsProvider provider,
|
|
||||||
StatRetrieveFunc *stats_fn,
|
|
||||||
SchemaRetrieveFunc *schemas_fn)
|
|
||||||
{
|
|
||||||
StatsCallbacks *entry = g_new(StatsCallbacks, 1);
|
|
||||||
entry->provider = provider;
|
|
||||||
entry->stats_cb = stats_fn;
|
|
||||||
entry->schemas_cb = schemas_fn;
|
|
||||||
|
|
||||||
QTAILQ_INSERT_TAIL(&stats_callbacks, entry, next);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool invoke_stats_cb(StatsCallbacks *entry,
|
|
||||||
StatsResultList **stats_results,
|
|
||||||
StatsFilter *filter, StatsRequest *request,
|
|
||||||
Error **errp)
|
|
||||||
{
|
|
||||||
ERRP_GUARD();
|
|
||||||
strList *targets = NULL;
|
|
||||||
strList *names = NULL;
|
|
||||||
|
|
||||||
if (request) {
|
|
||||||
if (request->provider != entry->provider) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (request->has_names && !request->names) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
names = request->has_names ? request->names : NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (filter->target) {
|
|
||||||
case STATS_TARGET_VM:
|
|
||||||
break;
|
|
||||||
case STATS_TARGET_VCPU:
|
|
||||||
if (filter->u.vcpu.has_vcpus) {
|
|
||||||
if (!filter->u.vcpu.vcpus) {
|
|
||||||
/* No targets allowed? Return no statistics. */
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
targets = filter->u.vcpu.vcpus;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
entry->stats_cb(stats_results, filter->target, names, targets, errp);
|
|
||||||
if (*errp) {
|
|
||||||
qapi_free_StatsResultList(*stats_results);
|
|
||||||
*stats_results = NULL;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
StatsResultList *qmp_query_stats(StatsFilter *filter, Error **errp)
|
|
||||||
{
|
|
||||||
StatsResultList *stats_results = NULL;
|
|
||||||
StatsCallbacks *entry;
|
|
||||||
StatsRequestList *request;
|
|
||||||
|
|
||||||
QTAILQ_FOREACH(entry, &stats_callbacks, next) {
|
|
||||||
if (filter->has_providers) {
|
|
||||||
for (request = filter->providers; request; request = request->next) {
|
|
||||||
if (!invoke_stats_cb(entry, &stats_results, filter,
|
|
||||||
request->value, errp)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (!invoke_stats_cb(entry, &stats_results, filter, NULL, errp)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return stats_results;
|
|
||||||
}
|
|
||||||
|
|
||||||
StatsSchemaList *qmp_query_stats_schemas(bool has_provider,
|
|
||||||
StatsProvider provider,
|
|
||||||
Error **errp)
|
|
||||||
{
|
|
||||||
ERRP_GUARD();
|
|
||||||
StatsSchemaList *stats_results = NULL;
|
|
||||||
StatsCallbacks *entry;
|
|
||||||
|
|
||||||
QTAILQ_FOREACH(entry, &stats_callbacks, next) {
|
|
||||||
if (!has_provider || provider == entry->provider) {
|
|
||||||
entry->schemas_cb(&stats_results, errp);
|
|
||||||
if (*errp) {
|
|
||||||
qapi_free_StatsSchemaList(stats_results);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return stats_results;
|
|
||||||
}
|
|
||||||
|
|
||||||
void add_stats_entry(StatsResultList **stats_results, StatsProvider provider,
|
|
||||||
const char *qom_path, StatsList *stats_list)
|
|
||||||
{
|
|
||||||
StatsResult *entry = g_new0(StatsResult, 1);
|
|
||||||
|
|
||||||
entry->provider = provider;
|
|
||||||
entry->qom_path = g_strdup(qom_path);
|
|
||||||
entry->stats = stats_list;
|
|
||||||
|
|
||||||
QAPI_LIST_PREPEND(*stats_results, entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
void add_stats_schema(StatsSchemaList **schema_results,
|
|
||||||
StatsProvider provider, StatsTarget target,
|
|
||||||
StatsSchemaValueList *stats_list)
|
|
||||||
{
|
|
||||||
StatsSchema *entry = g_new0(StatsSchema, 1);
|
|
||||||
|
|
||||||
entry->provider = provider;
|
|
||||||
entry->target = target;
|
|
||||||
entry->stats = stats_list;
|
|
||||||
QAPI_LIST_PREPEND(*schema_results, entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool apply_str_list_filter(const char *string, strList *list)
|
|
||||||
{
|
|
||||||
strList *str_list = NULL;
|
|
||||||
|
|
||||||
if (!list) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
for (str_list = list; str_list; str_list = str_list->next) {
|
|
||||||
if (g_str_equal(string, str_list->value)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
1
stats/meson.build
Normal file
1
stats/meson.build
Normal file
@ -0,0 +1 @@
|
|||||||
|
softmmu_ss.add(files('stats-qmp-cmds.c'))
|
162
stats/stats-qmp-cmds.c
Normal file
162
stats/stats-qmp-cmds.c
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
/*
|
||||||
|
* QMP commands related to stats
|
||||||
|
*
|
||||||
|
* This work is licensed under the terms of the GNU GPL, version 2 or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "qemu/osdep.h"
|
||||||
|
#include "sysemu/stats.h"
|
||||||
|
#include "qapi/qapi-commands-stats.h"
|
||||||
|
#include "qemu/queue.h"
|
||||||
|
#include "qapi/error.h"
|
||||||
|
|
||||||
|
typedef struct StatsCallbacks {
|
||||||
|
StatsProvider provider;
|
||||||
|
StatRetrieveFunc *stats_cb;
|
||||||
|
SchemaRetrieveFunc *schemas_cb;
|
||||||
|
QTAILQ_ENTRY(StatsCallbacks) next;
|
||||||
|
} StatsCallbacks;
|
||||||
|
|
||||||
|
static QTAILQ_HEAD(, StatsCallbacks) stats_callbacks =
|
||||||
|
QTAILQ_HEAD_INITIALIZER(stats_callbacks);
|
||||||
|
|
||||||
|
void add_stats_callbacks(StatsProvider provider,
|
||||||
|
StatRetrieveFunc *stats_fn,
|
||||||
|
SchemaRetrieveFunc *schemas_fn)
|
||||||
|
{
|
||||||
|
StatsCallbacks *entry = g_new(StatsCallbacks, 1);
|
||||||
|
entry->provider = provider;
|
||||||
|
entry->stats_cb = stats_fn;
|
||||||
|
entry->schemas_cb = schemas_fn;
|
||||||
|
|
||||||
|
QTAILQ_INSERT_TAIL(&stats_callbacks, entry, next);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool invoke_stats_cb(StatsCallbacks *entry,
|
||||||
|
StatsResultList **stats_results,
|
||||||
|
StatsFilter *filter, StatsRequest *request,
|
||||||
|
Error **errp)
|
||||||
|
{
|
||||||
|
ERRP_GUARD();
|
||||||
|
strList *targets = NULL;
|
||||||
|
strList *names = NULL;
|
||||||
|
|
||||||
|
if (request) {
|
||||||
|
if (request->provider != entry->provider) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (request->has_names && !request->names) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
names = request->has_names ? request->names : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (filter->target) {
|
||||||
|
case STATS_TARGET_VM:
|
||||||
|
break;
|
||||||
|
case STATS_TARGET_VCPU:
|
||||||
|
if (filter->u.vcpu.has_vcpus) {
|
||||||
|
if (!filter->u.vcpu.vcpus) {
|
||||||
|
/* No targets allowed? Return no statistics. */
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
targets = filter->u.vcpu.vcpus;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
entry->stats_cb(stats_results, filter->target, names, targets, errp);
|
||||||
|
if (*errp) {
|
||||||
|
qapi_free_StatsResultList(*stats_results);
|
||||||
|
*stats_results = NULL;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
StatsResultList *qmp_query_stats(StatsFilter *filter, Error **errp)
|
||||||
|
{
|
||||||
|
StatsResultList *stats_results = NULL;
|
||||||
|
StatsCallbacks *entry;
|
||||||
|
StatsRequestList *request;
|
||||||
|
|
||||||
|
QTAILQ_FOREACH(entry, &stats_callbacks, next) {
|
||||||
|
if (filter->has_providers) {
|
||||||
|
for (request = filter->providers; request; request = request->next) {
|
||||||
|
if (!invoke_stats_cb(entry, &stats_results, filter,
|
||||||
|
request->value, errp)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!invoke_stats_cb(entry, &stats_results, filter, NULL, errp)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return stats_results;
|
||||||
|
}
|
||||||
|
|
||||||
|
StatsSchemaList *qmp_query_stats_schemas(bool has_provider,
|
||||||
|
StatsProvider provider,
|
||||||
|
Error **errp)
|
||||||
|
{
|
||||||
|
ERRP_GUARD();
|
||||||
|
StatsSchemaList *stats_results = NULL;
|
||||||
|
StatsCallbacks *entry;
|
||||||
|
|
||||||
|
QTAILQ_FOREACH(entry, &stats_callbacks, next) {
|
||||||
|
if (!has_provider || provider == entry->provider) {
|
||||||
|
entry->schemas_cb(&stats_results, errp);
|
||||||
|
if (*errp) {
|
||||||
|
qapi_free_StatsSchemaList(stats_results);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return stats_results;
|
||||||
|
}
|
||||||
|
|
||||||
|
void add_stats_entry(StatsResultList **stats_results, StatsProvider provider,
|
||||||
|
const char *qom_path, StatsList *stats_list)
|
||||||
|
{
|
||||||
|
StatsResult *entry = g_new0(StatsResult, 1);
|
||||||
|
|
||||||
|
entry->provider = provider;
|
||||||
|
entry->qom_path = g_strdup(qom_path);
|
||||||
|
entry->stats = stats_list;
|
||||||
|
|
||||||
|
QAPI_LIST_PREPEND(*stats_results, entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
void add_stats_schema(StatsSchemaList **schema_results,
|
||||||
|
StatsProvider provider, StatsTarget target,
|
||||||
|
StatsSchemaValueList *stats_list)
|
||||||
|
{
|
||||||
|
StatsSchema *entry = g_new0(StatsSchema, 1);
|
||||||
|
|
||||||
|
entry->provider = provider;
|
||||||
|
entry->target = target;
|
||||||
|
entry->stats = stats_list;
|
||||||
|
QAPI_LIST_PREPEND(*schema_results, entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool apply_str_list_filter(const char *string, strList *list)
|
||||||
|
{
|
||||||
|
strList *str_list = NULL;
|
||||||
|
|
||||||
|
if (!list) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for (str_list = list; str_list; str_list = str_list->next) {
|
||||||
|
if (g_str_equal(string, str_list->value)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user