From nobody Wed May 15 11:19:56 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=1657778048; cv=none; d=zohomail.com; s=zohoarc; b=bqzgQC3sbdPw7+mOPUB+TNf0nRWCwxhv+J9zOMYeE2sjLZYX6myx1NrsFEaFsf7d6YibM4fYxn0qAVFvW/wDFMMSXaV8d4s7hHD4eb7n9zVcazFg5vzKBJ5Nc4T3Krjit743xozX3kbDxN1IcgEufGXwFvz5r/eUy9IqEyaqENk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1657778048; 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=oPQQgXPdzId10CqPM77lQ/ta31XtjdwMPfjU7BfypGc=; b=IkiekmJC8ghjv3OSIn5tcsYUhjsMW2wpg8ijXG1UCf3+ABmpeylNIo7rTd9NwUMn9tO9s03ov5QoSVY9twyHZKWNEd45Bb089O/FzvxGwVNTJpyexAg06Zb8GxqIvmXOQQKFOK/6pRziTJV7GdW0UP8gmMF07Qen0ek+xf9n6po= 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 1657778048921810.0616734560824; Wed, 13 Jul 2022 22:54:08 -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-216-cWLGX_HpPPGvNmPsyR12gQ-1; Thu, 14 Jul 2022 01:54:04 -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 C11DA811E7A; Thu, 14 Jul 2022 05:54:02 +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 A95191121314; Thu, 14 Jul 2022 05:54:02 +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 7C4101947071; Thu, 14 Jul 2022 05:54:02 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id B031219452D8 for ; Thu, 14 Jul 2022 05:52:50 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 8AB571121315; Thu, 14 Jul 2022 05:52:50 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast10.extmail.prod.ext.rdu2.redhat.com [10.11.55.26]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 86D081121314 for ; Thu, 14 Jul 2022 05:52:50 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [205.139.110.61]) (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 674721C04B6A for ; Thu, 14 Jul 2022 05:52:50 +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.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-312-P06kVaSVNVmlwUidk5HaSQ-1; Thu, 14 Jul 2022 01:52:47 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1657778047; 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=oPQQgXPdzId10CqPM77lQ/ta31XtjdwMPfjU7BfypGc=; b=eB9T8b+/fY1PHig7lGf2+6l/sFjOeYFGxGAlVQj/X1rxQg/WsNpHhRqZmJqRgE0K3/juM0 5bL7MmkvXLLY1pGrcstgUQkTLiEcM94fDz1NW4GmuSbOfh1MnMrFFIIJqRoM/QDDBoiLNy PNsvGerbYDuGKRHVSj4MI3pRcl0zBfE= X-MC-Unique: cWLGX_HpPPGvNmPsyR12gQ-1 X-Original-To: libvir-list@listman.corp.redhat.com X-MC-Unique: P06kVaSVNVmlwUidk5HaSQ-1 From: Amneesh Singh To: libvir-list@redhat.com Subject: [PATCH 1/3] qemu_monitor: add qemuMonitorQueryStats Date: Thu, 14 Jul 2022 11:22:02 +0530 Message-Id: <20220714055204.1277661-2-natto@weirdnatto.in> In-Reply-To: <20220714055204.1277661-1-natto@weirdnatto.in> References: <20220714055204.1277661-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.3 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, pkrempa@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 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com 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: 1657778050132100001 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 --- src/qemu/qemu_monitor.c | 70 +++++++++++++++++++ src/qemu/qemu_monitor.h | 45 ++++++++++++ src/qemu/qemu_monitor_json.c | 130 +++++++++++++++++++++++++++++++++++ src/qemu/qemu_monitor_json.h | 6 ++ 4 files changed, 251 insertions(+) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index fda5d2f3..a07e6017 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -4541,3 +4541,73 @@ qemuMonitorMigrateRecover(qemuMonitor *mon, =20 return qemuMonitorJSONMigrateRecover(mon, uri); } + +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, + ...) +{ + g_autoptr(qemuMonitorQueryStatsProvider) provider =3D NULL; + qemuMonitorQueryStatsNameType stat; + va_list name_list; + size_t sentinel =3D QEMU_MONITOR_QUERY_STATS_NAME_LAST; + + provider =3D g_new0(qemuMonitorQueryStatsProvider, 1); + provider->provider =3D provider_type; + provider->names =3D NULL; + + va_start(name_list, provider_type); + stat =3D va_arg(name_list, qemuMonitorQueryStatsNameType); + + if (stat !=3D sentinel) { + provider->names =3D virBitmapNew(QEMU_MONITOR_QUERY_STATS_NAME_LAS= T); + + while (stat !=3D sentinel) { + if (virBitmapSetBit(provider->names, stat) < 0) + return NULL; + stat =3D va_arg(name_list, qemuMonitorQueryStatsNameType); + } + } + va_end(name_list); + + return g_steal_pointer(&provider); +} + +GPtrArray * +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); +} diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 95267ec6..344636e1 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1554,3 +1554,48 @@ qemuMonitorChangeMemoryRequestedSize(qemuMonitor *mo= n, int qemuMonitorMigrateRecover(qemuMonitor *mon, const char *uri); + +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 provider; + virBitmap *names; +}; + +void +qemuMonitorQueryStatsProviderFree(qemuMonitorQueryStatsProvider *provider); + +qemuMonitorQueryStatsProvider * +qemuMonitorQueryStatsProviderNew(qemuMonitorQueryStatsProviderType provide= r_type, + ...); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuMonitorQueryStatsProvider, + qemuMonitorQueryStatsProviderFree); + +GPtrArray * +qemuMonitorQueryStats(qemuMonitor *mon, + qemuMonitorQueryStatsTargetType target, + char **vcpus, + GPtrArray *providers); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 80696de7..4e228bfb 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -9031,3 +9031,133 @@ qemuMonitorJSONMigrateRecover(qemuMonitor *mon, =20 return qemuMonitorJSONCheckError(cmd, reply); } + +static GPtrArray * +qemuMonitorJSONExtractQueryStats(virJSONValue *arr) +{ + g_autoptr(GPtrArray) queried_stats =3D NULL; + size_t nstats =3D virJSONValueArraySize(arr); + size_t i; + + /* Create a GPtrArray for GHashTables */ + queried_stats =3D g_ptr_array_new_full(nstats, (GDestroyNotify) g_hash= _table_destroy); + + for (i =3D 0; i < nstats; i++) { + virJSONValue *obj =3D virJSONValueArrayGet(arr, i); + virJSONValue *stats =3D virJSONValueObjectGetArray(obj, "stats"); + size_t j; + + /* Create a GHashTable for virJSONValues */ + GHashTable *hash_table =3D virHashNew((GDestroyNotify) virJSONValu= eFree); + + for (j =3D 0; j < virJSONValueArraySize(stats); j++) { + virJSONValue *stat =3D virJSONValueArrayGet(stats, j); + + g_hash_table_insert(hash_table, + g_strdup(virJSONValueObjectGetString(stat,= "name")), + virJSONValueObjectGet(stat, "value")); + } + + g_ptr_array_add(queried_stats, hash_table); + } + + return g_steal_pointer(&queried_stats); +} + + +/** + * 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 a GPtrArray of GHashTables containing the statistics on success= or + * NULL on failure. + */ + +GPtrArray * +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; + virJSONValue *rv =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->provider); + virBitmap *names =3D provider->names; + int rc; + + rc =3D virJSONValueObjectAppendString(provider_obj, "provider"= , type_str); + + if (rc < 0) + return NULL; + + if (names) { + g_autoptr(virJSONValue) provider_names =3D virJSONValueNew= Array(); + int curBit =3D virBitmapNextSetBit(names, -1); + + while (curBit >=3D 0) { + const char *name =3D qemuMonitorQueryStatsNameTypeToSt= ring(curBit); + + if (virJSONValueArrayAppendString(provider_names, name= ) < 0) + return NULL; + + curBit =3D virBitmapNextSetBit(names, curBit); + } + + 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 (qemuMonitorJSONCheckError(cmd, reply) < 0) + return NULL; + + rv =3D virJSONValueObjectStealArray(reply, "return"); + + return qemuMonitorJSONExtractQueryStats(rv); +} diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index ad3853ae..db8dec80 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -878,3 +878,9 @@ qemuMonitorJSONChangeMemoryRequestedSize(qemuMonitor *m= on, int qemuMonitorJSONMigrateRecover(qemuMonitor *mon, const char *uri); + +GPtrArray * +qemuMonitorJSONQueryStats(qemuMonitor *mon, + qemuMonitorQueryStatsTargetType target, + char **vcpus, + GPtrArray *providers); --=20 2.36.1 From nobody Wed May 15 11:19:56 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=1657777978; cv=none; d=zohomail.com; s=zohoarc; b=eUl4+rZ2r7Vb/wfMUwzRcziXIpI3UzdWY39uG/jGXhFhMRfU/aj4XSj6dwavLp6XiBGG3FYa+4u8QENjbFYMfVqlnXl3GoAZPve7lPXpGUoR99U9PWIaIMnZLRnMkorI+3KdBEVtn0AFj39QIhWXBYdw15oOJhibO2qxZLqXfm4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1657777978; 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=nUbmW6s86zHdwvw1mkplNwLUCMSvqIO+ERoKX2aPr84=; b=Gaezs83aPxPSuuzY+jcefr4lzsDsX3OXcuyY6Owl80a9lZJ3jxRT+gzNm8Vgjz8ZpOBt6OS2VnXFDs4X4bbwCbwIeCrQECAoLmPAkJVmP8Sixiynf4M+CJyo+3Wh/R9ahFGGm9wtI5mjrwZ/9P5rdnJ7l+qiR1tK1uogl0UMGkg= 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 1657777977997182.35826971951974; Wed, 13 Jul 2022 22:52:57 -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-513-5D2LQLJWPTmC1o6l8g6rLQ-1; Thu, 14 Jul 2022 01:52:55 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id D1492185A7A4; Thu, 14 Jul 2022 05:52:52 +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 BAC9A2026D64; Thu, 14 Jul 2022 05:52:52 +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 6A7501947073; Thu, 14 Jul 2022 05:52:52 +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 67A421947073 for ; Thu, 14 Jul 2022 05:52:51 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 34A7C2026D07; Thu, 14 Jul 2022 05:52:51 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast10.extmail.prod.ext.rdu2.redhat.com [10.11.55.26]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 309B42026D64 for ; Thu, 14 Jul 2022 05:52:51 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-2.mimecast.com [205.139.110.61]) (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 15A881C05AAD for ; Thu, 14 Jul 2022 05:52:51 +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.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-656--WhpXx9wO6WhrGkuaJXuSQ-1; Thu, 14 Jul 2022 01:52:48 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1657777977; 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=nUbmW6s86zHdwvw1mkplNwLUCMSvqIO+ERoKX2aPr84=; b=XFVlWjELifK5W2tG4peeb5+duXN+zpJHf2Tb7SxWXCrFhFWmZj5AIiO1CGFmClQyvYTdHy KAaUmN+b/ekF/Kznhh7NdWLPXeC7EFlAJf3JnR8DoEQgrlaAzbHQz1h2L5zAsWgwjWg44I FcX+y9E6z0pM6Edl+4sRZBkUnCiKFmQ= X-MC-Unique: 5D2LQLJWPTmC1o6l8g6rLQ-1 X-Original-To: libvir-list@listman.corp.redhat.com X-MC-Unique: -WhpXx9wO6WhrGkuaJXuSQ-1 From: Amneesh Singh To: libvir-list@redhat.com Subject: [PATCH 2/3] qemu_capabilities: add "query-stats" QMP command to the QEMU capabilities Date: Thu, 14 Jul 2022 11:22:03 +0530 Message-Id: <20220714055204.1277661-3-natto@weirdnatto.in> In-Reply-To: <20220714055204.1277661-1-natto@weirdnatto.in> References: <20220714055204.1277661-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, pkrempa@redhat.com, Amneesh Singh Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com 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: 1657777979236100001 Content-Type: text/plain; charset="utf-8"; x-default="true" Related: https://gitlab.com/libvirt/libvirt/-/issues/276 This patch adds "query-stats" to the QEMU capabilities. Signed-off-by: Amneesh Singh --- src/qemu/qemu_capabilities.c | 2 ++ src/qemu/qemu_capabilities.h | 1 + 2 files changed, 3 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index fa8ffd19..9835dc82 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -672,6 +672,7 @@ VIR_ENUM_IMPL(virQEMUCaps, "display-dbus", /* QEMU_CAPS_DISPLAY_DBUS */ "iothread.thread-pool-max", /* QEMU_CAPS_IOTHREAD_THREAD_POO= L_MAX */ "usb-host.guest-resets-all", /* QEMU_CAPS_USB_HOST_GUESTS_RE= SETS_ALL */ + "query-stats", /* QEMU_CAPS_QUERY_STATS */ ); =20 =20 @@ -1226,6 +1227,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 a409c127..62b28288 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -651,6 +651,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for = syntax-check */ QEMU_CAPS_DISPLAY_DBUS, /* -display dbus */ QEMU_CAPS_IOTHREAD_THREAD_POOL_MAX, /* -object iothread.thread-pool-ma= x */ QEMU_CAPS_USB_HOST_GUESTS_RESETS_ALL, /* -device usb-host.guest-resets= -all */ + QEMU_CAPS_QUERY_STATS, /* accepts query-stats */ =20 QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; --=20 2.36.1 From nobody Wed May 15 11:19:56 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=1657777980; cv=none; d=zohomail.com; s=zohoarc; b=Os4bQLuCghax6zqfbN44Mo5AN0G/PcoQYM+Kp+pAcAlmJ1LcE191zW+WnmlhvOEnl7NGwVEfmm33Ae3iHLLJLctiBc6Nhikm5KPfOqYLOpnjUYLTeaoAqQ61/h69NTeyWKYG14mRfI9xnl/vE+sFcuX9MnO1+B1qrqHcYemINT8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1657777980; 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=UCUZ/jkoAdxCYaU6LSx4rRJ6RQrAgQgtC+JgpXn51M4=; b=gdVQeb7bo6RAWwpLqU4WvHqwwVDaKfGQTn0pGyWqVHLPIh6mC0kodFmTgLzIpWcEMn4hgdd9cYoaAIBd8xOR/OdPd9vAsVQMT3rs7zbZ3bE9Bmtlz74gva5J7rUfR381vA+HhuHBNmWB6cStcECY7QqLB7wPk1vlk/Do9LH7ing= 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 1657777980635889.3767434704811; Wed, 13 Jul 2022 22:53:00 -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-593-B7PxFYvwORCW69LPdx-cew-1; Thu, 14 Jul 2022 01:52:58 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 28E541C05AAD; Thu, 14 Jul 2022 05:52:56 +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 150FE18EBB; Thu, 14 Jul 2022 05:52:56 +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 CE6CF1947071; Thu, 14 Jul 2022 05:52:55 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 1805C1947071 for ; Thu, 14 Jul 2022 05:52:55 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id EA1152166B2A; Thu, 14 Jul 2022 05:52:54 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast05.extmail.prod.ext.rdu2.redhat.com [10.11.55.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E68992166B26 for ; Thu, 14 Jul 2022 05:52:54 +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 CAE918032EE for ; Thu, 14 Jul 2022 05:52:54 +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.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-313-2wGTA7_-OGiufkj0pm77Rw-1; Thu, 14 Jul 2022 01:52:48 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1657777979; 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=UCUZ/jkoAdxCYaU6LSx4rRJ6RQrAgQgtC+JgpXn51M4=; b=OIGuhSpyF6fDsMkoQ5u55ItolQDJ5qgllq+eOal9WKtL2NepK1g4Vn0zl8W//PFjHPLodn 2X0ELmXyREe8X15Z4hR9jIesYGjK5Q4cArtyGWdI5u8LXYt/fk6y9XanUuF6ZjONUuKhda jFvNxWn8l5HN6C5KnvkAGpkixohZpnA= X-MC-Unique: B7PxFYvwORCW69LPdx-cew-1 X-Original-To: libvir-list@listman.corp.redhat.com X-MC-Unique: 2wGTA7_-OGiufkj0pm77Rw-1 From: Amneesh Singh To: libvir-list@redhat.com Subject: [PATCH 3/3] qemu_driver: use qemuMonitorQueryStats to extract halt poll time Date: Thu, 14 Jul 2022 11:22:04 +0530 Message-Id: <20220714055204.1277661-4-natto@weirdnatto.in> In-Reply-To: <20220714055204.1277661-1-natto@weirdnatto.in> References: <20220714055204.1277661-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.6 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, pkrempa@redhat.com, Amneesh Singh Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com 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: 1657777981272100003 Content-Type: text/plain; charset="utf-8"; x-default="true" Related: https://gitlab.com/libvirt/libvirt/-/issues/276 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 --- src/qemu/qemu_driver.c | 69 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 61 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index da95f947..e1c595e5 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -18066,15 +18066,68 @@ qemuDomainGetStatsCpuCgroup(virDomainObj *dom, } =20 static int -qemuDomainGetStatsCpuHaltPollTime(virDomainObj *dom, - virTypedParamList *params) +qemuDomainGetStatsCpuHaltPollTime(virQEMUDriver *driver, + virDomainObj *dom, + virTypedParamList *params, + unsigned int privflags) { unsigned long long haltPollSuccess =3D 0; unsigned long long haltPollFail =3D 0; - pid_t pid =3D dom->pid; + qemuDomainObjPrivate *priv =3D dom->privateData; + bool queryStatsCap =3D virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_QUERY_= STATS); =20 - if (virHostCPUGetHaltPollTime(pid, &haltPollSuccess, &haltPollFail) < = 0) - return 0; + if (queryStatsCap && HAVE_JOB(privflags) && virDomainObjIsActive(dom))= { + size_t i; + qemuMonitorQueryStatsTargetType target =3D QEMU_MONITOR_QUERY_STAT= S_TARGET_VCPU; + qemuMonitorQueryStatsProvider *provider =3D NULL; + g_autoptr(GPtrArray) providers =3D NULL; + g_autoptr(GPtrArray) queried_stats =3D NULL; + 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) qemuMonitor= QueryStatsProviderFree); + g_ptr_array_add(providers, provider); + + qemuDomainObjEnterMonitor(driver, dom); + queried_stats =3D qemuMonitorQueryStats(priv->mon, target, NULL, p= roviders); + qemuDomainObjExitMonitor(dom); + + if (!queried_stats) + return 0; + + for (i =3D 0; i < queried_stats->len; i++) { + unsigned long long curHaltPollSuccess, curHaltPollFail; + GHashTable *cur_table =3D queried_stats->pdata[i]; + virJSONValue *success_obj, *fail_obj; + const char *success_str =3D qemuMonitorQueryStatsNameTypeToStr= ing( + QEMU_MONITOR_QUERY_STATS_NAME_HALT_POLL_SUCCESS_NS); + const char *fail_str =3D qemuMonitorQueryStatsNameTypeToString( + QEMU_MONITOR_QUERY_STATS_NAME_HALT_POLL_FAIL_NS); + + 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 0; + + if (virJSONValueGetNumberUlong(success_obj, &curHaltPollSucces= s) < 0) + return 0; + + if (virJSONValueGetNumberUlong(fail_obj, &curHaltPollFail) < 0) + return 0; + + haltPollSuccess +=3D curHaltPollSuccess; + haltPollFail +=3D curHaltPollFail; + } + } else { + pid_t pid =3D dom->pid; + + if (virHostCPUGetHaltPollTime(pid, &haltPollSuccess, &haltPollFail= ) < 0) + return 0; + } =20 if (virTypedParamListAddULLong(params, haltPollSuccess, "cpu.haltpoll.= success.time") < 0 || virTypedParamListAddULLong(params, haltPollFail, "cpu.haltpoll.fai= l.time") < 0) @@ -18087,7 +18140,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; @@ -18095,7 +18148,7 @@ qemuDomainGetStatsCpu(virQEMUDriver *driver, if (qemuDomainGetStatsCpuCache(driver, dom, params) < 0) return -1; =20 - if (qemuDomainGetStatsCpuHaltPollTime(dom, params) < 0) + if (qemuDomainGetStatsCpuHaltPollTime(driver, dom, params, privflags) = < 0) return -1; =20 return 0; @@ -18929,7 +18982,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.36.1