From nobody Mon Sep 14 04:49:16 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1788365819; cv=none; d=zohomail.com; s=zohoarc; b=MZXrEH0tShDezfzafBv6ULWUlaPwHaZth7oYt3z6/9M3Pb96qSFgZAqudRNQkxNJac8sK3frdkTb+OiGTsVcTqhJ4KLYzTOsdstbn0qbIjGuoobajzKTbrzcC5Z6aiZWWEzsMoBqtc4BPuNLrB3fRWzwpE17Oafst9MZHb5C6/4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1788365819; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=RppUdSR+ZYJuq+Vw7T6nhijSujC5Ahs1iIqoDZc4WHA=; b=m3mjqWRkjvakRRV/HUMjv6ZjS4KfuOGj45wSP23efcpJRn4doH81Jl3vL588Kk7+36s5h2NTRz8Khyj8dms5JG2Tv1PQpPa7xrwJ/OvJQzIRXfVWEPk/mVlmwTY7TQq+K2Haza4J6FtWvWgTRSBHOt6jB2pDzfa366TDzUEhGCI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1788365818684268.0173928708374; Wed, 2 Sep 2026 09:16:58 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 7326E417E8; Wed, 2 Sep 2026 12:16:57 -0400 (EDT) Received: from [172.19.199.13] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 8AA2941937 for ; Wed, 2 Sep 2026 12:13:48 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 20B5B3F322; Wed, 2 Sep 2026 10:17:22 -0400 (EDT) Received: from mail-wm1-x336.google.com (mail-wm1-x336.google.com [IPv6:2a00:1450:4864:20::336]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 8B2B93F863 for ; Wed, 2 Sep 2026 10:17:20 -0400 (EDT) Received: by mail-wm1-x336.google.com with SMTP id 5b1f17b1804b1-4980fe6b3beso17891765e9.0 for ; Wed, 02 Sep 2026 07:17:20 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:7977:547c:b807:b46a]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49ce478daf6sm127903915e9.15.2026.09.02.07.17.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 02 Sep 2026 07:17:18 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1788358639; x=1788963439; darn=lists.libvirt.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=RppUdSR+ZYJuq+Vw7T6nhijSujC5Ahs1iIqoDZc4WHA=; b=VyeiajvlaZYcULEkCEN2l8U+hrqxkWoJCBhDdl8FDLivkhcRZV9PXSnLmztEqdL+UH kwLAXAOstddgea6WzKeUHJ/6kg7HuFONuyOpRGf4v2sA9ovadGFS8d01Noud6b2UBvku 1a1QdJzCbwB7RXwRb+EYbDFRzaQzhUWjjXOuyBE3F/jnOJ0FRKNW5m8Bt162G6gy9gQo O+DEDwsRJ/jnUK84fmjwKo8QCw/4AYbwIBKqqmB3OyzNHAsgtCl6id5on6nl1RdqInf5 jmX2AhSNoH6PBEOlyrnyk4Lc7jMPlGNdj6HfF6zyzXXsa3JTd/53nMHCrJhUXZUnxHVS MUJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788358639; x=1788963439; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=RppUdSR+ZYJuq+Vw7T6nhijSujC5Ahs1iIqoDZc4WHA=; b=HMMjNmdmXOOeBstDSbOXOYuzTVRmkeSoTy9/WiiwFMMBbvxHfIUSLHfCrvIdQ2A2i4 ARkQ4et90RDB/PdLlX11LgWoFEwgLZY15mJvZzNhL3GpSkMy7mejKsxb3YYC5EytAWvj Dz8ET38vOAQkz7jXF2uCcj84dxJCO6y961vkqEGu5oP8DOWfFuZpHwgFLJ/aHthD90+w Kl1RhRxP5X0HKXRiof3vRfzAXcmnpykaJkzyclv9rQ519FmHOHuBTOyEZMgmkXP/3XcN ck1u5lgMUvDBwKY21sPzVh/wMz/5zMTIwu+kcJ3pr+GKD6kGolbrrFb9QZliTDCU7t96 eFNQ== X-Gm-Message-State: AFuF++kXZ9x7+03JPJqOkV/C7bstjq991r1gxR9Lyn/MfaQ+SwUE246r v6WWjxeAIwLuiavq0G80pLxltoXkUYR+3jauQ2yjVNhPK4sYCVK/HxRPL6xe9fHPSScD7bD/Qit X19wP X-Gm-Gg: AR+sD10lup6UV/Yx4O/1CCVgXFUs6854hvvnM6Iqbdcn2O2zZ2UY1FffT2QSf/7JboK HP+OHqg17glR1csE2g8+dun/NjQGkHAFEOmLJ/DpAM4i3aJDuBjtl/LFH+NOoSlbn6jkjp5EMDt Sd7syc8MD+Q3qVbKSbxv9rwk9wqWy1pyfZfp4h0fVHRvDcTrciMrnBoAnrG/TQP7vXAb8hQTNjq aNP8TOEZAws9nusMLn7fM0pbXWnbr+ZVqDIxWwveErhyb+mzAXLt3V9eZNPnRUtLLYa5dllCwv2 o4/8Ae4X0xh5dr75iLjvoea8NPWL1KQEi2lo4K/x7H8lAdXGix873wZpHQZEsJsji6TVTPjYTRk Q8wNWFBA+/aXcy96xg5nHfuKp1JyMvqmEorSh8xhnpzBWtzIWujXSOtJoZFcsh4xun4lFvuTGBA a3Rtfpbe4Q51jBtU0srDvjQ83TSwD4ND2ITjQM6YD2TCvHwv958YY3+ac7Pc0= X-Received: by 2002:a05:600c:1553:b0:493:f783:c46a with SMTP id 5b1f17b1804b1-49ce7c27099mr38158755e9.6.1788358638966; Wed, 02 Sep 2026 07:17:18 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH v3 1/5] qemu: add capability for guest-aware win-dmp availability Date: Wed, 2 Sep 2026 16:17:11 +0200 Message-ID: <20260902141715.746721-2-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260902141715.746721-1-den@openvz.org> References: <20260902141715.746721-1-den@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-MailFrom: den@openvz.org X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation Message-ID-Hash: 46B4IDCS4YFFO6ZXKH5RA42DGWJG7L4I X-Message-ID-Hash: 46B4IDCS4YFFO6ZXKH5RA42DGWJG7L4I X-Mailman-Approved-At: Wed, 02 Sep 2026 16:13:31 +0000 CC: den@openvz.org X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: "Denis V. Lunev via Devel" Reply-To: "Denis V. Lunev" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1788365826738154100 query-dump-guest-memory-capability reported win-dmp on any x86 machine, whether or not the guest had published a Windows dump header. QEMU commit 1c0e259c5a35 tied it to the guest's vmcoreinfo note, but left the change invisible to introspection. QEMU 11.1 marks the win-dmp member of DumpGuestMemoryFormat with an 'allowed-by-guest' feature. Detect it, so a caller picking a dump format can tell whether a reported win-dmp says anything about the guest. Signed-off-by: Denis V. Lunev Reviewed-by: Daniel P. Berrang=C3=A9 --- src/qemu/qemu_capabilities.c | 2 ++ src/qemu/qemu_capabilities.h | 1 + tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_11.1.0_s390x.xml | 1 + tests/qemucapabilitiesdata/caps_11.1.0_x86_64.xml | 1 + tests/qemumonitorjsontest.c | 3 +++ 6 files changed, 9 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 1b526cfb89..bc2b0412dc 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -775,6 +775,7 @@ VIR_ENUM_IMPL(virQEMUCaps, /* 500 */ "arm-smmuv3.cmdqv", /* QEMU_CAPS_ARM_SMMUV3_CMDQV */ "iothread.poll-weight", /* QEMU_CAPS_IOTHREAD_POLL_WEIGHT */ + "win-dmp.guest-aware", /* QEMU_CAPS_WIN_DMP_GUEST_AWARE */ ); =20 =20 @@ -1674,6 +1675,7 @@ static struct virQEMUCapsStringFlags virQEMUCapsQMPSc= hemaQueries[] =3D { { "chardev-add/arg-type/backend/+socket/data/reconnect-ms", QEMU_CAPS_= CHARDEV_RECONNECT_MILISECONDS }, { "chardev-add/arg-type/backend/+qemu-vdagent", QEMU_CAPS_CHARDEV_QEMU= _VDAGENT }, { "device_add/$json-cli-hotplug", QEMU_CAPS_DEVICE_JSON }, + { "dump-guest-memory/arg-type/format/^win-dmp/$allowed-by-guest", QEMU= _CAPS_WIN_DMP_GUEST_AWARE }, { "nbd-server-start/arg-type/tls-creds", QEMU_CAPS_NBD_TLS }, { "netdev_add/arg-type/+stream", QEMU_CAPS_NETDEV_STREAM }, { "netdev_add/arg-type/+stream/reconnect", QEMU_CAPS_NETDEV_STREAM_REC= ONNECT }, diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 495c1eb603..28303fd8f0 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -749,6 +749,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for = syntax-check */ /* 500 */ QEMU_CAPS_ARM_SMMUV3_CMDQV, /* arm-smmuv3.cmdqv */ QEMU_CAPS_IOTHREAD_POLL_WEIGHT, /* -object iothread.poll-weight */ + QEMU_CAPS_WIN_DMP_GUEST_AWARE, /* 'win-dmp' is offered only to a guest= that can use it */ =20 QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml b/tests/qem= ucapabilitiesdata/caps_11.1.0_aarch64.xml index 1b868c05ab..31d4d2fd26 100644 --- a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml @@ -193,6 +193,7 @@ + 11001000 61700287 v11.1.0 diff --git a/tests/qemucapabilitiesdata/caps_11.1.0_s390x.xml b/tests/qemuc= apabilitiesdata/caps_11.1.0_s390x.xml index 1c2329999b..aae4dd0b80 100644 --- a/tests/qemucapabilitiesdata/caps_11.1.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_11.1.0_s390x.xml @@ -148,6 +148,7 @@ + 11001000 39100287 v11.1.0 diff --git a/tests/qemucapabilitiesdata/caps_11.1.0_x86_64.xml b/tests/qemu= capabilitiesdata/caps_11.1.0_x86_64.xml index 179b043a9c..05e6749a17 100644 --- a/tests/qemucapabilitiesdata/caps_11.1.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_11.1.0_x86_64.xml @@ -223,6 +223,7 @@ + 11001000 43100287 v11.1.0 diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index f59b97c1c3..70f03afb81 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -3116,6 +3116,8 @@ mymain(void) DO_TEST_QAPI_QUERY("variant", "blockdev-add/arg-type/+file", 1, true); DO_TEST_QAPI_QUERY("variant property", "blockdev-add/arg-type/+file/fi= lename", 1, true); DO_TEST_QAPI_QUERY("enum value", "query-status/ret-type/status/^debug"= , 1, false); + DO_TEST_QAPI_QUERY("enum value feature", "query-migrate-capabilities/r= et-type/capability/^x-colo/$unstable", 1, false); + DO_TEST_QAPI_QUERY("enum value in command arguments", "dump-guest-memo= ry/arg-type/format/^win-dmp", 1, false); DO_TEST_QAPI_QUERY("builtin type", "query-qmp-schema/ret-type/name/!st= ring", 1, false); DO_TEST_QAPI_QUERY("alternate variant 1", "blockdev-add/arg-type/+qcow= 2/backing/!null", 1, false); DO_TEST_QAPI_QUERY("alternate variant 2", "blockdev-add/arg-type/+qcow= 2/backing/!string", 1, false); @@ -3125,6 +3127,7 @@ mymain(void) DO_TEST_QAPI_QUERY("nonexistent attr", "screendump/arg-type/nonexisten= t", 0, false); DO_TEST_QAPI_QUERY("nonexistent variant", "blockdev-add/arg-type/+none= xistent", 0, false); DO_TEST_QAPI_QUERY("nonexistent enum value", "query-status/ret-type/st= atus/^nonexistentdebug", 0, false); + DO_TEST_QAPI_QUERY("nonexistent enum value feature", "query-migrate-ca= pabilities/ret-type/capability/^x-colo/$nonexistentfeature", 0, false); DO_TEST_QAPI_QUERY("broken query for enum value", "query-status/ret-ty= pe/status/^debug/test", -1, false); DO_TEST_QAPI_QUERY("builtin type", "query-qmp-schema/ret-type/name/!nu= mber", 0, false); =20 --=20 2.53.0 From nobody Mon Sep 14 04:49:16 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1788365936; cv=none; d=zohomail.com; s=zohoarc; b=Xqnb6SDET/JmOm9TNp8Ajy3IBRGjCJS2lclH5FtpitDQyT73fTR/zAEHS9N7VJ+Q6LQoipuJ2/1/pSPjVszzar4en5nm2im/PfFUjzpkABJjFGjCCMSwy+ioGN2FcYGjolHvW80jWtIsTiNPZTe2XwOAJVPIN3Kcdy4WTzYkMqM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1788365936; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=iyV+E7x9kjTYiWmLSGhPve81RGKwasEmJernfsrCFyI=; b=XMS6H26mAOgZaxBQhIxx/8jQRPIwhrxcK+PaHQbruggHVFxqiD+gaa3TBpKYWTxQHv7DxJUjgurm1aNPkjQvQiwicd3k28xI9xORZhJhgnupgXJnmLdeOEVuOgxmkyfhycp6itG0I1DPiA3g8gN6YlJOeZv4CLhUcOoTBcTBlcI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1788365936314945.0218342766922; Wed, 2 Sep 2026 09:18:56 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id EB80C3F896; Wed, 2 Sep 2026 12:18:54 -0400 (EDT) Received: from [172.19.199.13] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 9961941A29 for ; Wed, 2 Sep 2026 12:13:55 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id D88E63F324; Wed, 2 Sep 2026 10:17:22 -0400 (EDT) Received: from mail-wm1-x334.google.com (mail-wm1-x334.google.com [IPv6:2a00:1450:4864:20::334]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id BE8F43F862 for ; Wed, 2 Sep 2026 10:17:21 -0400 (EDT) Received: by mail-wm1-x334.google.com with SMTP id 5b1f17b1804b1-49b8687630fso8743765e9.3 for ; Wed, 02 Sep 2026 07:17:21 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:7977:547c:b807:b46a]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49ce478daf6sm127903915e9.15.2026.09.02.07.17.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 02 Sep 2026 07:17:19 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1788358640; x=1788963440; darn=lists.libvirt.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=iyV+E7x9kjTYiWmLSGhPve81RGKwasEmJernfsrCFyI=; b=OzljRFLcncRt8Dvolafk/O37I4DrsieomR82tfzrDWFd0Y0LZXa1nu3I44xEAdSWTL hcqRcmTJ/7zzfjGZ7CuTf08OEFewB3o/+eSduhn/qP2dXdkGM1E3SIZ/3oVsf+nMKS2W wV3n7cpwcgRhQ3l2vZtzuQMPHqCupOXqXlYWjpwaOanmi/rP8B2LCfaCvJvDNkDe0LEv w11f8hWqClvS+c7ygbnAF2xyTpW013lGKbV9GNPj5BZwrHynzFJe3er9QORIBatDamXd XYdLgv46613tgrXF8AqkCncAofCdVR0TCD7D885+SO2YZbRwneWRMQfb62bnSqDn9RP8 40kg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788358640; x=1788963440; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=iyV+E7x9kjTYiWmLSGhPve81RGKwasEmJernfsrCFyI=; b=XNKjo9oYKGcSOxzYhF65rRWY8OO8rsZLCYnus5J1uFBTPXPbGtnZgihKTetia3/QvV 0fMenOKACVarJuqgXx89C9Yy16yMLgDWgqx4bn+7khuZ5Szx1j6zmcBP81syNkIfoivv Gr7C1goRELKuZMyC0m24nc+htyQpL2+/LUoH8MA+GDl3tg8u6GHhTFtBW00U29oUMkRC 94Y8M6+y+4JDCvpJBkv1kCA5W37K1C5GL9W1Au74AKQtmE28Ab/XOF2g9TfNLuMVkWEU a7nJlL1Z3vx9copKaMIUZ0pRp5FbeDmotRe3VayY9kv1XopOgpK5w59CyxYTuQBNhHDA ki+w== X-Gm-Message-State: AFuF++n1Ssnxqh6w+yNYKGwjArFWdprJqBTnhJu/KCpbTmJWUFks4PfM EZViEUY3LZDjCIC7b4meIi5eIWd++U/fqSnexoLkLJa4462LhjDaQjBJlGQkxb4Xehj0mJ4tleG S+P7X X-Gm-Gg: AR+sD113n52T9LtCRBWG+DPzryzv8yHujeap4soFiQlPiP+aOSxvduPPYRE6BuKXLtF gSkwLeX0zMSNubWlsMBlcMhjG0KIUrFHaLcp059kut+xvmuMEl+tB6l7v6oEiNaarXhKk4dQjTi 525tFyTTesrw8g8nrcf9Sd0zZ/LqehVk1gIwwV7hyHEa3xoMw4gHxnyt05gkAnzR2s3r0zONJbq fFhg+7tk4ufwydnNm4I0wN7WGmIR1K8jI8PbcnqBqR2at7KKcE0ZYdyfMpylFNxd6IsC4FMoDcV wY2HD57FF6fek22gqPb9ltGPu4bDpiFDd228cDhrGE/bKXrUsS7sTIjI0jpxYZ0Be8/TADZzNBl XJ9onql1TfvvsCy1FdEPowPq4pYQzSRYoI0jH+eiHXPa2hM2ymdJw1bRhPIDVIAtvCdhPTqZpL4 Dwk53gKTYOX1j7MVaMH6T4Xy66xAwVoW4YtUwwKofnxvQsib7/aHtaYdahEg== X-Received: by 2002:a05:600c:8b05:b0:499:b65d:124f with SMTP id 5b1f17b1804b1-49ce5823d9dmr114665885e9.11.1788358640404; Wed, 02 Sep 2026 07:17:20 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH v3 2/5] qemu: auto-select win-dmp for crash- and watchdog-triggered dumps Date: Wed, 2 Sep 2026 16:17:12 +0200 Message-ID: <20260902141715.746721-3-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260902141715.746721-1-den@openvz.org> References: <20260902141715.746721-1-den@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-MailFrom: den@openvz.org X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation Message-ID-Hash: JNJPYXJGSSCIN63CGDV2EL6UMHMQNHVM X-Message-ID-Hash: JNJPYXJGSSCIN63CGDV2EL6UMHMQNHVM X-Mailman-Approved-At: Wed, 02 Sep 2026 16:13:31 +0000 CC: den@openvz.org X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: "Denis V. Lunev via Devel" Reply-To: "Denis V. Lunev" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1788365940367158500 Where QEMU_CAPS_WIN_DMP_GUEST_AWARE is present, QEMU reports win-dmp as available only for a guest that has published a vmcoreinfo dump header. In that case prefer it over the elf default: converting an elf dump into a Windows-debuggable format afterwards is possible but complicated and unreliable. Add qemuDomainGetAutoDumpFormat(), which probes win-dmp support right before an auto-triggered dump and falls back to elf otherwise. Use it from both doCoreDumpToAutoDumpPath() (on_crash) and processWatchdogEvent() (watchdog dump). virDomainCoreDump() and virDomainCoreDumpWithFormat() are left untouched, since RAW there is a documented part of their API contract, standing in for an explicit caller request rather than an internal default. The probe is best-effort: reset any error left by a failed monitor call or QMP command, so it cannot leak past a dump that otherwise succeeds. Without the capability the probe is skipped: older QEMU offers win-dmp on any x86 machine, where the resulting dump is useless. Signed-off-by: Denis V. Lunev Reviewed-by: Daniel P. Berrang=C3=A9 --- NEWS.rst | 7 +++++++ src/qemu/qemu_driver.c | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/NEWS.rst b/NEWS.rst index 267f5fd659..529546f02e 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -19,6 +19,13 @@ v12.8.0 (unreleased) =20 * **Improvements** =20 + * qemu: Select the win-dmp format for Windows guest crash dumps + + Dumps triggered by ```` and by watchdog handling used QEMU's= elf + default, which WinDbg cannot load. Where QEMU reports the format as + available only to a guest that can use it, such dumps are now written = in + win-dmp format instead. + * **Bug fixes** =20 =20 diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 099279a68b..4766c39cbd 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3532,6 +3532,34 @@ getAutoDumpPath(virQEMUDriver *driver, return g_strdup_printf("%s/%s-%s", cfg->autoDumpPath, domname, nowstr); } =20 +/* Older QEMU offers win-dmp on any x86 machine, so trust the capability + * query only where QEMU says the answer depends on the guest. */ +static unsigned int +qemuDomainGetAutoDumpFormat(virDomainObj *vm) +{ + qemuDomainObjPrivate *priv =3D vm->privateData; + unsigned int dumpformat =3D VIR_DOMAIN_CORE_DUMP_FORMAT_RAW; + int rc; + + if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_WIN_DMP_GUEST_AWARE)) + return dumpformat; + + if (qemuDomainObjEnterMonitorAsync(vm, VIR_ASYNC_JOB_DUMP) < 0) { + virResetLastError(); + return dumpformat; + } + + rc =3D qemuMonitorGetDumpGuestMemoryCapability(priv->mon, "win-dmp"); + if (rc < 0) + virResetLastError(); + else if (rc > 0) + dumpformat =3D VIR_DOMAIN_CORE_DUMP_FORMAT_WIN_DMP; + + qemuDomainObjExitMonitor(vm); + return dumpformat; +} + + static void processWatchdogEvent(virQEMUDriver *driver, virDomainObj *vm, @@ -3558,7 +3586,7 @@ processWatchdogEvent(virQEMUDriver *driver, =20 flags |=3D cfg->autoDumpBypassCache ? VIR_DUMP_BYPASS_CACHE: 0; if ((ret =3D doCoreDump(driver, vm, dumpfile, flags, - VIR_DOMAIN_CORE_DUMP_FORMAT_RAW)) < 0) + qemuDomainGetAutoDumpFormat(vm))) < 0) virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("Dump failed")); =20 @@ -3578,6 +3606,7 @@ processWatchdogEvent(virQEMUDriver *driver, virDomainObjEndAsyncJob(vm); } =20 + static int doCoreDumpToAutoDumpPath(virQEMUDriver *driver, virDomainObj *vm, @@ -3592,7 +3621,7 @@ doCoreDumpToAutoDumpPath(virQEMUDriver *driver, =20 flags |=3D cfg->autoDumpBypassCache ? VIR_DUMP_BYPASS_CACHE: 0; if ((ret =3D doCoreDump(driver, vm, dumpfile, flags, - VIR_DOMAIN_CORE_DUMP_FORMAT_RAW)) < 0) + qemuDomainGetAutoDumpFormat(vm))) < 0) virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("Dump failed")); return ret; --=20 2.53.0 From nobody Mon Sep 14 04:49:16 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1788366042; cv=none; d=zohomail.com; s=zohoarc; b=mhXl00M/iU4DHrIYvkdE/kxnaTZjBsxfuDCyIBxrVzaECEGckZJUr33gU0WFkaivFf3JcJig+0h7TDNQIhrTkbMUgUAqjx8T32/10Ad0oOIg/eR0jz2j5mXhUfZK7fedk0fkcn0Y7gX8touuzGwmJbmmpRR5FayJHXDFnQUOsTI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1788366042; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=PM8168/Plo8Y1wqZ1LK256666+UWB69QlPF3mRnRz64=; b=Da9SDrSXwXR4Rx45s8+jicQk5WT1s6BEkEuR0FSntmPkvsM55l3Mi8JSKv5Ezll0h1bAZ+mo6qHknocEhKagB/bDJxgOb5vPQfwJdmmuj0JEkEpurqiBanB3YcechY57MeEMk9QJjg0DGRadsuMjiYYsNn40tkhPecoZOTZUMJQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 178836604275331.29831367363863; Wed, 2 Sep 2026 09:20:42 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id CE7373F951; Wed, 2 Sep 2026 12:20:41 -0400 (EDT) Received: from [172.19.199.13] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id B31823F977 for ; Wed, 2 Sep 2026 12:14:00 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 2A6303F86E; Wed, 2 Sep 2026 10:17:24 -0400 (EDT) Received: from mail-wm1-x331.google.com (mail-wm1-x331.google.com [IPv6:2a00:1450:4864:20::331]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id E2A833F862 for ; Wed, 2 Sep 2026 10:17:22 -0400 (EDT) Received: by mail-wm1-x331.google.com with SMTP id 5b1f17b1804b1-4953e04ef16so10196105e9.2 for ; Wed, 02 Sep 2026 07:17:22 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:7977:547c:b807:b46a]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49ce478daf6sm127903915e9.15.2026.09.02.07.17.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 02 Sep 2026 07:17:20 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1788358642; x=1788963442; darn=lists.libvirt.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=PM8168/Plo8Y1wqZ1LK256666+UWB69QlPF3mRnRz64=; b=LhplYQQyFrQoOnWw/nuvOIEdzapyKQ6PNDPWkyWG1poOEVNmcysyGBbDdSZg18YUWJ yERZdaDah/qulgTVPLgoYyosGQ9SzwWzQGIXL466NysAmOi25aSC84PwBD5JKqK9I9Sv 0WoX3cAgT03xJ0KKKX7wNLcOZQjL8TfETLeqhXmSVEvdjCgPDYI2TziMUQniy/t3XKYJ PeV53F2Tv2rRcXNb3fsUv/ww93mEEzFjkyiO5aHQRjolmiPPTtr0FpAWUQG8y0IbBNqe 6HdmQCarA8QM+Hg9mUy1rQQjYDG/vAOoKrrq4fQrCDx+GfEqQ6r1rpVT5jVt7uQS71YX 9lHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788358642; x=1788963442; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=PM8168/Plo8Y1wqZ1LK256666+UWB69QlPF3mRnRz64=; b=PlVKbsJYUxWdmciuRzu9/E/JQcCVitPepN4T9PpVblcQDxE+rv3h8LUCMbva2g+osk Kj72X7Tpl7t179TIcmt7msUjjRIumvBjUguBM28sCW8NiFjy/75XWUIz/TjVvwpiseT2 DGp+TCzzpdjgF5wZYP75e+ye9F4TmWR767J31FYcdlecd1vej5hKUAua3Jb53hTEhB+1 0c9lStB+rBN3ygwK90QZhxmRSmKXeOysXy3v7+sjoBhTPVxPyieKamV6o95kvCXlhSMH +IGJywlX8e94wIqMt6Y34KG7v8nWhliWEd29HsNRqT4PlDe+HtifB5pg0YhGfr3+4UiA TAfQ== X-Gm-Message-State: AFuF++lrxraZyk6JvcajhGcwixprYqr6yII4fgKxrsZP0xIijImwYIOz IXZeyE3TUKs0dM2R2MRVpd/LLh1Pwi4fYu/qxuDrAAQ5kIYmxMAchy7stMFlfGuWHSqJ9Qp89f3 mRl0Y X-Gm-Gg: AR+sD10undofl1ZJCHn31m0LitCTFnr2T4ld7miIrspkgeU3E+xT9fH4U3Hte1BvxsO upTeFV3bmKsVFr9bHbAxF3SWkWrKmVrjllvMi58KT+x7lBKeh3NoYd/PLSqh3mZadIqX3LbF4yn DdoAHgS7ZrZg7N2X8gGD9YK3jK5N7W7R1rsVodXyW8dv2I44/DwczUhg14oGgxNAG4fN6U/k8Yc /oCh5xgfUj0D5PRpoJVixCQwSMN/K3JQ1kM8X4Bx3i8kWa+uNs3RL6H/K6OujVCOwtZ2IECv3lQ c93AOdVSfJY87ZvMFHbLDY/AfU6I7KepN5fI0c7/VBKXSF/EExWcEhc9mhTQ8imb3O4q9Qkw+w+ bMOKwgxRIeedsrJwGvnlD9OlGMuT9pUFLEScnbfTOT+N/CMooHlrFWBW+aVPzkDYRitqHN3e8qa juWcNOTcqfADK9DbPKhk8SqsHBPONMv8C9ChxloKxZs/eBmJ5sOQ/u351RvmU= X-Received: by 2002:a05:600c:c170:b0:49b:d45:703e with SMTP id 5b1f17b1804b1-49ce57f072fmr115736925e9.8.1788358641475; Wed, 02 Sep 2026 07:17:21 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH v3 3/5] util: add virStrToBytes() and virConfGetValueBytes() for scaled sizes Date: Wed, 2 Sep 2026 16:17:13 +0200 Message-ID: <20260902141715.746721-4-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260902141715.746721-1-den@openvz.org> References: <20260902141715.746721-1-den@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-MailFrom: den@openvz.org X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation Message-ID-Hash: HRU3CN7HXDNJL46TAT26MVJMWYSOIQJ2 X-Message-ID-Hash: HRU3CN7HXDNJL46TAT26MVJMWYSOIQJ2 X-Mailman-Approved-At: Wed, 02 Sep 2026 16:13:32 +0000 CC: den@openvz.org X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: "Denis V. Lunev via Devel" Reply-To: "Denis V. Lunev" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1788366050241154100 virScaleInteger() already turns a number plus a unit suffix into bytes, but every caller has to split a whole string like "10GiB" by hand via virStrToLong_ullp() first, the way virFileReadValueScaledInt() does for sysfs files. Add virStrToBytes(), which does that split once, and virConfGetValueBytes() on top of it, so a qemu.conf-style setting can accept a scaled size in one call. Named "Bytes" rather than "Size" to avoid reading as a variant of virConfGetValueSizeT()/SSizeT(), whose "T" is the C type they fill, not a unit. Add unit tests for virStrToBytes() in virstringtest.c. Signed-off-by: Denis V. Lunev Reviewed-by: Daniel P. Berrang=C3=A9 --- src/libvirt_private.syms | 2 ++ src/util/virconf.c | 47 +++++++++++++++++++++++++ src/util/virconf.h | 3 ++ src/util/virutil.c | 23 ++++++++++++ src/util/virutil.h | 5 +++ tests/virstringtest.c | 76 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 156 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 6c6cc7b4ff..81d0574676 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2282,6 +2282,7 @@ virConfFree; virConfFreeValue; virConfGetValue; virConfGetValueBool; +virConfGetValueBytes; virConfGetValueInt; virConfGetValueLLong; virConfGetValueSizeT; @@ -3563,6 +3564,7 @@ virStringStripIPv6Brackets; virStringStripSuffix; virStringToUpper; virStringTrimOptionalNewline; +virStrToBytes; virStrToDouble; virStrToLong_i; virStrToLong_ll; diff --git a/src/util/virconf.c b/src/util/virconf.c index c820c94037..c4238e68d9 100644 --- a/src/util/virconf.c +++ b/src/util/virconf.c @@ -1116,6 +1116,53 @@ int virConfGetValueUInt(virConf *conf, } =20 =20 +/** + * virConfGetValueBytes: + * @conf: the config object + * @setting: the config entry name + * @value: pointer to hold the byte count + * + * Get the value of the config entry @setting, storing it in @value. + * The entry may be a plain integer, taken as a byte count, or a + * string holding a byte count followed by a unit suffix understood + * by virStrToBytes(). If the config entry is not present, then + * @value will be unmodified. + * + * Reports an error if the config entry is set but has an unexpected + * type, or if a string entry cannot be parsed as a size. + * + * Returns: 1 if the value was present, 0 if missing, -1 on error + */ +int virConfGetValueBytes(virConf *conf, + const char *setting, + unsigned long long *value) +{ + virConfValue *cval =3D virConfGetValue(conf, setting); + + VIR_DEBUG("Get value bytes %p %d", + cval, cval ? cval->type : VIR_CONF_NONE); + + if (!cval) + return 0; + + if (cval->type =3D=3D VIR_CONF_ULLONG) { + *value =3D cval->l; + return 1; + } + + if (cval->type =3D=3D VIR_CONF_STRING) { + if (virStrToBytes(cval->str, ULLONG_MAX, value) < 0) + return -1; + return 1; + } + + virReportError(VIR_ERR_INTERNAL_ERROR, + _("%1$s: expected an unsigned integer or a size string = for '%2$s' parameter"), + conf->filename, setting); + return -1; +} + + /** * virConfGetValueSizeT: * @conf: the config object diff --git a/src/util/virconf.h b/src/util/virconf.h index e656a6a815..0932823ce3 100644 --- a/src/util/virconf.h +++ b/src/util/virconf.h @@ -100,6 +100,9 @@ int virConfGetValueInt(virConf *conf, int virConfGetValueUInt(virConf *conf, const char *setting, unsigned int *value); +int virConfGetValueBytes(virConf *conf, + const char *setting, + unsigned long long *value); int virConfGetValueSizeT(virConf *conf, const char *setting, size_t *value); diff --git a/src/util/virutil.c b/src/util/virutil.c index 3e107cdae6..2be9a460ac 100644 --- a/src/util/virutil.c +++ b/src/util/virutil.c @@ -235,6 +235,29 @@ virScaleInteger(unsigned long long *value, const char = *suffix, } =20 =20 +/* Parse the whole of STR as a byte count into RESULT, rejecting the + * result if it exceeds LIMIT. STR is a plain decimal integer, or a + * decimal integer immediately followed by one of the unit suffixes + * recognized by virScaleInteger(); unlike virStrToLong_ullp(), no + * characters may be left over after that optional suffix. Return 0 on + * success, -1 with error message raised on failure. */ +int +virStrToBytes(const char *str, + unsigned long long limit, + unsigned long long *result) +{ + char *end; + + if (virStrToLong_ullp(str, &end, 10, result) < 0) { + virReportError(VIR_ERR_INVALID_ARG, + _("Unable to parse integer from size '%1$s'"), str); + return -1; + } + + return virScaleInteger(result, end, 1, limit); +} + + /** * Format @val as a base-10 decimal number, in the * buffer @buf of size @buflen. To allocate a suitable diff --git a/src/util/virutil.h b/src/util/virutil.h index 2accb5777d..5678c339ba 100644 --- a/src/util/virutil.h +++ b/src/util/virutil.h @@ -44,6 +44,11 @@ int virScaleInteger(unsigned long long *value, const cha= r *suffix, unsigned long long scale, unsigned long long limit) ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT; =20 +int virStrToBytes(const char *str, + unsigned long long limit, + unsigned long long *result) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3) G_GNUC_WARN_UNUSED_RESULT; + char *virFormatIntDecimal(char *buf, size_t buflen, int val) ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT; =20 diff --git a/tests/virstringtest.c b/tests/virstringtest.c index 0792155cc3..9c1448672c 100644 --- a/tests/virstringtest.c +++ b/tests/virstringtest.c @@ -18,10 +18,13 @@ =20 #include =20 +#include + =20 #include "testutils.h" #include "virlog.h" #include "virstring.h" +#include "virutil.h" =20 #define VIR_FROM_THIS VIR_FROM_NONE =20 @@ -378,6 +381,38 @@ testStringToLong(const void *opaque) } =20 =20 +struct stringToBytesData { + const char *str; + unsigned long long limit; + unsigned long long expect; + int expect_ret; +}; + +static int +testStringToBytes(const void *opaque) +{ + const struct stringToBytesData *data =3D opaque; + unsigned long long value; + int ret; + + ret =3D virStrToBytes(data->str, data->limit, &value); + + if (ret !=3D data->expect_ret) { + fprintf(stderr, "Expected return '%d', got '%d' for '%s'\n", + data->expect_ret, ret, data->str); + return -1; + } + + if (ret =3D=3D 0 && value !=3D data->expect) { + fprintf(stderr, "Expected value '%llu', got '%llu' for '%s'\n", + data->expect, value, data->str); + return -1; + } + + return 0; +} + + struct stringToDoubleData { const char *str; const char *end_ptr; @@ -678,6 +713,47 @@ mymain(void) TEST_STRTOL("-18446744073709551616", NULL, 0, -1, 0U, -1, 0LL, -1, 0ULL, -1); =20 +#define TEST_STRTOBYTES(str, limit, expect, expect_ret) \ + do { \ + struct stringToBytesData data =3D { \ + str, limit, expect, expect_ret, \ + }; \ + if (virTestRun("virStrToBytes '" str "'", \ + testStringToBytes, &data) < 0) \ + ret =3D -1; \ + } while (0) + + /* Plain byte counts, no suffix */ + TEST_STRTOBYTES("0", ULLONG_MAX, 0, 0); + TEST_STRTOBYTES("1073741824", ULLONG_MAX, 1073741824, 0); + + /* Binary suffixes, and their bare single-letter equivalents */ + TEST_STRTOBYTES("10K", ULLONG_MAX, 10240, 0); + TEST_STRTOBYTES("10KiB", ULLONG_MAX, 10240, 0); + TEST_STRTOBYTES("1M", ULLONG_MAX, 1048576, 0); + TEST_STRTOBYTES("1G", ULLONG_MAX, 1073741824, 0); + TEST_STRTOBYTES("1GiB", ULLONG_MAX, 1073741824, 0); + TEST_STRTOBYTES("1T", ULLONG_MAX, 1099511627776ULL, 0); + + /* Decimal (SI) suffixes */ + TEST_STRTOBYTES("10KB", ULLONG_MAX, 10000, 0); + TEST_STRTOBYTES("1GB", ULLONG_MAX, 1000000000, 0); + + /* Bytes, spelled out */ + TEST_STRTOBYTES("42b", ULLONG_MAX, 42, 0); + TEST_STRTOBYTES("42byte", ULLONG_MAX, 42, 0); + TEST_STRTOBYTES("42bytes", ULLONG_MAX, 42, 0); + + /* Unknown suffix */ + TEST_STRTOBYTES("10Q", ULLONG_MAX, 0, -1); + + /* Trailing garbage after a valid suffix */ + TEST_STRTOBYTES("10Gextra", ULLONG_MAX, 0, -1); + + /* Overflow */ + TEST_STRTOBYTES("18446744073709551615", 1000, 0, -1); + TEST_STRTOBYTES("100E", ULLONG_MAX, 0, -1); + #define TEST_STRTOD(str, end_ptr, res) \ do { \ struct stringToDoubleData data =3D { \ --=20 2.53.0 From nobody Mon Sep 14 04:49:16 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1788366112; cv=none; d=zohomail.com; s=zohoarc; b=cFQ2DUAEcwinTn7KV3OXOoI5Sn2p/0bJh9OJ1+7l4vhUiW/6hIWDP9ZviitK0I+OYLJohuVyV4Vefi+mONZ8DWDR1OeX7N++28SH7m0UBbHbp2hdQsMYdC7jz24VkQBmqQ92Lh8f36+IVlpLmJIUp0m2SKO8Nh4yB9UJbSd+oqk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1788366112; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=W2jZv9B/cx/UPazMnFu5QrpeOrRKXKrFvf0LK9u4nQI=; b=OOpgmyYasoH9dOTiJB1ikHHqGJIaSr6lJobFCNWlUMnSvK/0APLuRAO9Fby4NGNJqPkTYdXwl0fdx0xQaCpfDrbVqdE/NHP9uLNrrf6xxxfr0f4hjdrMQNnO6B+pJFyse89XO6yoyLcK9GUH5bvAldON55a4MABi6mhq7Kc7mSU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1788366112307366.80722829692365; Wed, 2 Sep 2026 09:21:52 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 33C0D41929; Wed, 2 Sep 2026 12:21:51 -0400 (EDT) Received: from [172.19.199.13] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 0784241B9F for ; Wed, 2 Sep 2026 12:14:05 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 084F33F84F; Wed, 2 Sep 2026 10:17:24 -0400 (EDT) Received: from mail-wm1-x335.google.com (mail-wm1-x335.google.com [IPv6:2a00:1450:4864:20::335]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 16CCC3F86C for ; Wed, 2 Sep 2026 10:17:24 -0400 (EDT) Received: by mail-wm1-x335.google.com with SMTP id 5b1f17b1804b1-4921eed3fa2so9446455e9.0 for ; Wed, 02 Sep 2026 07:17:24 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:7977:547c:b807:b46a]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49ce478daf6sm127903915e9.15.2026.09.02.07.17.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 02 Sep 2026 07:17:22 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1788358643; x=1788963443; darn=lists.libvirt.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=W2jZv9B/cx/UPazMnFu5QrpeOrRKXKrFvf0LK9u4nQI=; b=rl3wqUVgwRxZgc35regQIr77sejH+zeRoWpILru+NJaQy4jFO79OUp2Jj+I/xD90Do WZC3/s9ObQStqTpiPPtr0z9ROqgwHh9y/J95gNL6LuYKxpclnevuWxOhkGnz+zCEVDQO eHfdrDLAoVvGplrtfBnmilu34IE0zCqAUQanWioijpMQK5G1wcQxad5wgsG+gnYGWNa9 nR9Y05HPOPmhbagYFH9DAB8CNzDyqLypC4nyh1cXKsF2LB8qd3VrE2x1Vq2mRGTeTZI5 gl7h8VkFW8v5yaZ8gY469SIqkZZXNKAdBpRVL89XE4yhSGy4PxaaplwvJiVqSoA/UkTn tYTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788358643; x=1788963443; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=W2jZv9B/cx/UPazMnFu5QrpeOrRKXKrFvf0LK9u4nQI=; b=cPJ8y4X17sYMEmBtmQsHDJ/bicYLBz14KpzR5VedqktDmAHaRaoUbSyX4KdSZnfL3I iJFwZjc1JAN2iy8irpM6T2oe/aBZ8wbaN3EL2ad09chHZ265JSxy/8lEcb420xzZcYf8 mY1aYtiIYG9dsQDRyhVEIuRl4NLr2ziz4W0PVPsGmbXYyPDXkMnYyX/ijFjQy/sFL/gV NTu8Im1uZld7E7KiJq5lPp6nZZnYKtqmlahVDN0WwB50Jlb3HECWJrl41SDx1R9bn7o/ xTfQjeDARWg3+3cpvI0IV/gDtXrme+POLMkELUTz+keJIuxYHjdIILu9Ryf7Rjvc9I7X q21A== X-Gm-Message-State: AFuF++lUbNYTWrvwY/mAGdKg6ssMRqfGr2G7+tpsaIBiBVcJ+uML1JJZ 28YsMXbDfcRBcMYbqMWcd/bmoUA27kG0l4R31fLVZQxbG6L8Y9Tf3Y0BnPkG+zSKlNqf+Y/+jpO ioHQU X-Gm-Gg: AR+sD12Ctp2ZuPPF4WrvWrqpBAZUV4WlMYrEkEYlq2IGj9h09rP1Ql6EWU4npOPjPjc aGFVztfEzqIkENvOcIWXhWHLdOB+nDDMh4bL5ABDIXqXwg0QQjN1YwPtKn0wF1bZ3luLBwJycAe 8N4ORqrybWeLXMQRDJEEclacBVLlpXpwP61zKqmivOMliIlDzy0nukzbXP7np8WmZdbOsthG239 YpiG4NYuWUsGhuGaLFPW0z55TsYkbGIbQd4DFbhvmaIp33sBnXYTevU2FNwbmlYIMIQyDdr3xBF COFndNI9Y6R5IAROW3q7NTtK6+vxBnDyrzovhXWQwO4yYmoBc1jT4aQY/vc3ig/koXUaZtuVQMH UOyGh7KYpN9hSg9VBrcQMWeQTDSR+lTZdpczn+W13fVDljhB1UafdCCExsqxNRXpXfUWIgrYOol d9jfCJLfbQV0A83g4EUsAyEg2+qwHDJY4GYOO0vzYGoPbcUghKXN2UoB88qlzmN4R4oEMt X-Received: by 2002:a05:600c:1d11:b0:49c:c0d4:53d9 with SMTP id 5b1f17b1804b1-49ce582a54amr91492525e9.14.1788358642666; Wed, 02 Sep 2026 07:17:22 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH v3 4/5] logging: accept a unit suffix in virtlogd's max_size Date: Wed, 2 Sep 2026 16:17:14 +0200 Message-ID: <20260902141715.746721-5-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260902141715.746721-1-den@openvz.org> References: <20260902141715.746721-1-den@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-MailFrom: den@openvz.org X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation Message-ID-Hash: B5H5Z2AXE5XRI54NI6OKK4BRV4HMRSDD X-Message-ID-Hash: B5H5Z2AXE5XRI54NI6OKK4BRV4HMRSDD X-Mailman-Approved-At: Wed, 02 Sep 2026 16:13:32 +0000 CC: den@openvz.org X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: "Denis V. Lunev via Devel" Reply-To: "Denis V. Lunev" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1788366113388158500 Switch max_size from virConfGetValueSizeT() to virConfGetValueBytes(), so it accepts "2MiB" the same way domain XML memory sizes do, instead of only a raw byte count. virtlogd.aug accepts the quoted form too; its quoted branch requires a unit suffix, as one matching a bare number would overlap the integer branch. Signed-off-by: Denis V. Lunev Reviewed-by: Daniel P. Berrang=C3=A9 --- NEWS.rst | 5 +++++ src/logging/log_daemon_config.c | 2 +- src/logging/log_daemon_config.h | 2 +- src/logging/test_virtlogd.aug.in | 2 +- src/logging/virtlogd.aug | 5 ++++- src/logging/virtlogd.conf | 7 ++++++- 6 files changed, 18 insertions(+), 5 deletions(-) diff --git a/NEWS.rst b/NEWS.rst index 529546f02e..357f9cda10 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -26,6 +26,11 @@ v12.8.0 (unreleased) available only to a guest that can use it, such dumps are now written = in win-dmp format instead. =20 + * logging: ``max_size`` in virtlogd.conf accepts a unit suffix + + The setting now takes a size such as ``"2MiB"`` as well as a plain byte + count. + * **Bug fixes** =20 =20 diff --git a/src/logging/log_daemon_config.c b/src/logging/log_daemon_confi= g.c index 60c424ad84..e0d6384818 100644 --- a/src/logging/log_daemon_config.c +++ b/src/logging/log_daemon_config.c @@ -91,7 +91,7 @@ virLogDaemonConfigLoadOptions(virLogDaemonConfig *data, return -1; if (virConfGetValueUInt(conf, "admin_max_clients", &data->admin_max_cl= ients) < 0) return -1; - if (virConfGetValueSizeT(conf, "max_size", &data->max_size) < 0) + if (virConfGetValueBytes(conf, "max_size", &data->max_size) < 0) return -1; if (virConfGetValueSizeT(conf, "max_backups", &data->max_backups) < 0) return -1; diff --git a/src/logging/log_daemon_config.h b/src/logging/log_daemon_confi= g.h index 5c10cc50d7..617b62258b 100644 --- a/src/logging/log_daemon_config.h +++ b/src/logging/log_daemon_config.h @@ -32,7 +32,7 @@ struct _virLogDaemonConfig { unsigned int admin_max_clients; =20 size_t max_backups; - size_t max_size; + unsigned long long max_size; =20 char *log_root; size_t max_age_days; diff --git a/src/logging/test_virtlogd.aug.in b/src/logging/test_virtlogd.a= ug.in index 8dfad39506..da1c8530d1 100644 --- a/src/logging/test_virtlogd.aug.in +++ b/src/logging/test_virtlogd.aug.in @@ -7,7 +7,7 @@ module Test_virtlogd =3D { "log_outputs" =3D "3:syslog:virtlogd" } { "max_clients" =3D "1024" } { "admin_max_clients" =3D "5" } - { "max_size" =3D "2097152" } + { "max_size" =3D "2MiB" } { "max_backups" =3D "3" } { "max_age_days" =3D "0" } { "log_root" =3D "/var/log/libvirt" } diff --git a/src/logging/virtlogd.aug b/src/logging/virtlogd.aug index bdf61dea6e..17b2aea452 100644 --- a/src/logging/virtlogd.aug +++ b/src/logging/virtlogd.aug @@ -22,6 +22,9 @@ module Virtlogd =3D let int_entry (kw:string) =3D [ key kw . value_sep . int_val ] let str_array_entry (kw:string) =3D [ key kw . value_sep . str_array_va= l ] =20 + let bytes_val =3D del /\"/ "\"" . store /[0-9]+[a-zA-Z]+/ . del /\"/ "\= "" + let bytes_entry (kw:string) =3D [ key kw . value_sep . bytes_val ] |= [ key kw . value_sep . int_val ] + =20 (* Config entry grouped by function - same order as example config *) let logging_entry =3D int_entry "log_level" @@ -29,7 +32,7 @@ module Virtlogd =3D | str_entry "log_outputs" | int_entry "max_clients" | int_entry "admin_max_clients" - | int_entry "max_size" + | bytes_entry "max_size" | int_entry "max_backups" | int_entry "max_age_days" | str_entry "log_root" diff --git a/src/logging/virtlogd.conf b/src/logging/virtlogd.conf index 5214e96121..51bc0590ed 100644 --- a/src/logging/virtlogd.conf +++ b/src/logging/virtlogd.conf @@ -87,6 +87,11 @@ =20 # Maximum file size before rolling over. Defaults to 2 MB # +# The value is a plain byte count, or a byte count followed by a unit +# suffix: bytes/b, KB/k/KiB, MB/M/MiB, GB/G/GiB, TB/T/TiB, PB/P/PiB, or +# EB/E/EiB (decimal 'B' suffixes scale by 1000, binary 'iB' suffixes, +# and their bare single-letter equivalents, scale by 1024). +# # Setting max_size to zero will disable rollover entirely. # NOTE: disabling rollover exposes the host filesystem to # denial of service from a malicious guest. @@ -96,7 +101,7 @@ # the logrotate config is a no-op when virtlogd is running, # make sure that max_size here is smaller than size listed # in the logrotate config. -#max_size =3D 2097152 +#max_size =3D "2MiB" =20 # Maximum number of backup files to keep. Defaults to 3, # not including the primary active file --=20 2.53.0 From nobody Mon Sep 14 04:49:16 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1788366235; cv=none; d=zohomail.com; s=zohoarc; b=OQTlM82WpOEOCKHLYAnmEh9PhPi4GGaa+O6FeWOY6YG147NB42gvCs5S1TvYSiYV5+jJgzj5MXv232lvMpnLvMI5qtJDgz81wi5u6ztjA+YENSm++l3XM/et0jsDrk9FsgpK5e3d0LdsLVJkJhZLjpftw44AWpGn5Yba4tXEPMc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1788366235; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=2BqoDJGkD+GWVHnC5EpjaXsR7hX0VT1z6AELpQ6RvLo=; b=AHDl12tKdfMpXJrgXTTicvZFEcO37bXoNe5O5X7t3z8folSMDZ6kmnbD3GXOYv6YSp1FRgP2UBCec30RKndJXSsSLFugAzqjkk2ZzLYE+SsTYQTq+LN3tr92vWXI93c4IBonq3deNzxgqO4k1VzwKLZgA7D4Im6JZYkYNXG1Bsk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1788366235211739.4385287720831; Wed, 2 Sep 2026 09:23:55 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 1D3593FAAD; Wed, 2 Sep 2026 12:23:53 -0400 (EDT) Received: from [172.19.199.13] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 705A1417CA for ; Wed, 2 Sep 2026 12:14:10 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 6C96F3F322; Wed, 2 Sep 2026 10:17:26 -0400 (EDT) Received: from mail-wm1-x334.google.com (mail-wm1-x334.google.com [IPv6:2a00:1450:4864:20::334]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 0D3993F862 for ; Wed, 2 Sep 2026 10:17:25 -0400 (EDT) Received: by mail-wm1-x334.google.com with SMTP id 5b1f17b1804b1-49557167508so10770305e9.1 for ; Wed, 02 Sep 2026 07:17:25 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:7977:547c:b807:b46a]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49ce478daf6sm127903915e9.15.2026.09.02.07.17.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 02 Sep 2026 07:17:23 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1788358644; x=1788963444; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=2BqoDJGkD+GWVHnC5EpjaXsR7hX0VT1z6AELpQ6RvLo=; b=jaGMkbNYnwMalAbPqt0Qos9M3b9AescX94WvhcC9g+sx0PlZK7ZmQmKNjqDDK0bdMf EQTyRy+dq9Q9IqpEORmRR9iPRZ66AUUXQTyb3DkEQ0lhWKFJYGI6NIojuDHuDJp+RPMu wZRor3mBMzy0cdqjhihaZQgDIIlfPJalejN5Y1Si5ovvMBri7eE0OFlldChdPjBwDnQ/ DQjDBX2kWsDkXdKIgrAbg5/rUPltCbOUq6ghp8LfiID9BbqiYrc/JCLinVDumhT9cu7o uBA2IzPWO3p6JjxTl42Cv/P0GBJ44YjqMz4NyRUDH+6C3/Cm5534ouudsUDnoILQ0Ge1 IwrQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788358644; x=1788963444; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=2BqoDJGkD+GWVHnC5EpjaXsR7hX0VT1z6AELpQ6RvLo=; b=nOZ7pCBFpwCPflBATFm7u4a2DgB0NkLqLzFrmNgr0jY8nsb7T3uLT7V9oucbGASHfT DkqZN4XgSC/xSVHfKJotUTR9CvHHP+vTXd0lp1ha8dNOTvQ/iNxMlLPfGr8GrA0Dgsqy uY7Dqdn0TN14PFjS7gGWT/Ik1eOJL3QOve8q1/p1lTXRnvTVwlmVTjtw9JDRz1am/L5F gNgRkQLWizs+ItkwC7HY2ozyXBW/fCyzYylUF+FtpO79exgqWUiSNI6lvcel9TReM6jF ExJQdmglmyiEI8L+oosX0Ukdc7G/VrJ2/TZEUb1EXw9//cZQU1Lqnx7fyKrmDvkeC7uB JHpA== X-Gm-Message-State: AFuF++mj12s99ZNtHVYvOB5i2dI7yD2U4KZQI+KtPw83O6oneMkjSTN3 /PZSuwnDBD9FW2IEg398rCkse3a4VhOLi87JvpBUqNH+8eJYMlqcraqDaLDUqquqzPLtPJAMQmK rg5Ob X-Gm-Gg: AR+sD12R6tb8lN60urSyaQEXWtARiEtomiBjnMQIYP4i+9o6KSXhaowcYT+y2bJGk93 y0R7xJ9b/6x8qarv3SqMVDANh7agoX9XCeVYC87aTOnFVIkfzyder+LjYYU9DaC108kHkrwHLd0 4WhNKWJReWm6hXZuGIxte6PK5rNSEOi0zmnumbNkQYynbR+Etq/NfCyaR1qHpsj6OeZ490lz00q +B9sasUNQ/j7qOsDDYp79YRy/9TVSHk0dvxzq+0lHSK1dopI2i9kLMf7p3hk7CskiqvnmuI6WRh 0VWW/Ozc8Zl2UazXtb9eq82lKsKeP0fFxrigObhG2hXRoYX/ngxgQz4BfsxYIcBdDif6Hbk/coV Gie8ns3ZW3iOE7aJpFexs9e1gyv6dCiKR8G23HqBnUbeJS49244LRRWU5BpdvsRzRzQeTA5K4OR ShlU0obo7UcbkV6YhMYm1Uzc5j4K00osyWH3l4+R7JhLqjFMBi67mK+E5wjA== X-Received: by 2002:a05:600d:a:b0:49c:e88b:b7ce with SMTP id 5b1f17b1804b1-49ce88bb80emr60575625e9.11.1788358643582; Wed, 02 Sep 2026 07:17:23 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH v3 5/5] qemu: cap total size of auto-triggered dumps under auto_dump_path Date: Wed, 2 Sep 2026 16:17:15 +0200 Message-ID: <20260902141715.746721-6-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260902141715.746721-1-den@openvz.org> References: <20260902141715.746721-1-den@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-MailFrom: den@openvz.org X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation Message-ID-Hash: 74POUD5DEAHBUMS2W5BXVTUAVJEYD26Y X-Message-ID-Hash: 74POUD5DEAHBUMS2W5BXVTUAVJEYD26Y X-Mailman-Approved-At: Wed, 02 Sep 2026 16:13:32 +0000 CC: den@openvz.org X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: "Denis V. Lunev via Devel" Reply-To: "Denis V. Lunev" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1788366239182158500 Content-Type: text/plain; charset="utf-8" Each on_crash or watchdog-triggered dump writes a full memory dump into auto_dump_path. A guest that keeps crashing and restarting (or crashing and getting destroyed, then respawned by the mgmt app) can fill the disk one dump at a time, with nothing to stop it. Add auto_dump_max_size (qemu.conf), parsed via virConfGetValueBytes() so it takes a plain byte count or a size with a unit suffix (e.g. "10GiB"). After a dump is written, the oldest dumps under auto_dump_path are removed until the total fits the configured quota. The dump that was just written is always kept by identity, not by sort position: mtime is only second-granularity, so two dumps written the same second would otherwise make the eviction order between them arbitrary and could delete the one just written instead of an older one. Defaults to 0, which keeps every dump forever, as before. Only files named the way getAutoDumpPath() names them count toward the quota, and nothing is pruned when the dump itself failed. libvirtd_qemu.aug gains a matching entry; its quoted branch requires a unit suffix, as one matching a bare number would overlap the integer branch. Signed-off-by: Denis V. Lunev Reviewed-by: Daniel P. Berrang=C3=A9 --- NEWS.rst | 7 ++ src/qemu/libvirtd_qemu.aug | 4 + src/qemu/qemu.conf.in | 17 ++++ src/qemu/qemu_conf.c | 2 + src/qemu/qemu_conf.h | 1 + src/qemu/qemu_driver.c | 132 +++++++++++++++++++++++++++++ src/qemu/test_libvirtd_qemu.aug.in | 1 + 7 files changed, 164 insertions(+) diff --git a/NEWS.rst b/NEWS.rst index 357f9cda10..c333d6287b 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -17,6 +17,13 @@ v12.8.0 (unreleased) =20 * **New features** =20 + * qemu: Add ``auto_dump_max_size`` to cap the size of auto-triggered dum= ps + + A guest that keeps crashing fills ``auto_dump_path`` one dump at a tim= e. + The new ``auto_dump_max_size`` setting in qemu.conf bounds the total s= ize + those dumps may occupy, pruning the oldest after each new one. It take= s a + byte count or a size such as ``"10GiB"``; 0, the default, keeps them a= ll. + * **Improvements** =20 * qemu: Select the win-dmp format for Windows guest crash dumps diff --git a/src/qemu/libvirtd_qemu.aug b/src/qemu/libvirtd_qemu.aug index 311992e441..dbcbbb04c0 100644 --- a/src/qemu/libvirtd_qemu.aug +++ b/src/qemu/libvirtd_qemu.aug @@ -25,6 +25,9 @@ module Libvirtd_qemu =3D let unlimited_val =3D del /\"/ "\"" . store /unlimited/ . del /\"/ "\"" let limits_entry (kw:string) =3D [ key kw . value_sep . unlimited_val ]= | [ key kw . value_sep . int_val ] =20 + let bytes_val =3D del /\"/ "\"" . store /[0-9]+[a-zA-Z]+/ . del /\"/ "\= "" + let bytes_entry (kw:string) =3D [ key kw . value_sep . bytes_val ] | [ = key kw . value_sep . int_val ] + =20 (* Config entry grouped by function - same order as example config *) let default_tls_entry =3D str_entry "default_tls_x509_cert_dir" @@ -109,6 +112,7 @@ module Libvirtd_qemu =3D | str_entry "snapshot_image_format" | str_entry "auto_dump_path" | bool_entry "auto_dump_bypass_cache" + | bytes_entry "auto_dump_max_size" | bool_entry "auto_start_bypass_cache" | int_entry "auto_start_delay" | str_entry "auto_shutdown_try_save" diff --git a/src/qemu/qemu.conf.in b/src/qemu/qemu.conf.in index 97b0141cf6..de14db6cde 100644 --- a/src/qemu/qemu.conf.in +++ b/src/qemu/qemu.conf.in @@ -688,6 +688,23 @@ #auto_dump_bypass_cache =3D 0 =20 =20 +# Total size that auto-triggered dumps (from on_crash and watchdog +# handling) are allowed to occupy under auto_dump_path. After each new +# dump is written, the oldest dumps are removed until the total fits +# the quota again. The dump that was just written is never removed by +# this, even if it alone exceeds the quota. Only the dumps libvirt +# itself wrote are counted and removed. +# +# The value is a plain byte count, or a byte count followed by a unit +# suffix: bytes/b, KB/k/KiB, MB/M/MiB, GB/G/GiB, TB/T/TiB, PB/P/PiB, or +# EB/E/EiB (decimal 'B' suffixes scale by 1000, binary 'iB' suffixes, +# and their bare single-letter equivalents, scale by 1024). +# +# Defaults to 0, which disables the quota and keeps every dump forever. +# +#auto_dump_max_size =3D "10GiB" + + # When a domain is configured to be auto-started, enabling this flag # has the same effect as using the VIR_DOMAIN_START_BYPASS_CACHE flag # with the virDomainCreateWithFlags API. That is, the system will diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index e30b146634..6d67939b6e 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -748,6 +748,8 @@ virQEMUDriverConfigLoadSaveEntry(virQEMUDriverConfig *c= fg, return -1; if (virConfGetValueBool(conf, "auto_dump_bypass_cache", &cfg->autoDump= BypassCache) < 0) return -1; + if (virConfGetValueBytes(conf, "auto_dump_max_size", &cfg->autoDumpMax= Size) < 0) + return -1; if (virConfGetValueBool(conf, "auto_start_bypass_cache", &cfg->autoSta= rtBypassCache) < 0) return -1; if (virConfGetValueUInt(conf, "auto_start_delay", &cfg->autoStartDelay= MS) < 0) diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index 1d29f35c5d..9faf6db206 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -226,6 +226,7 @@ struct _virQEMUDriverConfig { =20 char *autoDumpPath; bool autoDumpBypassCache; + unsigned long long autoDumpMaxSize; bool autoStartBypassCache; unsigned int autoStartDelayMS; virDomainDriverAutoShutdownConfig autoShutdown; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 4766c39cbd..cb144407c4 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3560,6 +3560,134 @@ qemuDomainGetAutoDumpFormat(virDomainObj *vm) } =20 =20 +typedef struct _qemuAutoDumpFile qemuAutoDumpFile; +struct _qemuAutoDumpFile { + char *path; + unsigned long long size; + long long mtime; +}; + +static void +qemuAutoDumpFileFree(void *opaque) +{ + qemuAutoDumpFile *file =3D opaque; + + g_free(file->path); + g_free(file); +} + + +static gint +qemuAutoDumpFileCompare(gconstpointer a, + gconstpointer b) +{ + qemuAutoDumpFile *fa =3D *(qemuAutoDumpFile **) a; + qemuAutoDumpFile *fb =3D *(qemuAutoDumpFile **) b; + + return fa->mtime < fb->mtime ? -1 : fa->mtime > fb->mtime; +} + + +static bool +qemuIsAutoDumpFileName(const char *name) +{ + /* "-YYYY-MM-DD-HH:MM:SS" as built by getAutoDumpPath(), 'd' any digit= */ + static const char shape[] =3D "-dddd-dd-dd-dd:dd:dd"; + size_t shapelen =3D sizeof(shape) - 1; + size_t len =3D strlen(name); + const char *stamp; + size_t i; + + if (len <=3D shapelen) + return false; + + stamp =3D name + len - shapelen; + + for (i =3D 0; i < shapelen; i++) { + if (shape[i] =3D=3D 'd') { + if (!g_ascii_isdigit(stamp[i])) + return false; + } else if (stamp[i] !=3D shape[i]) { + return false; + } + } + + return true; +} + + +/* Removes the oldest dumps under autoDumpPath until the total size fits + * autoDumpMaxSize. KEEP (the dump just written) is never removed, even + * alone over quota: mtime alone can't protect it, since it is only + * second-granularity and ties with another dump written the same + * second would make the eviction order among them arbitrary. */ +static void +qemuPruneAutoDumpPath(virQEMUDriverConfig *cfg, + const char *keep) +{ + g_autoptr(DIR) dir =3D NULL; + struct dirent *entry; + g_autoptr(GPtrArray) files =3D NULL; + unsigned long long total =3D 0; + size_t i; + int rc; + + if (cfg->autoDumpMaxSize =3D=3D 0) + return; + + if (virDirOpenQuiet(&dir, cfg->autoDumpPath) < 0) + return; + + files =3D g_ptr_array_new_with_free_func(qemuAutoDumpFileFree); + + while ((rc =3D virDirRead(dir, &entry, NULL)) > 0) { + g_autofree char *path =3D g_strdup_printf("%s/%s", cfg->autoDumpPa= th, + entry->d_name); + GStatBuf sb; + qemuAutoDumpFile *file; + unsigned long long alloc; + + if (!qemuIsAutoDumpFileName(entry->d_name)) + continue; + + if (g_stat(path, &sb) < 0 || !S_ISREG(sb.st_mode)) + continue; + + alloc =3D (unsigned long long)sb.st_blocks * DEV_BSIZE; + total +=3D alloc; + + if (STREQ(path, keep)) + continue; + + file =3D g_new0(qemuAutoDumpFile, 1); + file->path =3D g_steal_pointer(&path); + file->size =3D alloc; + file->mtime =3D sb.st_mtime; + + g_ptr_array_add(files, file); + } + + if (rc < 0) + return; + + g_ptr_array_sort(files, qemuAutoDumpFileCompare); + + for (i =3D 0; i < files->len && total > cfg->autoDumpMaxSize; i++) { + qemuAutoDumpFile *file =3D g_ptr_array_index(files, i); + + if (unlink(file->path) < 0 && errno !=3D ENOENT) { + VIR_WARN("Failed to prune old dump %s: %s", + file->path, g_strerror(errno)); + continue; + } + + VIR_DEBUG("Pruned old dump %s to satisfy auto_dump_max_size quota", + file->path); + total -=3D file->size; + } +} + + static void processWatchdogEvent(virQEMUDriver *driver, virDomainObj *vm, @@ -3589,6 +3717,8 @@ processWatchdogEvent(virQEMUDriver *driver, qemuDomainGetAutoDumpFormat(vm))) < 0) virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("Dump failed")); + else + qemuPruneAutoDumpPath(cfg, dumpfile); =20 ret =3D qemuProcessStartCPUs(driver, vm, VIR_DOMAIN_RUNNING_UNPAUSED, @@ -3624,6 +3754,8 @@ doCoreDumpToAutoDumpPath(virQEMUDriver *driver, qemuDomainGetAutoDumpFormat(vm))) < 0) virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("Dump failed")); + else + qemuPruneAutoDumpPath(cfg, dumpfile); return ret; } =20 diff --git a/src/qemu/test_libvirtd_qemu.aug.in b/src/qemu/test_libvirtd_qe= mu.aug.in index c4cf9cf634..c97d8d7081 100644 --- a/src/qemu/test_libvirtd_qemu.aug.in +++ b/src/qemu/test_libvirtd_qemu.aug.in @@ -83,6 +83,7 @@ module Test_libvirtd_qemu =3D { "snapshot_image_format" =3D "raw" } { "auto_dump_path" =3D "/var/lib/libvirt/qemu/dump" } { "auto_dump_bypass_cache" =3D "0" } +{ "auto_dump_max_size" =3D "10GiB" } { "auto_start_bypass_cache" =3D "0" } { "auto_start_delay" =3D "0" } { "auto_shutdown_try_save" =3D "persistent" } --=20 2.53.0