From nobody Tue May 14 20:11:58 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) client-ip=170.10.129.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=weirdnatto.in ARC-Seal: i=1; a=rsa-sha256; t=1660792737; cv=none; d=zohomail.com; s=zohoarc; b=a5dB0YLiBAOmd5AQpCgxYzrlqXp9AW7CxS+8IFM9EVebiGhJ+V2ylbt70GHFppuYGDszYCAmZGWPajgS/gJ6ntT1smvtA5IQ8FjePAm9iDIRbBADQqkVoEB7U1/aSq93qbHwUHp5OWJRchsfa3u4MDkGnPiVLWughWQn0hsaA18= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1660792737; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=lso0BdP7TMQFLMbIN/do8ta7MUADpl7YD9ZTVz8va3E=; b=aj8jZsyNZDa233d7w1vZ6IhJhNoc6xbrL7UyBSJ3hBSXXHukWkqyrWkl54zQ7Asm237OrTa66KVBkFsKNyjZ5ZZdFp6crXbkFLzJIINlzN2mOKPXGDkFbLYaCs2goJ0so6X4erql812DqZX7FCg3GeXvbyC/sV0BOXJxJvMvYUM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mx.zohomail.com with SMTPS id 1660792736999966.8999232902141; Wed, 17 Aug 2022 20:18:56 -0700 (PDT) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-15-2-NMLkbfOSyJfxy0pCNJtQ-1; Wed, 17 Aug 2022 23:18:51 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.rdu2.redhat.com [10.11.54.7]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 1D2521019C8D; Thu, 18 Aug 2022 03:18:49 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0594914152E1; Thu, 18 Aug 2022 03:18:49 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id D28EE194E00A; Thu, 18 Aug 2022 03:18:48 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 0D7C8194E00A for ; Thu, 18 Aug 2022 03:18:29 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id E75E52029F6B; Thu, 18 Aug 2022 03:18:28 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast03.extmail.prod.ext.rdu2.redhat.com [10.11.55.19]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E384F2026D4C for ; Thu, 18 Aug 2022 03:18:25 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 387EF811E75 for ; Thu, 18 Aug 2022 03:18:25 +0000 (UTC) Received: from mail.weirdnatto.in (140.238.225.67 [140.238.225.67]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-127-rX-S1EKPOEOcI4CxB50Vrw-1; Wed, 17 Aug 2022 23:18:23 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1660792734; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=lso0BdP7TMQFLMbIN/do8ta7MUADpl7YD9ZTVz8va3E=; b=Gw1l0ppYG+/RL9S/rB5tVzT2kQCy85PuDBw5Ws0YPH0vNZQLSSbKMQZJ+/SQMXfZ++pOac orcZWY2DadvhdUl1J1pz+LMFHDeimGoR/edPzV7jCJlfoGg8gM//p9OVxk1ShrSOLF1cbP oDGRIFP1ufcRVKtFu4MSoatC78TBcHE= X-MC-Unique: 2-NMLkbfOSyJfxy0pCNJtQ-1 X-Original-To: libvir-list@listman.corp.redhat.com X-MC-Unique: rX-S1EKPOEOcI4CxB50Vrw-1 From: Amneesh Singh To: libvir-list@redhat.com Subject: [PATCH v4 1/3] qemu_monitor: add qemuMonitorQueryStats Date: Thu, 18 Aug 2022 08:47:18 +0530 Message-Id: <20220818031720.871481-2-natto@weirdnatto.in> In-Reply-To: <20220818031720.871481-1-natto@weirdnatto.in> References: <20220818031720.871481-1-natto@weirdnatto.in> MIME-Version: 1.0 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mkletzan@redhat.com, pbonzini@redhat.com, Amneesh Singh Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 2.85 on 10.11.54.7 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1660792738601100001 Content-Type: text/plain; charset="utf-8"; x-default="true" Related: https://gitlab.com/libvirt/libvirt/-/issues/276 This patch adds an API for the "query-stats" QMP command. The query returns a JSON containing the statistics based on the target, which can either be vCPU or VM, and the providers. The API deserializes the query result into an array of GHashMaps, which can later be used to extract all the query statistics. GHashMaps are used to avoid traversing the entire array to find the statistics you are looking for. This would be a singleton array if the target is a VM since the returned JSON is also a singleton array in that case. Signed-off-by: Amneesh Singh Reviewed-by: Martin Kletzander --- src/qemu/qemu_monitor.c | 117 +++++++++++++++++++++++++++++++++++ src/qemu/qemu_monitor.h | 48 ++++++++++++++ src/qemu/qemu_monitor_json.c | 91 +++++++++++++++++++++++++++ src/qemu/qemu_monitor_json.h | 6 ++ 4 files changed, 262 insertions(+) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 4739810c9b..1488f7481f 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -4297,3 +4297,120 @@ qemuMonitorGetMigrationBlockers(qemuMonitor *mon, =20 return qemuMonitorJSONGetMigrationBlockers(mon, blockers); } + + +VIR_ENUM_IMPL(qemuMonitorQueryStatsTarget, + QEMU_MONITOR_QUERY_STATS_TARGET_LAST, + "vm", + "vcpu", +); + + +VIR_ENUM_IMPL(qemuMonitorQueryStatsName, + QEMU_MONITOR_QUERY_STATS_NAME_LAST, + "halt_poll_success_ns", + "halt_poll_fail_ns", +); + + +VIR_ENUM_IMPL(qemuMonitorQueryStatsProvider, + QEMU_MONITOR_QUERY_STATS_PROVIDER_LAST, + "kvm", +); + + +void +qemuMonitorQueryStatsProviderFree(qemuMonitorQueryStatsProvider *provider) +{ + virBitmapFree(provider->names); + g_free(provider); +} + + +qemuMonitorQueryStatsProvider * +qemuMonitorQueryStatsProviderNew(qemuMonitorQueryStatsProviderType provide= r_type, + ...) +{ + qemuMonitorQueryStatsProvider *provider =3D g_new0(qemuMonitorQuerySta= tsProvider, 1); + qemuMonitorQueryStatsNameType stat; + va_list name_list; + + /* + * This can be lowered later in case of the enum getting quite large, = hence + * the virBitmapSetExpand below which also incidently makes this func= tion + * non-fallible. + */ + provider->names =3D virBitmapNew(QEMU_MONITOR_QUERY_STATS_NAME_LAST); + provider->type =3D provider_type; + + va_start(name_list, provider_type); + + while ((stat =3D va_arg(name_list, qemuMonitorQueryStatsNameType)) != =3D + QEMU_MONITOR_QUERY_STATS_NAME_LAST) + virBitmapSetBitExpand(provider->names, stat); + + va_end(name_list); + + return provider; +} + + +virJSONValue * +qemuMonitorQueryStats(qemuMonitor *mon, + qemuMonitorQueryStatsTargetType target, + char **vcpus, + GPtrArray *providers) +{ + VIR_DEBUG("target=3D%u vcpus=3D%p providers=3D%p", target, vcpus, prov= iders); + + QEMU_CHECK_MONITOR_NULL(mon); + + if (target !=3D QEMU_MONITOR_QUERY_STATS_TARGET_VCPU && vcpus) + return NULL; + + return qemuMonitorJSONQueryStats(mon, target, vcpus, providers); +} + + +/** + * qemuMonitorExtractQueryStats: + * @info: One of the array members returned by qemuMonitorQueryStat + * + * Converts all the statistics into a GHashTable similar to virQEMU + * except only object with the key "value" is stored as the value i + * + * Returns NULL on failure. + */ +GHashTable * +qemuMonitorExtractQueryStats(virJSONValue *info) +{ + g_autoptr(GHashTable) hash_table =3D NULL; + virJSONValue *stats =3D NULL; + size_t i; + + if (!virJSONValueIsObject(info)) + return NULL; + + stats =3D virJSONValueObjectGetArray(info, "stats"); + hash_table =3D virHashNew(virJSONValueHashFree); + + for (i =3D 0; i < virJSONValueArraySize(stats); i++) { + virJSONValue *stat =3D virJSONValueArrayGet(stats, i); + virJSONValue *value =3D NULL; + const char *name =3D NULL; + + if (!virJSONValueIsObject(stat)) + continue; + + name =3D virJSONValueObjectGetString(stat, "name"); + if (!name) + continue; + + if (virJSONValueObjectRemoveKey(stat, "value", &value) < 0) + continue; + + virHashAddEntry(hash_table, name, value); + } + + return g_steal_pointer(&hash_table); +} diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 78e2ebf0bd..63269e15bc 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1481,3 +1481,51 @@ qemuMonitorMigrateRecover(qemuMonitor *mon, int qemuMonitorGetMigrationBlockers(qemuMonitor *mon, char ***blockers); + +typedef enum { + QEMU_MONITOR_QUERY_STATS_TARGET_VM, + QEMU_MONITOR_QUERY_STATS_TARGET_VCPU, + QEMU_MONITOR_QUERY_STATS_TARGET_LAST, +} qemuMonitorQueryStatsTargetType; + +VIR_ENUM_DECL(qemuMonitorQueryStatsTarget); + +typedef enum { + QEMU_MONITOR_QUERY_STATS_NAME_HALT_POLL_SUCCESS_NS, + QEMU_MONITOR_QUERY_STATS_NAME_HALT_POLL_FAIL_NS, + QEMU_MONITOR_QUERY_STATS_NAME_LAST, +} qemuMonitorQueryStatsNameType; + +VIR_ENUM_DECL(qemuMonitorQueryStatsName); + +typedef enum { + QEMU_MONITOR_QUERY_STATS_PROVIDER_KVM, + QEMU_MONITOR_QUERY_STATS_PROVIDER_LAST, +} qemuMonitorQueryStatsProviderType; + +VIR_ENUM_DECL(qemuMonitorQueryStatsProvider); + +typedef struct _qemuMonitorQueryStatsProvider qemuMonitorQueryStatsProvide= r; +struct _qemuMonitorQueryStatsProvider { + qemuMonitorQueryStatsProviderType type; + virBitmap *names; +}; + +void +qemuMonitorQueryStatsProviderFree(qemuMonitorQueryStatsProvider *provider); + +qemuMonitorQueryStatsProvider * +qemuMonitorQueryStatsProviderNew(qemuMonitorQueryStatsProviderType provide= r_type, + ...); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuMonitorQueryStatsProvider, + qemuMonitorQueryStatsProviderFree); + +virJSONValue * +qemuMonitorQueryStats(qemuMonitor *mon, + qemuMonitorQueryStatsTargetType target, + char **vcpus, + GPtrArray *providers); + +GHashTable * +qemuMonitorExtractQueryStats(virJSONValue *info); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index d664e827dd..70fba50e6c 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -8574,3 +8574,94 @@ qemuMonitorJSONMigrateRecover(qemuMonitor *mon, =20 return qemuMonitorJSONCheckError(cmd, reply); } + + +/** + * qemuMonitorJSONQueryStats: + * @mon: monitor object + * @target: the target type for the query + * @vcpus: a list of vCPU QOM paths for filtering the statistics + * @providers: an array of providers to filter statistics + * + * @vcpus is a NULL terminated array of strings. @providers is a GPtrArray + * for qemuMonitorQueryStatsProvider. + * @vcpus and @providers are optional and can be NULL. + * + * Queries for the @target based statistics. + * Returns NULL on failure. + */ +virJSONValue * +qemuMonitorJSONQueryStats(qemuMonitor *mon, + qemuMonitorQueryStatsTargetType target, + char **vcpus, + GPtrArray *providers) +{ + g_autoptr(virJSONValue) cmd =3D NULL; + g_autoptr(virJSONValue) reply =3D NULL; + g_autoptr(virJSONValue) vcpu_list =3D NULL; + g_autoptr(virJSONValue) provider_list =3D NULL; + + size_t i; + + if (providers) { + provider_list =3D virJSONValueNewArray(); + + for (i =3D 0; i < providers->len; i++) { + g_autoptr(virJSONValue) provider_obj =3D virJSONValueNewObject= (); + qemuMonitorQueryStatsProvider *provider =3D providers->pdata[i= ]; + const char *type_str =3D qemuMonitorQueryStatsProviderTypeToSt= ring(provider->type); + virBitmap *names =3D provider->names; + int rc; + + rc =3D virJSONValueObjectAppendString(provider_obj, "provider"= , type_str); + + if (rc < 0) + return NULL; + + if (!virBitmapIsAllClear(names)) { + g_autoptr(virJSONValue) provider_names =3D virJSONValueNew= Array(); + ssize_t curBit =3D -1; + + while ((curBit =3D virBitmapNextSetBit(names, curBit)) != =3D -1) { + const char *name =3D qemuMonitorQueryStatsNameTypeToSt= ring(curBit); + + if (virJSONValueArrayAppendString(provider_names, name= ) < 0) + return NULL; + } + + rc =3D virJSONValueObjectAppend(provider_obj, "names", &pr= ovider_names); + + if (rc < 0) + return NULL; + } + + if (virJSONValueArrayAppend(provider_list, &provider_obj) < 0) + return NULL; + } + } + + if (vcpus) { + vcpu_list =3D virJSONValueNewArray(); + + for (i =3D 0; vcpus[i]; i++) + if (virJSONValueArrayAppendString(vcpu_list, vcpus[i]) < 0) + return NULL; + } + + cmd =3D qemuMonitorJSONMakeCommand("query-stats", + "s:target", qemuMonitorQueryStatsTarg= etTypeToString(target), + "A:vcpus", &vcpu_list, + "A:providers", &provider_list, + NULL); + + if (!cmd) + return NULL; + + if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) + return NULL; + + if (qemuMonitorJSONCheckReply(cmd, reply, VIR_JSON_TYPE_ARRAY) < 0) + return NULL; + + return virJSONValueObjectStealArray(reply, "return"); +} diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 5154c195c9..a53e6423df 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -812,3 +812,9 @@ qemuMonitorJSONChangeMemoryRequestedSize(qemuMonitor *m= on, int qemuMonitorJSONMigrateRecover(qemuMonitor *mon, const char *uri); + +virJSONValue * +qemuMonitorJSONQueryStats(qemuMonitor *mon, + qemuMonitorQueryStatsTargetType target, + char **vcpus, + GPtrArray *providers); --=20 2.37.1 From nobody Tue May 14 20:11:58 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=weirdnatto.in ARC-Seal: i=1; a=rsa-sha256; t=1660792717; cv=none; d=zohomail.com; s=zohoarc; b=mHl22+5jlHusLFxUbMobQ2IlhlE0M9WDHslTeNu5h1AuDiKrTscycD5UOplU5+xmBgd/NxVq7G8BHDzMlI+YGNq9vgY8GOTr+3MtY6eNQ1RNJ4AB1WvRs1Zp/1JJEUKedcGJhD/m1lUu+yvOyy42qkdw1NJY+B4Ue/20Ca4Wf+E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1660792717; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=8REkXtl5eTpITK5ijTMHpv1chSvG2WFNSsf7mQSKdxM=; b=BuEMZP7H9nqrF0nwM2zCj607DcqwZdcIrxr7eayuASqJjZzErP+UKZSGy8JlLCjmJij8PX/dZZ8g4EWuSFvTLplLx6amUpeldPDXcZcIYTxV3LC3SqjUBLI/XplZpI/T36SzsIgYruzsAeaxUg5CdHBnVkRuuhkXLgLmjO3P4Co= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1660792717283362.14221835561955; Wed, 17 Aug 2022 20:18:37 -0700 (PDT) Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-130-ex-dI0PfNLq91Anvca2Jdg-1; Wed, 17 Aug 2022 23:18:32 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id E6ADF3802BA7; Thu, 18 Aug 2022 03:18:30 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1639E1121319; Thu, 18 Aug 2022 03:18:28 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id C3784194E00B; Thu, 18 Aug 2022 03:18:27 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 50695193F6F6 for ; Thu, 18 Aug 2022 03:18:25 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 2DEE140CFD0A; Thu, 18 Aug 2022 03:18:25 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast03.extmail.prod.ext.rdu2.redhat.com [10.11.55.19]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2924F40CFD05 for ; Thu, 18 Aug 2022 03:18:25 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-2.mimecast.com [207.211.31.81]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 11720811E80 for ; Thu, 18 Aug 2022 03:18:25 +0000 (UTC) Received: from mail.weirdnatto.in (140.238.225.67 [140.238.225.67]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-627-c1kz0nMIP0WiOK0aK4cBmg-1; Wed, 17 Aug 2022 23:18:23 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1660792716; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=8REkXtl5eTpITK5ijTMHpv1chSvG2WFNSsf7mQSKdxM=; b=UZhFdFNXe2lOzua4srD8hJyNHZJ4yeywovlHTP0TjEuEIeIqXdFZMUAhLP8F1MEVDTrVIj 5DghX3vQRTbWVPd/cbqD55XQpOtcYeR4QI652NzpUm5va8YDpmSmYn4Ziy2+FqUBam+yny VSSbhSibjkq3PPPHvsKtpATWSNtAS0k= X-MC-Unique: ex-dI0PfNLq91Anvca2Jdg-1 X-Original-To: libvir-list@listman.corp.redhat.com X-MC-Unique: c1kz0nMIP0WiOK0aK4cBmg-1 From: Amneesh Singh To: libvir-list@redhat.com Subject: [PATCH v4 2/3] qemu_capabilities: add "query-stats" QMP command to the QEMU capabilities Date: Thu, 18 Aug 2022 08:47:19 +0530 Message-Id: <20220818031720.871481-3-natto@weirdnatto.in> In-Reply-To: <20220818031720.871481-1-natto@weirdnatto.in> References: <20220818031720.871481-1-natto@weirdnatto.in> MIME-Version: 1.0 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.84 on 10.11.54.1 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mkletzan@redhat.com, pbonzini@redhat.com, Amneesh Singh Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1660792718544100001 Content-Type: text/plain; charset="utf-8"; x-default="true" Related: https://gitlab.com/libvirt/libvirt/-/issues/276 Signed-off-by: Amneesh Singh Reviewed-by: Martin Kletzander --- src/qemu/qemu_capabilities.c | 4 ++++ src/qemu/qemu_capabilities.h | 3 +++ tests/qemucapabilitiesdata/caps_7.1.0.x86_64.xml | 1 + 3 files changed, 8 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 4fca774425..f7986ef938 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -673,6 +673,9 @@ VIR_ENUM_IMPL(virQEMUCaps, "iothread.thread-pool-max", /* QEMU_CAPS_IOTHREAD_THREAD_POO= L_MAX */ "usb-host.guest-resets-all", /* QEMU_CAPS_USB_HOST_GUESTS_RE= SETS_ALL */ "migration.blocked-reasons", /* QEMU_CAPS_MIGRATION_BLOCKED_= REASONS */ + + /* 435 */ + "query-stats", /* QEMU_CAPS_QUERY_STATS */ ); =20 =20 @@ -1223,6 +1226,7 @@ struct virQEMUCapsStringFlags virQEMUCapsCommands[] = =3D { { "query-dirty-rate", QEMU_CAPS_QUERY_DIRTY_RATE }, { "sev-inject-launch-secret", QEMU_CAPS_SEV_INJECT_LAUNCH_SECRET }, { "calc-dirty-rate", QEMU_CAPS_CALC_DIRTY_RATE }, + { "query-stats", QEMU_CAPS_QUERY_STATS }, }; =20 struct virQEMUCapsStringFlags virQEMUCapsMigration[] =3D { diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index fc8bb6e2ab..cccb3659aa 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -653,6 +653,9 @@ typedef enum { /* virQEMUCapsFlags grouping marker for = syntax-check */ QEMU_CAPS_USB_HOST_GUESTS_RESETS_ALL, /* -device usb-host.guest-resets= -all */ QEMU_CAPS_MIGRATION_BLOCKED_REASONS, /* query-migrate returns 'blocked= -reasons */ =20 + /* 435 */ + QEMU_CAPS_QUERY_STATS, /* accepts query-stats */ + QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; =20 diff --git a/tests/qemucapabilitiesdata/caps_7.1.0.x86_64.xml b/tests/qemuc= apabilitiesdata/caps_7.1.0.x86_64.xml index ad43385594..7f17b2360a 100644 --- a/tests/qemucapabilitiesdata/caps_7.1.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_7.1.0.x86_64.xml @@ -225,6 +225,7 @@ + 7000050 0 43100244 --=20 2.37.1 From nobody Tue May 14 20:11:58 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) client-ip=170.10.129.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=weirdnatto.in ARC-Seal: i=1; a=rsa-sha256; t=1660792717; cv=none; d=zohomail.com; s=zohoarc; b=nS3KWdBVKTdC/7UgcMqEFeQ6IKceCJtJhWEJgneoxBmoaI+PMWEw3U0pRAjJJI9tbNcQInNmA1dp6iShXHlHKMJMC6k/i9lZ54FCGV0Ttr5QUTEgJVVxEdf6Gs62pFq6I33oKeWElcqI/6LdsJgESiR5zNnxtUYjhsnHyBlcoXI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1660792717; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=R23QP7iGdn03OpqzRmLRPbL7FNSou/uYa3LsDywnVXE=; b=lUEeCgHl0UStpA4DTZ+xZD4jrhoEIAWAAHhmMlEV3qUMXLPkTdcmJUHxNBjn9DIsr6eaUCcnSJMt5di0guYUw++TQLYs2w2MM9PKm7/QkwtrgRQC3E+8jwei3gjZyqZ8/hCULsYDSx2kpLrbYm13G5wDBUt9DngOFeZJ35Ypb3c= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mx.zohomail.com with SMTPS id 1660792717727525.9094844393793; Wed, 17 Aug 2022 20:18:37 -0700 (PDT) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-257-vSAJKGcBMMitCDedNXUZHg-1; Wed, 17 Aug 2022 23:18:33 -0400 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id E67798037AC; Thu, 18 Aug 2022 03:18:30 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id F28B0492C3B; Thu, 18 Aug 2022 03:18:29 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 6F13C194E109; Thu, 18 Aug 2022 03:18:28 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.rdu2.redhat.com [10.11.54.7]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id AF28E193F6F6 for ; Thu, 18 Aug 2022 03:18:27 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 9431814152E2; Thu, 18 Aug 2022 03:18:27 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast06.extmail.prod.ext.rdu2.redhat.com [10.11.55.22]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 90B6014152E1 for ; Thu, 18 Aug 2022 03:18:27 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 79918185A79C for ; Thu, 18 Aug 2022 03:18:27 +0000 (UTC) Received: from mail.weirdnatto.in (140.238.225.67 [140.238.225.67]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-247-cEr99wO9MjGUXYi_ClRJhg-1; Wed, 17 Aug 2022 23:18:23 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1660792716; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=R23QP7iGdn03OpqzRmLRPbL7FNSou/uYa3LsDywnVXE=; b=TVw4uiOmJfqCCrqfXILWYEszg17pSPfD4P1sxx9tDA31mX7bL8iyN68JXa4prM2uuP+B46 w9F132n9UNfoFQ4OBtd6SpsNGTvCHq0wapsrxTe2rdOYwjCb0tNsOAjlYhByp8+lX87yxv sgpa+f1g6hLRpi9z9m9KWWDn4ClG5m8= X-MC-Unique: vSAJKGcBMMitCDedNXUZHg-1 X-Original-To: libvir-list@listman.corp.redhat.com X-MC-Unique: cEr99wO9MjGUXYi_ClRJhg-1 From: Amneesh Singh To: libvir-list@redhat.com Subject: [PATCH v4 3/3] qemu_driver: use qemuMonitorQueryStats to extract halt poll time Date: Thu, 18 Aug 2022 08:47:20 +0530 Message-Id: <20220818031720.871481-4-natto@weirdnatto.in> In-Reply-To: <20220818031720.871481-1-natto@weirdnatto.in> References: <20220818031720.871481-1-natto@weirdnatto.in> MIME-Version: 1.0 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.85 on 10.11.54.7 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mkletzan@redhat.com, pbonzini@redhat.com, Amneesh Singh Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 2.85 on 10.11.54.10 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1660792718665100003 Content-Type: text/plain; charset="utf-8"; x-default="true" This patch uses qemuMonitorQueryStats to query "halt_poll_success_ns" and "halt_poll_fail_ns" for every vCPU. The respective values for each vCPU are then added together. Signed-off-by: Amneesh Singh Reviewed-by: Martin Kletzander --- src/qemu/qemu_driver.c | 81 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 75 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 333225dd21..6e2bef26aa 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -17769,15 +17769,84 @@ qemuDomainGetStatsCpuCgroup(virDomainObj *dom, return 0; } =20 +static int +qemuDomainGetStatsCpuHaltPollTimeFromStats(virDomainObj *dom, + unsigned int privflags, + unsigned long long *haltPollSuc= cess, + unsigned long long *haltPollFai= l) +{ + qemuDomainObjPrivate *priv =3D dom->privateData; + qemuMonitorQueryStatsTargetType target =3D QEMU_MONITOR_QUERY_STATS_TA= RGET_VCPU; + qemuMonitorQueryStatsProvider *provider =3D NULL; + g_autoptr(GPtrArray) providers =3D NULL; + g_autoptr(virJSONValue) queried_stats =3D NULL; + const char *success_str =3D qemuMonitorQueryStatsNameTypeToString(QEMU= _MONITOR_QUERY_STATS_NAME_HALT_POLL_SUCCESS_NS); + const char *fail_str =3D qemuMonitorQueryStatsNameTypeToString(QEMU_MO= NITOR_QUERY_STATS_NAME_HALT_POLL_FAIL_NS); + size_t i; + + if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_QUERY_STATS)) + return -1; + + if (!HAVE_JOB(privflags)) + return -1; + + provider =3D qemuMonitorQueryStatsProviderNew( + QEMU_MONITOR_QUERY_STATS_PROVIDER_KVM, + QEMU_MONITOR_QUERY_STATS_NAME_HALT_POLL_SUCCESS_NS, + QEMU_MONITOR_QUERY_STATS_NAME_HALT_POLL_FAIL_NS, + QEMU_MONITOR_QUERY_STATS_NAME_LAST); + + providers =3D g_ptr_array_new_full(1, (GDestroyNotify) qemuMonitorQuer= yStatsProviderFree); + g_ptr_array_add(providers, provider); + + qemuDomainObjEnterMonitor(dom); + queried_stats =3D qemuMonitorQueryStats(priv->mon, target, NULL, provi= ders); + qemuDomainObjExitMonitor(dom); + + if (!queried_stats) + return -1; + + for (i =3D 0; i < virJSONValueArraySize(queried_stats); i++) { + unsigned long long curHaltPollSuccess, curHaltPollFail; + virJSONValue *success_obj, *fail_obj; + virJSONValue *obj =3D virJSONValueArrayGet(queried_stats, i); + g_autoptr(GHashTable) cur_table =3D qemuMonitorExtractQueryStats(o= bj); + + if (!cur_table) + return -1; + + success_obj =3D g_hash_table_lookup(cur_table, success_str); + fail_obj =3D g_hash_table_lookup(cur_table, fail_str); + + if (!success_obj || !fail_obj) + return -1; + + if (virJSONValueGetNumberUlong(success_obj, &curHaltPollSuccess) <= 0 || + virJSONValueGetNumberUlong(fail_obj, &curHaltPollFail) < 0) + return -1; + + *haltPollSuccess +=3D curHaltPollSuccess; + *haltPollFail +=3D curHaltPollFail; + } + + return 0; +} + + static int qemuDomainGetStatsCpuHaltPollTime(virDomainObj *dom, - virTypedParamList *params) + virTypedParamList *params, + unsigned int privflags) { unsigned long long haltPollSuccess =3D 0; unsigned long long haltPollFail =3D 0; - pid_t pid =3D dom->pid; =20 - if (virHostCPUGetHaltPollTime(pid, &haltPollSuccess, &haltPollFail) < = 0) + if (!virDomainObjIsActive(dom)) + return 0; + + if (qemuDomainGetStatsCpuHaltPollTimeFromStats(dom, privflags, + &haltPollSuccess, &halt= PollFail) < 0 && + virHostCPUGetHaltPollTime(dom->pid, &haltPollSuccess, &haltPollFai= l) < 0) return 0; =20 if (virTypedParamListAddULLong(params, haltPollSuccess, "cpu.haltpoll.= success.time") < 0 || @@ -17791,7 +17860,7 @@ static int qemuDomainGetStatsCpu(virQEMUDriver *driver, virDomainObj *dom, virTypedParamList *params, - unsigned int privflags G_GNUC_UNUSED) + unsigned int privflags) { if (qemuDomainGetStatsCpuCgroup(dom, params) < 0) return -1; @@ -17799,7 +17868,7 @@ qemuDomainGetStatsCpu(virQEMUDriver *driver, if (qemuDomainGetStatsCpuCache(driver, dom, params) < 0) return -1; =20 - if (qemuDomainGetStatsCpuHaltPollTime(dom, params) < 0) + if (qemuDomainGetStatsCpuHaltPollTime(dom, params, privflags) < 0) return -1; =20 return 0; @@ -18576,7 +18645,7 @@ static virQEMUCapsFlags queryDirtyRateRequired[] = =3D { =20 static struct qemuDomainGetStatsWorker qemuDomainGetStatsWorkers[] =3D { { qemuDomainGetStatsState, VIR_DOMAIN_STATS_STATE, false, NULL }, - { qemuDomainGetStatsCpu, VIR_DOMAIN_STATS_CPU_TOTAL, false, NULL }, + { qemuDomainGetStatsCpu, VIR_DOMAIN_STATS_CPU_TOTAL, true, NULL }, { qemuDomainGetStatsBalloon, VIR_DOMAIN_STATS_BALLOON, true, NULL }, { qemuDomainGetStatsVcpu, VIR_DOMAIN_STATS_VCPU, true, NULL }, { qemuDomainGetStatsInterface, VIR_DOMAIN_STATS_INTERFACE, false, NULL= }, --=20 2.37.1