From nobody Wed May 15 23:25:14 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=1657063624; cv=none; d=zohomail.com; s=zohoarc; b=cTIbWz39iMbSAJcPfu2/0cRiBpHcSAEMVpjd84G5xn6pG1BPI1WVEPVo55JVJs93vtyOmBfsVbd0xldMzWb+JsgOSFY/FqV73h5EgL/POFk3+cjsO7NkQBb6b/YamogoIaawvXinyg4EwVeszVcLATpC3BZyYAA+jDZS8L89CX0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1657063624; 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=0wCRMFnYxyil7WdjerY8LexZ69M+htgSoyAHQKFc+7A=; b=IwYLy8XxIut2qu5ejSWCkFBajEnXBNfHLQO2WmIDjjy5v/QSH+TYvsw6tjlFen/0+GAnyppvGXmLe+dSdw4LYS9RKkLh67tQeAKIbJ+Vsl4jBSfIN+GpjlU8Q2M5o1Gjw3d+O/IS7RUpZ7v2EKD/obGw7qkVSVyfliHSoRAWOaA= 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 1657063624612873.8081561873619; Tue, 5 Jul 2022 16:27:04 -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-569-SFF4qVFuPDuq4pxgpU-Bew-1; Tue, 05 Jul 2022 19:26:51 -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 47FC41C01B38; Tue, 5 Jul 2022 23:26: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 4D27141617E; Tue, 5 Jul 2022 23:26:47 +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 150E6194705F; Tue, 5 Jul 2022 23:26:47 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 1DFA5194705D for ; Tue, 5 Jul 2022 23:26:46 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 081AC417E5B; Tue, 5 Jul 2022 23:26:46 +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 0447741617E for ; Tue, 5 Jul 2022 23:26:46 +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 DCCC9182A6E1 for ; Tue, 5 Jul 2022 23:26:45 +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-617-Ll2Em8kwM5uhv8KH664jBA-1; Tue, 05 Jul 2022 19:26:41 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1657063622; 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=0wCRMFnYxyil7WdjerY8LexZ69M+htgSoyAHQKFc+7A=; b=CKDfK8SBM4gN1cyRPglLu+yqYRFTfC+KIECWN0064oCfB6uYbUzmjpZ+13bVPgIC7RhTxk KveZljwtcDNcGIYHPTPeaIXd21eb/gmhMQBtuScJph8pj8kYgKV4UGIb8cErK4WwBLLy/d GtpnjA44Tbd3+Sv87gFsZSrqaOqhsdc= X-MC-Unique: SFF4qVFuPDuq4pxgpU-Bew-1 X-Original-To: libvir-list@listman.corp.redhat.com X-MC-Unique: Ll2Em8kwM5uhv8KH664jBA-1 From: Amneesh Singh To: libvir-list@redhat.com Subject: [PATCH RFC v2 1/3] qemu_monitor: add qemuMonitorQueryStats Date: Wed, 6 Jul 2022 04:56:26 +0530 Message-Id: <20220705232628.1779286-2-natto@weirdnatto.in> In-Reply-To: <20220705232628.1779286-1-natto@weirdnatto.in> References: <20220705232628.1779286-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.10 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.85 on 10.11.54.10 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: 1657063624905100003 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 | 106 ++++++++++++++++++++++++++++ src/qemu/qemu_monitor.h | 56 +++++++++++++++ src/qemu/qemu_monitor_json.c | 130 +++++++++++++++++++++++++++++++++++ src/qemu/qemu_monitor_json.h | 6 ++ 4 files changed, 298 insertions(+) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index fda5d2f3..528aed49 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -4541,3 +4541,109 @@ qemuMonitorMigrateRecover(qemuMonitor *mon, =20 return qemuMonitorJSONMigrateRecover(mon, uri); } + +VIR_ENUM_IMPL(qemuMonitorQueryStatsTarget, + QEMU_MONITOR_QUERY_STATS_TARGET_LAST, + "vm", + "vcpu", +); + +VIR_ENUM_IMPL(qemuMonitorQueryStatsVmName, + QEMU_MONITOR_QUERY_STATS_VM_NAME_LAST, +); + +VIR_ENUM_IMPL(qemuMonitorQueryStatsVcpuName, + QEMU_MONITOR_QUERY_STATS_VCPU_NAME_LAST, + "halt_poll_success_ns", + "halt_poll_fail_ns" +); + +VIR_ENUM_IMPL(qemuMonitorQueryStatsProvider, + QEMU_MONITOR_QUERY_STATS_PROVIDER_LAST, + "kvm", +); + +const char * +qemuMonitorQueryStatsNameTypeToString(qemuMonitorQueryStatsTargetType targ= et, + int type) +{ + switch (target) { + case QEMU_MONITOR_QUERY_STATS_TARGET_VM: + return qemuMonitorQueryStatsVmNameTypeToString(type); + case QEMU_MONITOR_QUERY_STATS_TARGET_VCPU: + return qemuMonitorQueryStatsVcpuNameTypeToString(type); + + /* unreachable */ + case QEMU_MONITOR_QUERY_STATS_TARGET_LAST: + ; + } + + return NULL; +} + +void +qemuMonitorQueryStatsProviderFree(qemuMonitorQueryStatsProvider *provider) +{ + virBitmapFree(provider->names); + g_free(provider); +} + +qemuMonitorQueryStatsProvider * +qemuMonitorQueryStatsProviderNew(qemuMonitorQueryStatsTargetType target, + qemuMonitorQueryStatsProviderType provide= r_type, + ...) +{ + g_autoptr(qemuMonitorQueryStatsProvider) provider =3D NULL; + va_list name_list; + int stat; + + 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, int); + + if (stat !=3D -1) { + size_t sz =3D 0; + + switch (target) { + case QEMU_MONITOR_QUERY_STATS_TARGET_VM: + sz =3D QEMU_MONITOR_QUERY_STATS_VM_NAME_LAST; + break; + case QEMU_MONITOR_QUERY_STATS_TARGET_VCPU: + sz =3D QEMU_MONITOR_QUERY_STATS_VCPU_NAME_LAST; + break; + case QEMU_MONITOR_QUERY_STATS_TARGET_LAST: + break; + } + + provider->names =3D virBitmapNew(sz); + + while (stat !=3D -1) { + if (virBitmapSetBit(provider->names, stat) < 0) + return NULL; + stat =3D va_arg(name_list, int); + } + } + + 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..26df9c63 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1554,3 +1554,59 @@ 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_VM_NAME_LAST, +} qemuMonitorQueryStatsVmNameType; + +VIR_ENUM_DECL(qemuMonitorQueryStatsVmName); + +typedef enum { + QEMU_MONITOR_QUERY_STATS_VCPU_NAME_HALT_POLL_SUCCESS_NS, + QEMU_MONITOR_QUERY_STATS_VCPU_NAME_HALT_POLL_FAIL_NS, + QEMU_MONITOR_QUERY_STATS_VCPU_NAME_LAST, +} qemuMonitorQueryStatsVcpuNameType; + +VIR_ENUM_DECL(qemuMonitorQueryStatsVcpuName); + +const char * +qemuMonitorQueryStatsNameTypeToString(qemuMonitorQueryStatsTargetType targ= et, + int type); + +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(qemuMonitorQueryStatsTargetType target, + 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 3aad2ab2..8774b1ff 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -9006,3 +9006,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(target, 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 23:25:14 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=1657063617; cv=none; d=zohomail.com; s=zohoarc; b=cgGh+I3DJEivqOEFy7Bly2/r66aWKgXPuKd6dDjG+GD7S2E/+LdSWrIbhCoR1gvYZsK9EnBVzuCQHGTJsslYWbkrhna8g4kQeSXrcgxVnnF90yBsEAokcxJRH6RYQP3D/dtLnpJyevwx2Wlgs1qqP+1DK/mcXh6AD1G9j/C6DI0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1657063617; 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=NfNc3V1D6iRi9+cyFlvVVXTsUkX9tWeN3htzJrb9UyQ=; b=kNz1G5yt2N5S0kr6F+tTmo+nAsZdLYag7fPqnzIzFQAF44UUqwZJlfGAQbS0H8NaovEk80LKuXck9JL6lFOkVWZQ6WleNHqVag2jJVnr1RKnpuru5NWP/V8pSDP6dK5x8lzF6ZbEjdG2gb/ZE2mNCyalwn4tDwe8G5fQrIluYYY= 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 1657063617219266.0427114320869; Tue, 5 Jul 2022 16:26:57 -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-134-Fs0ut3q8MXy5k15GKXdO-w-1; Tue, 05 Jul 2022 19:26:52 -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 5C09B3C0F39B; Tue, 5 Jul 2022 23:26:50 +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 44BC6112131E; Tue, 5 Jul 2022 23:26:50 +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 822C81947061; Tue, 5 Jul 2022 23:26:49 +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 DC76E1947071 for ; Tue, 5 Jul 2022 23:26:47 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id BF44540466A4; Tue, 5 Jul 2022 23:26:47 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast09.extmail.prod.ext.rdu2.redhat.com [10.11.55.25]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BBC78400EA84 for ; Tue, 5 Jul 2022 23:26:47 +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 A4694294EDCD for ; Tue, 5 Jul 2022 23:26:47 +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-625-nrGM-ARTOrCn3lUzgWK8PQ-1; Tue, 05 Jul 2022 19:26:41 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1657063615; 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=NfNc3V1D6iRi9+cyFlvVVXTsUkX9tWeN3htzJrb9UyQ=; b=MU/ggvZOriFpLtiqAio0drsx5X7J4sMmEkBwtebTnTUKbEOJJeEleiJKEI0Y+kmKvBkM4j 2peFfJ0SsSsJhPZQE3Gks77Q/QmUzuqmRf97u3RzxHhFnTtr55K9iSfXTT+aKHkjohOnt/ dOp9xvV/PtA5SKqNDunMxpHKDPGGf8U= X-MC-Unique: Fs0ut3q8MXy5k15GKXdO-w-1 X-Original-To: libvir-list@listman.corp.redhat.com X-MC-Unique: nrGM-ARTOrCn3lUzgWK8PQ-1 From: Amneesh Singh To: libvir-list@redhat.com Subject: [PATCH RFC v2 2/3] qemu_capabilities: add "query-stats" QMP command to the QEMU capabilities Date: Wed, 6 Jul 2022 04:56:27 +0530 Message-Id: <20220705232628.1779286-3-natto@weirdnatto.in> In-Reply-To: <20220705232628.1779286-1-natto@weirdnatto.in> References: <20220705232628.1779286-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, 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: 1657063619152100001 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 Reviewed-by: Martin Kletzander --- 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 2c3be3ec..81fc597a 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -671,6 +671,7 @@ VIR_ENUM_IMPL(virQEMUCaps, "chardev.qemu-vdagent", /* QEMU_CAPS_CHARDEV_QEMU_VDAGENT */ "display-dbus", /* QEMU_CAPS_DISPLAY_DBUS */ "iothread.thread-pool-max", /* QEMU_CAPS_IOTHREAD_THREAD_POO= L_MAX */ + "query-stats", /* QEMU_CAPS_QUERY_STATS */ ); =20 =20 @@ -1225,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 6f35ba14..29e55b3a 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -650,6 +650,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for = syntax-check */ QEMU_CAPS_CHARDEV_QEMU_VDAGENT, /* -chardev qemu-vdagent */ QEMU_CAPS_DISPLAY_DBUS, /* -display dbus */ QEMU_CAPS_IOTHREAD_THREAD_POOL_MAX, /* -object iothread.thread-pool-ma= x */ + 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 23:25:14 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=1657063804; cv=none; d=zohomail.com; s=zohoarc; b=DSVmLbH30kikPf1Lzv3JdUrXvYRevINjvIk9gVWpN+hr1URCyGfDzahtbnys5QFoQBekr/wfgQLtWqI1Kajvuo32lLknOzu/J9ekt7iPy98nWID3fkMdMpvIyE/SyMSr/U/MpLp5R7H/8FD/MtQXNDOeAt947J9aglgi6TVmjgw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1657063804; 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=xCwSesglhI/p1BE9HD33LQwSF1u9u0Zfdn1MXEG6JUU=; b=b5Cd2WQXk1A/PfowXBIfbyYf3/QX0lRmCXrzQJKZpymIxMxs2p6k433kHpwaduJYNS8ijsQsS8z9qsjHF3q0vm6CrlMgeP5IByBMwTmqIn++GGNWMmnTcJIEnQE7QHCdhMl87R0MsTJlFr0PPWgbYId55fphJaZkxheOq4ImbIs= 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 1657063804134293.9600101692796; Tue, 5 Jul 2022 16:30:04 -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-581-K0qBKS0YP0S_rNCZ_dHWqA-1; Tue, 05 Jul 2022 19:26:51 -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 84195802E5C; Tue, 5 Jul 2022 23:26: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 6A45018EC8; Tue, 5 Jul 2022 23:26: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 2C4BE194707E; Tue, 5 Jul 2022 23:26:48 +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 E0892194705D for ; Tue, 5 Jul 2022 23:26:46 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id D333A400EA84; Tue, 5 Jul 2022 23:26:46 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast02.extmail.prod.ext.rdu2.redhat.com [10.11.55.18]) by smtp.corp.redhat.com (Postfix) with ESMTPS id CDA904047842 for ; Tue, 5 Jul 2022 23:26:46 +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 B5C26804196 for ; Tue, 5 Jul 2022 23:26:46 +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-107-0E52vMBkOjqJivWuydJsYA-1; Tue, 05 Jul 2022 19:26:42 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1657063802; 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=xCwSesglhI/p1BE9HD33LQwSF1u9u0Zfdn1MXEG6JUU=; b=Bp0/E58BnYbP0LPQig8u/kRZjzc2+aVLLSZxD2eL9eJUWqJiplAyLHZYAduGOdqxxbAtl9 hOtAQ1BhySzUdpcXxktlDnxhFa+zbAxhZwFinjfyU04KI3rlZtshvjlmZPN4tnM1LS9qNw VZQRlxogC8eEZI9qmRQaJCS+vaQ/vU4= X-MC-Unique: K0qBKS0YP0S_rNCZ_dHWqA-1 X-Original-To: libvir-list@listman.corp.redhat.com X-MC-Unique: 0E52vMBkOjqJivWuydJsYA-1 From: Amneesh Singh To: libvir-list@redhat.com Subject: [PATCH RFC v2 3/3] qemu_driver: use qemuMonitorQueryStats to extract halt poll time Date: Wed, 6 Jul 2022 04:56:28 +0530 Message-Id: <20220705232628.1779286-4-natto@weirdnatto.in> In-Reply-To: <20220705232628.1779286-1-natto@weirdnatto.in> References: <20220705232628.1779286-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, 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: 1657063806036100001 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 | 70 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 62 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 97c6ed95..30170d5c 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -18052,15 +18052,69 @@ 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) = && driver->privileged) { + 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( + target, + QEMU_MONITOR_QUERY_STATS_PROVIDER_KVM, + QEMU_MONITOR_QUERY_STATS_VCPU_NAME_HALT_POLL_SUCCESS_NS, + QEMU_MONITOR_QUERY_STATS_VCPU_NAME_HALT_POLL_FAIL_NS, + -1); + + if (!provider) + return 0; + + 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 qemuMonitorQueryStatsVcpuNameTypeT= oString( + QEMU_MONITOR_QUERY_STATS_VCPU_NAME_HALT_POLL_SUCCESS_NS); + const char *fail_str =3D qemuMonitorQueryStatsVcpuNameTypeToSt= ring( + QEMU_MONITOR_QUERY_STATS_VCPU_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; + + ignore_value(virJSONValueGetNumberUlong(success_obj, &curHaltP= ollSuccess)); + ignore_value(virJSONValueGetNumberUlong(fail_obj, &curHaltPoll= Fail)); + + 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) @@ -18073,7 +18127,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; @@ -18081,7 +18135,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; @@ -18915,7 +18969,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