From nobody Mon Aug 24 09:08:38 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=1786440735; cv=none; d=zohomail.com; s=zohoarc; b=C9DPIYQXJtUqOlWcygvjvuChiizc3H8P+maNUG5s5BWv9ZXlLjUTv+rSc2gKNcgTRqtHsSgnreejdIlYYqk23uwb4RZUILs5fmsxZDknDzIuLdHf1Wd4LYlKrbD1duYNZFe8gNLzEfja8/VmIylW/uuefAhb+DbQ7yUgMLuxTBI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786440735; 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=EZAoFaF9J79e4I4hKu/tWR1FbXifxCX1g9lFZwRKQ3Q=; b=TX4HKyHXnttzPBiy9HWB0VjNjmB5vPG7iUsBJXOYoUMFlzLoE8pxN2ZEkBwhkJ591h+yqWKuMuz54I/RAwZHeRwfpETbcMF2eiGPKVENNTbBOB+c28tLhqT2lQ7CDCjqsDVAZ4bMlmiTOMs3MXgOCFYpw1F6lquwMPGZDlQNm2A= 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 1786440735473543.3231983252188; Tue, 11 Aug 2026 02:32:15 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id B9F1E418A7; Tue, 11 Aug 2026 05:32:13 -0400 (EDT) Received: from [172.19.199.10] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id C60F8418F5; Tue, 11 Aug 2026 05:28:00 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id E48823F289; Tue, 11 Aug 2026 05:25:03 -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 DB75B3FA30 for ; Tue, 11 Aug 2026 05:25:02 -0400 (EDT) Received: by mail-wm1-x335.google.com with SMTP id 5b1f17b1804b1-4921eed3fa2so22088665e9.0 for ; Tue, 11 Aug 2026 02:25:02 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:c43:d230:7bbc:68d4]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49977e86b55sm47948365e9.4.2026.08.11.02.25.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Aug 2026 02:25:00 -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=1786440301; x=1787045101; 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=EZAoFaF9J79e4I4hKu/tWR1FbXifxCX1g9lFZwRKQ3Q=; b=B83xxLklGCFhCSSLuMdNqMYxaszbitUtAK4IICrhoFyVAGdribOfsD0Nlsfzqc0sYb XjroAO3ZzsvhjjoRZt2Jlm/H/Kx3dd2jelSOiRYXhZIBJBPdRZp7NIz8CL5kDwZjEynV y7G8kfpB3Rbv9+mdDWuKKO8yWubS+NA5NY5wbd9eOMCklyPSJTA+oiIC3aH8QBgtkpYh td6I4zwY6WA2/CYIb7FTTaNztKHyeYIOjKWqaRpeL1u7HkP9S4jvbqAWE/oTbmXBiNOx 2btTmEXKoZ4WPrHBc6Xijn+NGi8ys8JPzU8Kxl+mKi55g8ubPtq1p60AMbe2JfloGjuV WbLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786440301; x=1787045101; 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=EZAoFaF9J79e4I4hKu/tWR1FbXifxCX1g9lFZwRKQ3Q=; b=s6uBiPAO0JBSkDDn5i8ky/yWD2wcv8gMituH2E2hzckyXyCYERIagFtrsRATWcd7v8 oAZ9FrSKA2dPF7h6EWWpsD6XRzg/d/vwH3ajzvBARYjrIAxAem1swo0xu3cSUaYw3Pwt 8FuO9Q38zidrbMuEzeao00PTwYqvXNyMmIoUbyv/KCAP98rztLFmzpKwi/hp6dspyl09 nr5hwiWE+j65cvOPRjL7zTp+ELFp8UKQCNFhf4I5k7AzIOBNtq7x/etYc/kEMIVoYnXC zigzrsd3nFHA+rDRsAslPHuY8lhg/u0s5kXAm1vskhLD7tGoepMcTXd4+zCTSaUnqCeD 3K0g== X-Gm-Message-State: AOJu0YzC4ZVX+Kp7jzDWNcXxyoBk2YBdYVFrdwm/zf8w111qxz/ywNR6 ZFS8djymHaZzqb0rYoAm/7ObDDS94EzTDcM3kn60ZQJcKDeQJ+yUjcJri0qZhxqChfYEMvXY65P t5wMt X-Gm-Gg: AR+sD10i7pO7tCcyZXoseiwzss+TcMB2ap5tt4yjpsQmpdoIZ4rsAsPamaK9IOfIjNJ 4Sx5w1kDKEgFM15CSt/N2iMFVrndeUfcOpPCr7Q8dvzeNjrOBFnXEVoBzHMD4meDs/DCOD07Ckl NpJIRw/1Ta6DDHxPA7woGOMV/JtjNuM9ey7+vXU15GAk7PsZAm0JIDw30DoI9gB/W9ZXpXhB16+ IiHwgVW2AreH9noVnuvp0DauBjiEgEZb5NMmJGshEBf4MyJC46R653YpwmCDEh9bwq0UQTEBt3+ L+NAxxK/zydwMxWv+vpmpBHyFnVDQdsggA16b20ust06L3RIy39yvCFkY2MxAlM6jWTgOIIR6OO FSSqbsokF7Q5D0iVR6j/dG0sE4pkyucJxS/NyX4Kg4ax5tRUl9k78yxZmcIGOARB9yBJAZnFLAl h7wpqt8hmwNwxM6Z1eW1vjx7g/72y+rtenGajLc+m9HqqGhN1VdEYaDx+s X-Received: by 2002:a05:600c:8b85:b0:497:fecd:5b00 with SMTP id 5b1f17b1804b1-49978444633mr35438745e9.9.1786440301562; Tue, 11 Aug 2026 02:25:01 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH v2 1/5] qemu: add capability for guest-aware win-dmp availability Date: Tue, 11 Aug 2026 11:24:53 +0200 Message-ID: <20260811092457.3478292-2-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260811092457.3478292-1-den@openvz.org> References: <20260811092457.3478292-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: KNZLOAEJ4TBNTRADZ3G2U72Z2KGVYA2K X-Message-ID-Hash: KNZLOAEJ4TBNTRADZ3G2U72Z2KGVYA2K X-Mailman-Approved-At: Tue, 11 Aug 2026 09:27:35 +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: 1786440739120158500 Content-Type: text/plain; charset="utf-8" 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 --- src/qemu/qemu_capabilities.c | 4 ++++ src/qemu/qemu_capabilities.h | 3 +++ tests/qemucapabilitiesdata/caps_11.1.0_aarch64.replies | 5 ++++- tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_11.1.0_x86_64.replies | 5 ++++- tests/qemucapabilitiesdata/caps_11.1.0_x86_64.xml | 1 + tests/qemumonitorjsontest.c | 3 +++ 7 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 6abb179951..e8ccc286b0 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -771,6 +771,9 @@ VIR_ENUM_IMPL(virQEMUCaps, "arm-smmuv3", /* QEMU_CAPS_DEVICE_ARM_SMMUV3 */ "arm-smmuv3.smmu_per_bus", /* QEMU_CAPS_ARM_SMMUV3_SMMU_PER_= BUS */ "arm-smmuv3.accel", /* QEMU_CAPS_ARM_SMMUV3_ACCEL */ + + /* 500 */ + "win-dmp.guest-aware", /* QEMU_CAPS_WIN_DMP_GUEST_AWARE */ ); =20 =20 @@ -1669,6 +1672,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 4563e15156..9adbf964ce 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -746,6 +746,9 @@ typedef enum { /* virQEMUCapsFlags grouping marker for = syntax-check */ QEMU_CAPS_ARM_SMMUV3_SMMU_PER_BUS, /* arm-smmuv3.smmu_per_bus */ QEMU_CAPS_ARM_SMMUV3_ACCEL, /* arm-smmuv3.accel */ =20 + /* 500 */ + QEMU_CAPS_WIN_DMP_GUEST_AWARE, /* 'win-dmp' is offered only to a guest= that can use it */ + QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; =20 diff --git a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.replies b/tests= /qemucapabilitiesdata/caps_11.1.0_aarch64.replies index 921e667f27..45a26dce00 100644 --- a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.replies +++ b/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.replies @@ -12624,7 +12624,10 @@ "name": "kdump-raw-snappy" }, { - "name": "win-dmp" + "name": "win-dmp", + "features": [ + "allowed-by-guest" + ] } ], "meta-type": "enum", diff --git a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml b/tests/qem= ucapabilitiesdata/caps_11.1.0_aarch64.xml index e53ad1d461..409757b5c5 100644 --- a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml @@ -191,6 +191,7 @@ + 11000090 61700287 v11.1.0-rc0 diff --git a/tests/qemucapabilitiesdata/caps_11.1.0_x86_64.replies b/tests/= qemucapabilitiesdata/caps_11.1.0_x86_64.replies index 06be0418ca..a747db1236 100644 --- a/tests/qemucapabilitiesdata/caps_11.1.0_x86_64.replies +++ b/tests/qemucapabilitiesdata/caps_11.1.0_x86_64.replies @@ -12769,7 +12769,10 @@ "name": "kdump-raw-snappy" }, { - "name": "win-dmp" + "name": "win-dmp", + "features": [ + "allowed-by-guest" + ] } ], "meta-type": "enum", diff --git a/tests/qemucapabilitiesdata/caps_11.1.0_x86_64.xml b/tests/qemu= capabilitiesdata/caps_11.1.0_x86_64.xml index e32cedca2f..58dfaff779 100644 --- a/tests/qemucapabilitiesdata/caps_11.1.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_11.1.0_x86_64.xml @@ -222,6 +222,7 @@ + 11000090 43100287 v11.1.0-rc0 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 Aug 24 09:08:38 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=1786440806; cv=none; d=zohomail.com; s=zohoarc; b=Su1+PC+EceEMMnd5KXsZJXQ+tXKw86AZHPkWZNt9QQWgkhrylVEsnnDX7C6FNMnYz2CNUKhAHIAlSLHKDM0L9Ijfj01rT//EHk2T/8XOpoFhaA44S8GQ3KCIxVNDMmlJE91o5xuIakhBk3NWjVRDbXAVV1S6sJPTXSx7DyLcatY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786440806; 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=ySa24Uy1o5X9kSbP2qOAppsVE1bfeclelGUQzLHpjHc=; b=a8hmEXexNb6wGAwGmw6clvya0hdZtuMdOrKF6WyVhQBz2+Vhv+BE+cknDMvLE1a2CC3QUpHYj9kKr8vK0zTOQeEOhpBvy1gZO7jSunpW1AUTIAR2BmRlvxfJ+gsBIanHNxzBYpffZG8FEAVxPkpqxoBPb0Gbt6AL5M3Cy+ViD1c= 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 1786440806921174.16626822357932; Tue, 11 Aug 2026 02:33:26 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 9C18141908; Tue, 11 Aug 2026 05:33:25 -0400 (EDT) Received: from [172.19.199.10] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id E25A541B60; Tue, 11 Aug 2026 05:28:06 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id F11F63F96A; Tue, 11 Aug 2026 05:25:04 -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 298083F289 for ; Tue, 11 Aug 2026 05:25:04 -0400 (EDT) Received: by mail-wm1-x335.google.com with SMTP id 5b1f17b1804b1-4954f5e8020so14490895e9.2 for ; Tue, 11 Aug 2026 02:25:04 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:c43:d230:7bbc:68d4]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49977e86b55sm47948365e9.4.2026.08.11.02.25.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Aug 2026 02:25:02 -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=1786440303; x=1787045103; 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=ySa24Uy1o5X9kSbP2qOAppsVE1bfeclelGUQzLHpjHc=; b=VdgTv1ND6WB5dgx1opcW4xuKcfWhFEFoV/bOEHV5d7wjv73kOXHZnT6GfOxMsqvLAH n504kf5f+ZTkLk/eLc53cpI9BdyzzcsQpXHxjTvwKdQEu/yrOuciSeUYp8/qeoOtjIIa NNlbiaBefuJQTkao4XquiX5fktqsJYMKJWlcLU7sIYVpM4c84lRwT6slEHuGTcitpthG uLbPa7qGenqn1Og8ghu5aurPxReMMCFrFp9VeXrMWv2ANtSNLAJ83+IVP7JW6yVsPaoU jJT8t53nDkegZ/urCZCioLEbtmgBtXM+6vrcv2kdk4fA7KAxioPE62Ihm2y3IkoOd0Pd 4kKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786440303; x=1787045103; 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=ySa24Uy1o5X9kSbP2qOAppsVE1bfeclelGUQzLHpjHc=; b=W0cHQ6xN9nhc4ebi/NISGyUQVwZEQPM1diNDmWCOpNzutZOJT4z91Gw+Odz8Q2OwzD naZMxsYLu7t0gHZMSgAczDFshhcJyidf4sX7wHiNt4xRNENrTL082WZM0wwsbagNxUs2 t+kHVcNl9lYNhc94gs/j7o8VhDZEBYL8xKIvTCmQDPUzSXzCZUvNeW04N8XWu/3DZMX+ /h0Cb3RpjoVS5BRb7h8Qvr/rL3xYxvL1pVXcJpFvoDu37v+HVqcLjHlniWTZrUkqAPQc oM4JHToptfJ1T25yKGmma5KsEZyCGrZi5MQbzXCog33BtrEf7glOCkbYRvTw2LTd4YbL lPqA== X-Gm-Message-State: AOJu0Yxy8UPKWB69xLwV1LFluFuZ9ywmgjmMmFuqScKpGO4lqxvWuN7S VqKvc6N1qDkvI3kSK9WSOcXgH2DrcuEjZaseO33JfssI4+S5yfpC7mSS4mf7dtkV5Rod0496ibC dE+hi X-Gm-Gg: AR+sD10U0gdjuGGMtafFebqTDy0tLUvX3vLHxduX/20yX8qGDuNrQK8kXzaL9Wbv7+c 1EnkFCXmJAeFdUdyhT9sFGxygWtpHooDuxbze0IwLrNv+LzxQqnKhEhMya7MMlKREWozYccilH1 xrZdH5MJWP4CbqL33JvfVfrj45wGAzSyC5tgxacDZbfjgNAdZ6gxRrhSzPHXm3gCe5DBK3bBNzR 5P3H9szN+uCgRwTLRd1QwCVOEMdC1z268grDJYZG/I44M2GryghdrD6GYFeMHSyXmIr7V/VQOFy elkOVjIQZDe1VgRMV4p0gCOuxEotCPOIfQuFzFIGZohDegY4RqzhsBmDZ3yJ8VbKpg/yPUuqc/r uiMjVz00krveZaxBvfbZ14myT5tEb6oYqSKg4eStbYtV9K+MzH0mVyFNN6ox6zLR5vQsKRrJWsh hG2rwaG2pgdr+CZxTkfFFfS3ExVMAWDoU42PMNozjdptZdFV/VGNRbht8IqhgunCSm/LA= X-Received: by 2002:a05:600c:3553:b0:499:7312:2d5f with SMTP id 5b1f17b1804b1-49978494c8cmr24574255e9.19.1786440302944; Tue, 11 Aug 2026 02:25:02 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH v2 2/5] qemu: auto-select win-dmp for crash- and watchdog-triggered dumps Date: Tue, 11 Aug 2026 11:24:54 +0200 Message-ID: <20260811092457.3478292-3-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260811092457.3478292-1-den@openvz.org> References: <20260811092457.3478292-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: ZYB5SGU2T4NVXUGS4P36HS4DFFHQ6TIK X-Message-ID-Hash: ZYB5SGU2T4NVXUGS4P36HS4DFFHQ6TIK X-Mailman-Approved-At: Tue, 11 Aug 2026 09:27:35 +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: 1786440808021158500 Content-Type: text/plain; charset="utf-8" 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 --- 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 ae4d8c18a5..3dadb6d4f3 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -19,6 +19,13 @@ v12.7.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 44b41726fb..cfabaf0746 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 Aug 24 09:08:38 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=1786440904; cv=none; d=zohomail.com; s=zohoarc; b=cJHckqGAucoRWUwK88Wmb6qpBTyQCkk/dAdnq5FIJUXPrw6lyBBmURarNCFgsR7cEgDq1Zdp2lqP1GA2FEKT6NBlRarXfS6oay2jZIiMG26Mx3K4FXoEU4bzRBB6oIo05Nhi1wHajdRpFgRty7NN/y7VOYAO0LZ4E1d5VQaamwo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786440904; 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=EY2+p6bU2Tp+ZPzCEk5EhLKlEE9GRGUVaO3fPGeefo8=; b=mWl+rmJrrI+aiwp44GX32uOg6lnWOVXfiSYYbAUAxv3d2pqF38Wy3dM0SI+R5H8a5xLIa16Tmz/PJC11IpuH3wsdL7cughdrJP6Teg+6RM4mFJRGJPSVP1eyNa/yyyneDnszLuIYJJZXn+JOPA4mtxOepr8MEmWv+7Z+4NmNPvY= 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 1786440904032107.89612555925157; Tue, 11 Aug 2026 02:35:04 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 887A63F8B1; Tue, 11 Aug 2026 05:35:02 -0400 (EDT) Received: from [172.19.199.10] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 852AE41BAB; Tue, 11 Aug 2026 05:28:11 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id B7F4B3F965; Tue, 11 Aug 2026 05:25:06 -0400 (EDT) Received: from mail-wm1-x32e.google.com (mail-wm1-x32e.google.com [IPv6:2a00:1450:4864:20::32e]) (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 6B4B83F965 for ; Tue, 11 Aug 2026 05:25:05 -0400 (EDT) Received: by mail-wm1-x32e.google.com with SMTP id 5b1f17b1804b1-49802c418b5so27205095e9.1 for ; Tue, 11 Aug 2026 02:25:05 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:c43:d230:7bbc:68d4]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49977e86b55sm47948365e9.4.2026.08.11.02.25.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Aug 2026 02:25:03 -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=1786440304; x=1787045104; 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=EY2+p6bU2Tp+ZPzCEk5EhLKlEE9GRGUVaO3fPGeefo8=; b=CvZweb3e4H2y83j0eNYaE6K36L8K04c8guQaCyN+1fcZtQZ/SzNgEe5DXHHEQDaurW 4joXikb5RYcJvFhqLIXigEORo3lLt2cvuPcDkihvbDNTAfDz08b7cOiZWJkdPemrDN5l x/iYxNAR3hMabwkhbkqvdmgJOti7RNN5+cYdxuhMc6Q7jxBEZsvODxXF2v927WUVVibz Lt2O4aOx/hbXq2mvze3e4GsPAnmbzv+AkaDxoJl5iHeqTjXZf7B7MxEWOtct79bkAgS+ Y6uYBlLFYl2TRJU5DZLyAYpHkyws6kneEeqA3Wi4QU39t2O0K7foz2BONGSom1WX7Dxi MZaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786440304; x=1787045104; 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=EY2+p6bU2Tp+ZPzCEk5EhLKlEE9GRGUVaO3fPGeefo8=; b=TSJBDYHsBBrbkcUFuyT4XB1D6c2de6ehOwFf1XRHH1DiRs6kfWrEbyOlh5v6B+djjq 6nOGCRyn8U4yFPoQNxH0xJvh/nUfGpSO/bugKYLxldrHOfxlYeStlDIkJ2o80lY1IDfj LQr8KQ89gZF4qce5ICYUFvZLdLeE8yrtO94Znug+6hxVGIMdktRnzcNeGCS35tPYdlH+ FXrjXkJrlCjPOuKdQwHegzpkoBor6JQ5AmhoIWDix1jHrGsu/+g/zpIeOpSByj8tac9B UcBrlobMJIY2EZcvtWYE4sjFoL/zyKSKZxwrWXsAJnIDm1wbudHkGfbXKvXkXIG7v4kL rAdg== X-Gm-Message-State: AOJu0YwBMr3T4Uh1/ja7H7jYpEboCbZ+GMfmN9+vo25bYkDfY/yKjXT0 +vl2V4U07a2u7u14CoyGdtxKzmljQVnPxZqCVVMxZZvkYodW1PtxZUGbogBW1pPgAWAZILmEy1K 2raq2 X-Gm-Gg: AR+sD10N7nelPlswLSK9CWcxgGrrhg/J0aaENpKigk0gODwalHNQAIq6cbrQUrjSnmh sj06cxeT8gXX4wWxorEmfDRporkxULUW5Ff5pxbZrkGtpq28WNY9pVN2WsdQxmIKKlOykw1XXKz xohTNPzTFU9zP8DZbdNiQhYrekTgJ9R/rfTNPBqS5x+cxRLZ2ClPE9q4Nb1uMHmXj5f4RlNASOs mHzUxDlCHV6KxCRN87+mr4ToOASY73zyIEc9NhTd1K8F0wJNdJ2yzNoO+q9atpbCu9fb8uCevvd A6MgkIx6UbO6rYsukYp8I/qhJSu2JgxuxQsuxK69tGX7kV1+0yxZMDCjPygdFDrjiXdu12bD5mq H0/cV0eL2a0NdBtW6U6FGMFI4y6wITt28LF684Lzo5CpWanzAUcnvKG87Vor0caWL1JOnQabHkV q+BgCLxtSjBXISI2AQ6wUzbhLBmWlHjxgRdVLjN/NfGikuKZlOGQoBdgM9d1/sS5En8Ds= X-Received: by 2002:a05:600c:8595:b0:499:4d4d:822a with SMTP id 5b1f17b1804b1-4997847d2dcmr30344565e9.17.1786440304171; Tue, 11 Aug 2026 02:25:04 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH v2 3/5] util: add virStrToBytes() and virConfGetValueBytes() for scaled sizes Date: Tue, 11 Aug 2026 11:24:55 +0200 Message-ID: <20260811092457.3478292-4-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260811092457.3478292-1-den@openvz.org> References: <20260811092457.3478292-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: P53TLG65QO42QPCAFKMFQLJJWBTP3FHO X-Message-ID-Hash: P53TLG65QO42QPCAFKMFQLJJWBTP3FHO X-Mailman-Approved-At: Tue, 11 Aug 2026 09:27:35 +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: 1786440907281158500 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 c76e5cb08a..a1d42e93dd 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2276,6 +2276,7 @@ virConfFree; virConfFreeValue; virConfGetValue; virConfGetValueBool; +virConfGetValueBytes; virConfGetValueInt; virConfGetValueLLong; virConfGetValueSizeT; @@ -3557,6 +3558,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 Aug 24 09:08:38 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=1786441014; cv=none; d=zohomail.com; s=zohoarc; b=K4LZ4bi7g0j0DSF8imWYkCkA4oBlyKrydI7qxJRNSV9Iob2pivvQGAVaBIsjQnDNKsUYXvPwwzjXCmMY54MbMha6FMVVkfhMHdSdVZTPtA5Pq5J5z5Gcgs8vnAXKb9xX7laWjCVQy9sAgcS9C7bPa0bsvLPLhuWDcGBOF5diGlc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786441014; 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=2bcPsHz1YfhZXI4Pr+pJbI7G6GlyekI8d+jJEEAZdAU=; b=DDru/fxP1WDmovhEfOhEiAWWFJIS4ATqP3exuAKD6m3qoK0MXSWTi4A4sS2K8kpQv8F1jA+7tS7Uo8EJ/vJOELNzDk8RTQvglySSR4fNpE7vtqdZwtuOdiKnwLF4l6bOSesO/SE/fkC2ELwRvoH6Fr1pv23VEw8k1K2Oml5eMbg= 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 1786441014750933.0364651056943; Tue, 11 Aug 2026 02:36:54 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 2824841929; Tue, 11 Aug 2026 05:36:53 -0400 (EDT) Received: from [172.19.199.10] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id ACD2641C24; Tue, 11 Aug 2026 05:28:17 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 9BF013F965; Tue, 11 Aug 2026 05:25:07 -0400 (EDT) Received: from mail-wm1-x32f.google.com (mail-wm1-x32f.google.com [IPv6:2a00:1450:4864:20::32f]) (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 B44893F97E for ; Tue, 11 Aug 2026 05:25:06 -0400 (EDT) Received: by mail-wm1-x32f.google.com with SMTP id 5b1f17b1804b1-4956869750eso18786075e9.2 for ; Tue, 11 Aug 2026 02:25:06 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:c43:d230:7bbc:68d4]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49977e86b55sm47948365e9.4.2026.08.11.02.25.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Aug 2026 02:25:04 -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=1786440305; x=1787045105; 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=2bcPsHz1YfhZXI4Pr+pJbI7G6GlyekI8d+jJEEAZdAU=; b=PL5pGYnJoMOVKUbA6fOuB1XShF091zm2q0GywqKMez2NRpOYCfydydhIV3IUzuete/ pMAV4K/JUft9QNSzmlpVlCR8yr9hRhf/0DoRi9YSbH8dFGb5KSvzbJvGcv9mhQWp6TYk xnDpkMqws/s+OD7bHQuR461zO8zf7cFVB1hc2vVUH5Y3CR1lIv0buI1ywj7oaabIUPEw kTGFORWK2DXtUOzjqGszRRYrHK0i63kS831eTsNoeVkdqwpXFldapwlI6JtK8R3w3LDV K6/bOopcXwctIVVs5TO74Yei7DvLjXz9Z8jinWhXA0AortlIhQkY7aEngSt5+Dwr+SIJ obvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786440305; x=1787045105; 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=2bcPsHz1YfhZXI4Pr+pJbI7G6GlyekI8d+jJEEAZdAU=; b=npEE6Pc+1uUnV6ajeApkAP/ucirEXCtEsPL8CAZbuwcck+Pc3yNr2gZLCqSghlZUhe ym4qBQCBOrqwf1LQL5UB5uwOZl/YY7b3oYp7xEgrcNfU+wVj1XQ+YFPIi95XyyfYqKZr Z6bpqMwyTKqAJLE9N9qP3wfEJtW9LnXGH0ow60wC0Cbu7IEBG6r+MyiuoYlCHBzAvHDU DLQSp2qlSKnmlGs0/MISsI8RTy5s/diTQHdw13l421ime4VvUWLXdpHYYAj/N5+zv8Pc pY/YLq5uvXKvZ/OpbsY28KGi5P/C0xP3lCgnG8ko/3NG+PJAz05D8aMjfzZpqt/Fx1e3 du9Q== X-Gm-Message-State: AOJu0YxWxgN45N7WZdj7ryf4saxN0p3Kul1myZwX+dNUHDxqNwiOAmE3 /vHdKcpeUyFtbV2cuaMI89rD417ueHr8jDFM1e5dx8pM9AdnJjuYgVWP5xm8uGeT71h2lHnqYHZ qchN5 X-Gm-Gg: AR+sD12Tp3rNPbNwXD91eNzKS4K7NA3b9IqmNgYysBJ/jldKxLTNZLfeDR4RWQrJbc2 Kp1QkWxQxtP1bCoWiLcuyHr4V4ueBehd+J0vvdNgb1SUolzbJceeMBW7ftEqJr054Je1HCDrL8b pqmdqb6iwX8wPXjMrZ0MhC26N2jI6DnMPFnhPhrl3E1uKwDNQm3u2HCZK+GsFLfcOJqB0ajZyf0 rwVbDmosRCjS6GMmOrKDAfcbfaGm7/87dN7Fe3Xuqaz9U0l5NdWLblhZt0fmdLyLpOnn0sMJYDg JN2NeGNiwDLMGojkEwDQUcf4nxvMDesNUunGoxxBvjhwpk3BJsqeWSeyP2HymEcjRk18QAOXi2E GXD1gP5Q2MJGItyruCxof/6V746L/8TV1CUSZ00NOO7RUA62WAtoETV9h17z2hE5waCRxmyFKwH gRWVRf9LFGPh70/3bDxU8ceFDGy7lUj/Z4mqaBLNR5o7sy6oRrWdFYhomhhg== X-Received: by 2002:a05:600c:4683:b0:499:5210:c537 with SMTP id 5b1f17b1804b1-4997842c1efmr29395285e9.1.1786440305433; Tue, 11 Aug 2026 02:25:05 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH v2 4/5] logging: accept a unit suffix in virtlogd's max_size Date: Tue, 11 Aug 2026 11:24:56 +0200 Message-ID: <20260811092457.3478292-5-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260811092457.3478292-1-den@openvz.org> References: <20260811092457.3478292-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: PBD3T22HY662NIVEIFLCSBZA4Q3HNUY6 X-Message-ID-Hash: PBD3T22HY662NIVEIFLCSBZA4Q3HNUY6 X-Mailman-Approved-At: Tue, 11 Aug 2026 09:27:35 +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: 1786441016676158500 Content-Type: text/plain; charset="utf-8" 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 --- 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 3dadb6d4f3..800a69b943 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -26,6 +26,11 @@ v12.7.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 Aug 24 09:08:38 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=1786441139; cv=none; d=zohomail.com; s=zohoarc; b=SZ6nCu7uLiRCEzHEVnZ8CX1HdxPj6YXxJorvbv4PkJ8KWos3eUfxpgJ3P2d1mGZjN960A84SIgKOB1sWNb0WG28WnMLDzNmW3YQ3SnQtPyj8XN/0GgIphUMMVoHaaN36I0w2EJNvrvvnpmUaG0JmP5GDCzXypvZ/P0tvKtj4o70= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786441139; 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=upQSAUMbbpE+n9FNg7kQlImA1DEFFea0ahD6gTqeNoQ=; b=g+KJcGJ58SVbc6158tdTC7sNr7OC/1K6PYMfWuDgQpuU4ZFoLJRZaEtqmUPtJHlyYNfe50XUwzSZaleodJZRIMR5NYKfvCBAMGgyt68WaykEOHoaXLh8GgH0BcoWcFGRV+hI2r7OvtRzyzq3cptSgOGFgXBcFuq7mRMUh2Io4BQ= 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 1786441139809366.78971808094855; Tue, 11 Aug 2026 02:38:59 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 403D93F89C; Tue, 11 Aug 2026 05:38:58 -0400 (EDT) Received: from [172.19.199.10] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 33D0A41C98; Tue, 11 Aug 2026 05:28:22 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id B6CAD4184C; Tue, 11 Aug 2026 05:25:10 -0400 (EDT) Received: from mail-wr1-x433.google.com (mail-wr1-x433.google.com [IPv6:2a00:1450:4864:20::433]) (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 C61603F965 for ; Tue, 11 Aug 2026 05:25:07 -0400 (EDT) Received: by mail-wr1-x433.google.com with SMTP id ffacd0b85a97d-4813ea321cdso527873f8f.1 for ; Tue, 11 Aug 2026 02:25:07 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:c43:d230:7bbc:68d4]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49977e86b55sm47948365e9.4.2026.08.11.02.25.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Aug 2026 02:25:06 -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=1786440306; x=1787045106; 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=upQSAUMbbpE+n9FNg7kQlImA1DEFFea0ahD6gTqeNoQ=; b=tU5FLOnZcJUeQdm/kPgLlT+GvhliYQK+JLFm1i9IE9VKAuKs7ZWJLORM9qK16azU2J B7MUcDtG6zo3I1GmjSIYJiOmgF2AZSABzt15GkA34OIZINKdqbtZwamJyqKmxG6ejkhR 5e4MbfSxBrxMezAfK9mWUz2M6yOluALRm/1HD580Re4ESNOppRaN3zLNnjHrensDGdFY sHm5phYEXeqEXPUyLsyeJ8XHOggSppf/V7ao1Ab+l448S5kAYGTB73PyLuiZUAm49ryF dP1F/uewVLT2nbBbK/amtWCSOvpa9UyQgSgUby6mtAWMfV9nfxOD0XqeHAkxX92KLrAr FJkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786440306; x=1787045106; 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=upQSAUMbbpE+n9FNg7kQlImA1DEFFea0ahD6gTqeNoQ=; b=TPyUtaw4AwMo1g+n0rco0YO9oyB1Boz+qW2l+80xza1PIlf79+bNj9SDxTTrpZttiq 4NN0/KddoCA/Wf3nuesrALem4/z8yF59VG+wcO8S13Rk1B1duR0gwfcfPu7NGwvBEMpv p44oR1sWQuTf8bLBHb/HaS6Wsl+U2724sVH0Ed1YlrQ9WTVEcTahOJ0DRQRMlxcow6Nj 8x9i7Ttlju5UjoWBnOsACQkxZlsrBvrCrTI3ZrDzSwpytmnJNmGupuvztadSY0SuCtTv ttjwYTX6oGIPc4IKZjbB2vJ7V+rAJJBccnpP12zRA0422zw0lgLRaUcrW+lWQFohQlcW xSKA== X-Gm-Message-State: AOJu0YxqvaVIVyiYTVo+P0R+AyjEPmjZzgdctfWDDe2Ce+3K/BGzEEEO 8bqTQwK7VvUjI1KbWeegMc8YF6pbolAtUlOVr4vQZqiPAmCQVpJBGFpZShcypgCerJjjxvRO/z1 oX9EA X-Gm-Gg: AR+sD12wd8D8Bq0ySVbZ7wGgFZyOsabt+tDqhzOBr80hwjoEkNbOeYXDaI8brKpzVTp Pa4gdOw3DJRQ4i1cKTD7tD37pFZD0lHCtvS+JSuPdkeU/F0s3h7tFzy2BhxKXmVQ9GzYNSKvZ2y ldH7TLVv80m1DR+J33VdkMZAGrzmuir/A+nGATFyEDjPtUhXFx/Aki0+Jo0oJfKNXJ7dDvIQEUX dOp/1PYZyN7sQ132dC/mBZy1CVP155YIBxgv/2gIuQg3QQrxKBFtSi9BRRWFsqCbOYihXQlPuKb nr4CsFou+0mQ8OIgqNxDqMreLxBDGYt/mzOkSsUXr9d7XaDpvsa+T69F1Ilj2oSia4z8TpVrTab 1k1e34vqHpUP0tM+sMrmt32eJ0GCrM1ppYEZygmL735xIxoxqCVmjbcyCXY1nmXoBsqeUB7B6bO pmqp9szaaYTZUGXQMfzZ07KXXY/efvAkpFKVwG4HM/nSSlfiffLzKfIUyd X-Received: by 2002:a05:600c:470d:b0:499:77ba:4b6 with SMTP id 5b1f17b1804b1-49978f0c4d1mr22354455e9.9.1786440306482; Tue, 11 Aug 2026 02:25:06 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH v2 5/5] qemu: cap total size of auto-triggered dumps under auto_dump_path Date: Tue, 11 Aug 2026 11:24:57 +0200 Message-ID: <20260811092457.3478292-6-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260811092457.3478292-1-den@openvz.org> References: <20260811092457.3478292-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: GYKG7URAEAMD7ORONW22BL7C7BKVI7GO X-Message-ID-Hash: GYKG7URAEAMD7ORONW22BL7C7BKVI7GO X-Mailman-Approved-At: Tue, 11 Aug 2026 09:27:36 +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: 1786441142182158500 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 --- 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 | 130 +++++++++++++++++++++++++++++ src/qemu/test_libvirtd_qemu.aug.in | 1 + 7 files changed, 162 insertions(+) diff --git a/NEWS.rst b/NEWS.rst index 800a69b943..5bdf8ce2ee 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -17,6 +17,13 @@ v12.7.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 cfabaf0746..41c454bb7d 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3560,6 +3560,132 @@ 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; + + if (!qemuIsAutoDumpFileName(entry->d_name)) + continue; + + if (g_stat(path, &sb) < 0 || !S_ISREG(sb.st_mode)) + continue; + + total +=3D sb.st_size; + + if (STREQ(path, keep)) + continue; + + file =3D g_new0(qemuAutoDumpFile, 1); + file->path =3D g_steal_pointer(&path); + file->size =3D sb.st_size; + 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 +3715,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 +3752,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