From nobody Tue Jul 14 21:18:55 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=1783414740; cv=none; d=zohomail.com; s=zohoarc; b=YO3cBuPDgDDR+b9rREqaP3lXaI+ckCs2yBjnFjGDbz/+XvYfOMldcclv/IN5+T2p+j8vwUzs5D6Rn4BDrnoA59Qd9XdNPGV8/sf76ZA8TfgJt4DNoGq8XjmNFL6MBOzCUatzrmSRivVLiVxGfkzQt4UG/RTGh3pdcSF1V14mwhE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1783414740; 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=IfTo7SpzRwo7Ij3X7fPmKNQBtPX7pVrJPFhkaB6whoc=; b=F3rUc7duZRrv15cYhO2XwWDrtxbyDwpsMioctsIrja90omcsnbPy233mhz4VtEVl5MzDYlLYepgkWyl3akkd9NvbD7xSioIX0W6rafDJCJ0k1V7wXdw3VZZjfLGxEu/SKmExV/muMJmVPbfQ6z6DIa3zcStmvAXsSMZgHiSTlEY= 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 178341474000863.91402515213122; Tue, 7 Jul 2026 01:59:00 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 94E3641D18; Tue, 7 Jul 2026 04:58:58 -0400 (EDT) Received: from [172.19.199.7] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 4E82B43E83; Tue, 7 Jul 2026 04:49:26 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 73B13419D2; Tue, 7 Jul 2026 03:48:29 -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 B434A419CF for ; Tue, 7 Jul 2026 03:48:28 -0400 (EDT) Received: by mail-wm1-x335.google.com with SMTP id 5b1f17b1804b1-490cf322ed0so24662735e9.1 for ; Tue, 07 Jul 2026 00:48:28 -0700 (PDT) Received: from athena ([2a06:5b06:b600:300:6c3a:5ec:1370:4f95]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-493e0f294a6sm72882595e9.1.2026.07.07.00.48.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Jul 2026 00:48:26 -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=1783410507; x=1784015307; 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=IfTo7SpzRwo7Ij3X7fPmKNQBtPX7pVrJPFhkaB6whoc=; b=AiiaoDK+dnggFl4F0sZKE82mzjeTwzPPwUN8cQzHoDCsPGi1Tcb9UejKPhIXsaa7iv WRTOUIwKKa6W/F5T5hQ+1aCqoYjMMQ9zriXkchr9ZOpzteuKU8gS6dOHd7Ap+71uzRxI ErFr3eRsdrd63s4oTky84rmzcqNxE53iGK2F3o2/qcXJ7Ny2JlIqvF1AkrIp1B3nO240 tvYHFBJbQuwSDvpqqfZUrApiS3XfucnqSz88YDxPbIYPdX3uUx3m3NSFp+CA+Iq+QGfF xltha2ogrJAMIYExC6svjZEcrMZ2irsFXMSOcI3wzAGzTOIfLqXsWkXqXCczQJxCmS1+ 24EA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783410507; x=1784015307; 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=IfTo7SpzRwo7Ij3X7fPmKNQBtPX7pVrJPFhkaB6whoc=; b=Cv3ICGRk6O20EQT1hezZPo8zxyzKQ1gQod4A1dv3jIMnodxMBfUKcoEgyGVe1THbUt bJ8Ucx3HtSorSG2Ux5LmC6NvyQ33KCtHS1+1VrFtFje3y6jEyAdNQZ3rIJgG5ONIXrrs 1GpJQGnyqexrbUEqDdHZu/e5Hb1Dmwq0oy5+l+5Z6HqeIh2OVw9QZ47P97oXVrQzXw0Z PM4fGUYI8nExR50ttD/plUrmRv3OGsTf6dG9GV7d2xoW3/hthIwxm/bG/AwftcHJjJL3 xIxD8Uja+OtJE0gr5TRo8pKLIKb/p46gEQ5jIEu5j3DYoxIcTFsRqkXUkLJsGUtZm63+ lcBw== X-Gm-Message-State: AOJu0YzE84/21iv38kvFfPp6Gf05hA2SRWn40SRwHJv5qCB3u2HwuSNV 0qYwZIyp+HS11fYuzmcXxvfZ9v0TvHEpp4lfsIcDnEDJyTFTmyb2ddqGx21YXOeeLw/vbUvVFYN Ki3D/Z78= X-Gm-Gg: AfdE7cmCKU+w4v0DUy0Tg0o+Z0S6mqCVdoZy+3iHj6H9uWsAwE9hOT7qbgdaDUOW8Wc wgyxnn1lqklNAteMe3njAn/pVjSz4uO0cQMk4bH2a1BEsuOQawu2TOzABAtbZS/vAiLdI6PNEFF qtH9kuq+YQjedE41VUv0Cg+Csy0M/kzP0WAzN9aTsrTINro4hdXHiEnDSKYFKaKHtL1iQsh/+ZR zjmg8suNf/PyeHiJqSV/8RqWWIJ5vNMNuJj4dEiYVlt981zSjrmlzwqt6yW9srvJ1F/QDKcSOh2 RY3hCEzve2V5FxN1DwIjx29iIHu+BeNSrxDlXKNDcjgyMVoFG6UFjpQqFy/RBexOnbz/bqU3t07 RmCuQKsyWiNKxdkYVsJZ5IsOcvrH2Q7A4ErNT7GW/jBZuBqs56jfyRAvOelQ/27Fkct2BVF53Um AH X-Received: by 2002:a05:600c:c289:b0:493:c862:3f2d with SMTP id 5b1f17b1804b1-493df06697fmr28998465e9.5.1783410507266; Tue, 07 Jul 2026 00:48:27 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH 1/4] qemu: auto-select win-dmp for crash- and watchdog-triggered dumps Date: Tue, 7 Jul 2026 09:48:19 +0200 Message-ID: <20260707074823.1326532-2-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260707074823.1326532-1-den@openvz.org> References: <20260707074823.1326532-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: XHXBMCVL5AZ4TYCSLBTRPPVX77MUUYQD X-Message-ID-Hash: XHXBMCVL5AZ4TYCSLBTRPPVX77MUUYQD X-Mailman-Approved-At: Tue, 07 Jul 2026 08:48:40 +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: 1783414743619158500 Content-Type: text/plain; charset="utf-8" QEMU reports win-dmp as available only when the guest is Windows and 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. Signed-off-by: Denis V. Lunev --- src/qemu/qemu_driver.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 8ec9e1f9c4..b59a714a81 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3532,6 +3532,31 @@ getAutoDumpPath(virQEMUDriver *driver, return g_strdup_printf("%s/%s-%s", cfg->autoDumpPath, domname, nowstr); } =20 +/* win-dmp is reported only for a Windows guest that has published a + * vmcoreinfo dump header, so prefer it whenever QEMU confirms it. */ +static unsigned int +qemuDomainGetAutoDumpFormat(virDomainObj *vm) +{ + qemuDomainObjPrivate *priv =3D vm->privateData; + unsigned int dumpformat =3D VIR_DOMAIN_CORE_DUMP_FORMAT_RAW; + int rc; + + 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 +3583,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 +3603,7 @@ processWatchdogEvent(virQEMUDriver *driver, virDomainObjEndAsyncJob(vm); } =20 + static int doCoreDumpToAutoDumpPath(virQEMUDriver *driver, virDomainObj *vm, @@ -3592,7 +3618,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 Tue Jul 14 21:18:55 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=1783414843; cv=none; d=zohomail.com; s=zohoarc; b=BeuE+Zz9Z0v9P8HBJPNgoowjwtwfYoCa/4ISBEBNMRr8O6grH9u6ThxpRxjmXrcr1zshXR0ueRSsc55HTuzP7oraZFLLvmnKk1dDait3yr26FBN1a8faVne98coUPHlesa4tEyo6tZUNRPRE+jyn+H1jYSwzkQEeV1/JnSIQRWk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1783414843; 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=acMf8fqyfjhKc7kH8hDU/YDrgVqOF/T8VBHVu/p6iFY=; b=WtFk1WWhCRwj83sXmMeFb4T6M9JGdO3imCPaLVzCjAJEhtJrLSY5W+fK1nXMgFZt/vas0sbJ8kgU76jJNSenwaoF2CbQBX2xADoAGFHv0tuUjOYDwbTNnbZ3VBycgf37L1s9oOw1vZfl4JeR622qZxoE+TN5pty98zmUi1o0YlE= 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 1783414843114983.1396881614861; Tue, 7 Jul 2026 02:00:43 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id EBD1341999; Tue, 7 Jul 2026 05:00:41 -0400 (EDT) Received: from [172.19.199.7] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 9525543ECC; Tue, 7 Jul 2026 04:49:30 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id E3FF1419F5; Tue, 7 Jul 2026 03:48:30 -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 BCDB3419CF for ; Tue, 7 Jul 2026 03:48:29 -0400 (EDT) Received: by mail-wm1-x331.google.com with SMTP id 5b1f17b1804b1-493c1950518so1964525e9.1 for ; Tue, 07 Jul 2026 00:48:29 -0700 (PDT) Received: from athena ([2a06:5b06:b600:300:6c3a:5ec:1370:4f95]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-493e0f294a6sm72882595e9.1.2026.07.07.00.48.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Jul 2026 00:48:27 -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=1783410508; x=1784015308; 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; bh=acMf8fqyfjhKc7kH8hDU/YDrgVqOF/T8VBHVu/p6iFY=; b=MCrrn1xsRzsl+NbI/MtLV+jwhuXh56tfGJY+3q+hFJuGHVFcdidFK16TOCbnG99Puu TbNsjQqYiLrk/OOe54/uwfJUhHMswugbUYpWv+uNIKKu+0MeTIvnQLSsaCqFoA1RIXDL I947fRwZ+z4Bt89In9hSYoKbM+atN+mp322FAQs6m5D+A/02fEU6mesbLXMb5cK3tzhs Qqa/e3UpKg0C8IkbxV9CTaTp/XDLsE9wszabUiZ3ZuNZSUSfnKiLm/Xf9EkxtWkeHxeD KZpvLTBbQnYRthLFSAXw+GkE/FTuzgk4j97o2b/5LW20lizbEy1XDcAiciDOeZJIN93M iSuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783410508; x=1784015308; 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; bh=acMf8fqyfjhKc7kH8hDU/YDrgVqOF/T8VBHVu/p6iFY=; b=O/Iua+PBZRFVos/7BNxqo9ihrZFyXrEVnw9MpGFVKyUYyuHxB6PRESp6lQ18ZruTad Z2q7MNztY97oZD/wpToXp1TLsyYgCXKJ7yoGulZXavl6MODADJZKhA9DS4exuwVKJKCv Ed1EPCcSerUPG6wKsIMM4fuHu6wPchPzPOaDp6STITIl7kiLw4AgEYjICG6RkYck7bm9 Bd/JzFap7V1YBPi52S7SkqTTElQLpgTxSGf4awN3vMvw3Tn97ys1/8roWKewy8HsbyGa DTYa9KkS26taQBDiMh1AyKxGXFRRuj5erwnjk3AxNwYTzkvS6Sn9wylKfII5jsvidnaS HQQw== X-Gm-Message-State: AOJu0YwxnNlpaCWkNRfYuIwodhO7xGtU7866gpiiWh8otaI9noKHj7nP ZN1POHpKZVlIV3Hz0/p9v2ldSca2INmnNGALQP0yqOqdciQw3DGlL9izENfnP3kMmHBxrbWCA/n HQ2emUzA= X-Gm-Gg: AfdE7cnxNDqPRInTVrl4KNQvFhfQ+qCyIybzV0rLsvTGRlF9Dw//BYDqpPv8f412Hmh 9yN9No1tJjII5bzHRtIbJxlpfYveFH1GxmU6Brw/hHj40Cr//Ozy0aTV2+G4bRuxpRhILYnCr2A F9W1hqqdrbbDld8i/9f3NqXHALRxRo1gT+dMrdhv5FOJKFuAi+kEE+T5jNwLQW+Mj0JMNwLYcHT S1ylXZv1sNIFaJIRKVWUF+qQo8AYHFLk+jDXeMyjuJ/B45H+jNPDEXFR2MYFSzBubevCuq2Bl7d 21wqXXGaJ6peGfCLTuJS30ZiQow6PsoKOQ+VSUWDf0wvwexPeTCxxhdN3g7BUfQR9ye1sUbmpbd Bev0EdPd9mD8mBFaqr3O6SxLSB83Ivl5eLT06kUfA5UoKhnLwBbcKrQB+j3PFgl9u+OhDsepeio dh X-Received: by 2002:a05:600c:45d4:b0:492:714d:8c4 with SMTP id 5b1f17b1804b1-493e101430cmr12960965e9.11.1783410508450; Tue, 07 Jul 2026 00:48:28 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH 2/4] util: add virStrToBytes() and virConfGetValueBytes() for scaled sizes Date: Tue, 7 Jul 2026 09:48:20 +0200 Message-ID: <20260707074823.1326532-3-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260707074823.1326532-1-den@openvz.org> References: <20260707074823.1326532-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: IRQFONWFJVJKCPG7X5DVEQ5DM2X6KL5W X-Message-ID-Hash: IRQFONWFJVJKCPG7X5DVEQ5DM2X6KL5W X-Mailman-Approved-At: Tue, 07 Jul 2026 08:48:40 +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: 1783414843671158500 Content-Type: text/plain; charset="utf-8" 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 --- 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..758861b266 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2278,6 +2278,7 @@ virConfGetValue; virConfGetValueBool; virConfGetValueInt; virConfGetValueLLong; +virConfGetValueBytes; virConfGetValueSizeT; virConfGetValueSSizeT; virConfGetValueString; @@ -3566,6 +3567,7 @@ virStrToLong_ul; virStrToLong_ull; virStrToLong_ullp; virStrToLong_ulp; +virStrToBytes; virTrimSpaces; =20 =20 diff --git a/src/util/virconf.c b/src/util/virconf.c index c820c94037..20a54905b0 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 size %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..e98e3c6c59 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..0f34ae3047 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..1b943d75e6 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..64a594eb6f 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 stringToScaledIntegerData { + const char *str; + unsigned long long limit; + unsigned long long expect; + int expect_ret; +}; + +static int +testStringToScaledInteger(const void *opaque) +{ + const struct stringToScaledIntegerData *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_SCALED_SIZE(str, limit, expect, expect_ret) \ + do { \ + struct stringToScaledIntegerData data =3D { \ + str, limit, expect, expect_ret, \ + }; \ + if (virTestRun("virStrToBytes '" str "'", \ + testStringToScaledInteger, &data) < 0) \ + ret =3D -1; \ + } while (0) + + /* Plain byte counts, no suffix */ + TEST_SCALED_SIZE("0", ULLONG_MAX, 0, 0); + TEST_SCALED_SIZE("1073741824", ULLONG_MAX, 1073741824, 0); + + /* Binary suffixes, and their bare single-letter equivalents */ + TEST_SCALED_SIZE("10K", ULLONG_MAX, 10240, 0); + TEST_SCALED_SIZE("10KiB", ULLONG_MAX, 10240, 0); + TEST_SCALED_SIZE("1M", ULLONG_MAX, 1048576, 0); + TEST_SCALED_SIZE("1G", ULLONG_MAX, 1073741824, 0); + TEST_SCALED_SIZE("1GiB", ULLONG_MAX, 1073741824, 0); + TEST_SCALED_SIZE("1T", ULLONG_MAX, 1099511627776ULL, 0); + + /* Decimal (SI) suffixes */ + TEST_SCALED_SIZE("10KB", ULLONG_MAX, 10000, 0); + TEST_SCALED_SIZE("1GB", ULLONG_MAX, 1000000000, 0); + + /* Bytes, spelled out */ + TEST_SCALED_SIZE("42b", ULLONG_MAX, 42, 0); + TEST_SCALED_SIZE("42byte", ULLONG_MAX, 42, 0); + TEST_SCALED_SIZE("42bytes", ULLONG_MAX, 42, 0); + + /* Unknown suffix */ + TEST_SCALED_SIZE("10Q", ULLONG_MAX, 0, -1); + + /* Trailing garbage after a valid suffix */ + TEST_SCALED_SIZE("10Gextra", ULLONG_MAX, 0, -1); + + /* Overflow */ + TEST_SCALED_SIZE("18446744073709551615", 1000, 0, -1); + TEST_SCALED_SIZE("100E", ULLONG_MAX, 0, -1); + #define TEST_STRTOD(str, end_ptr, res) \ do { \ struct stringToDoubleData data =3D { \ --=20 2.53.0 From nobody Tue Jul 14 21:18:55 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=1783414920; cv=none; d=zohomail.com; s=zohoarc; b=Pk/yodlx6n2wGUoJAKq3+cYjQSqlgFNZ3llL70ykCsZjV+gcAn02QOPeHFzLesl//iCxUHPq3y/2Ko4muZivPh5NeHUIj0+WGJm8Yu9+Rtqb9vZ9qsPrsnVQ0L7612BKtN7KrV0dNqrqbL6ymYPexnJgohjzNa12PUtkEjMM/Jw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1783414920; 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=7baaxAAORxHi6vqEW4JU8tuK5iIJYXlKayWCA5l6GTg=; b=JvTQ/Rxsfn9nKrO1D1OLsMjHSeBFiu4Fct3KBOGSi6ZJTAKQ5Zi6ZteN5d3ZU1V4Wo8IS0v/cKGzE8XPKSzLWxrGzEpHk20f0Px+mqWxz/LeYa9h3hSI0lyJ8ABLARbgEWAf4bWrFMpN3+mYFBQ20yh1v5v4yTzqJbS5d1d6GgE= 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 1783414920508695.7496154831475; Tue, 7 Jul 2026 02:02:00 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 10B1141DBC; Tue, 7 Jul 2026 05:01:59 -0400 (EDT) Received: from [172.19.199.7] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 1FE4243F1C; Tue, 7 Jul 2026 04:49:35 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id F3B66419F5; Tue, 7 Jul 2026 03:48:31 -0400 (EDT) Received: from mail-wm1-x32d.google.com (mail-wm1-x32d.google.com [IPv6:2a00:1450:4864:20::32d]) (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 CA31D41A12 for ; Tue, 7 Jul 2026 03:48:30 -0400 (EDT) Received: by mail-wm1-x32d.google.com with SMTP id 5b1f17b1804b1-493b77b150aso35164125e9.2 for ; Tue, 07 Jul 2026 00:48:30 -0700 (PDT) Received: from athena ([2a06:5b06:b600:300:6c3a:5ec:1370:4f95]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-493e0f294a6sm72882595e9.1.2026.07.07.00.48.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Jul 2026 00:48:28 -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=1783410510; x=1784015310; 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=7baaxAAORxHi6vqEW4JU8tuK5iIJYXlKayWCA5l6GTg=; b=X2TtTxRR9cYO5HOPnibXmjVHF9RTEFi2CQGcbUO/6FXM+rnXijIU0LgBwiXKD5rwWR k7GUCe3SrUTqulEntOHCdeoJmVhrQfxcwr+H1rkxuatxLCT4IwF0p5pCu5FBvg2tquQy ZcrShiXREssiZtkCKxDOAJO+YjHCv2T9RT6jD30yaIiWR7lT9xTfm7RDHIdkJp4HKv1K MLZdNFUHEokYLMbbkzn5/Hq1NWFf8xzCMrNTRDWhqz7UHY0LA5ALg20Dn57o+S89My9+ WkobZuqGE+/gp2bj5ubFrWz1/Tk6osArfZzm3gxNFlU7pDiC96sBDYIOqG1dEN/r6lXt 6qbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783410510; x=1784015310; 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=7baaxAAORxHi6vqEW4JU8tuK5iIJYXlKayWCA5l6GTg=; b=beQBd8jxcc/yb0ZearxH5SxBU5o/JUrxKQBh7FSP19jmPKbgmc0UDlaCO1v3FXnMw5 1xtYpDtOLEAN7Qd/PrrQ6Rn7PXOewtpVDZsEJ4fLQYKQia+ToKd2EqVMD/awBJPMSNIL GFavYihbROy6OEX3EWPgBg/eSNv1GVjNGDX53gav/kD11aF+fjAfkdObUG1YbX6UpC6r 5dW8Uzfv8+Z75BfuH1OPWNPZ04up/D/Wrb3wqPC/lf3fU4ItUqpgB1Iiio5/fQ9sV6E2 nhWE01Qlbrdf1931rK2Jck5nOvm4hD50Y4uDCuT9VFLTMuWyOsl5Wumc8vu+/xkpssn+ 5tLw== X-Gm-Message-State: AOJu0YyNIBhGp4ZCQ+YOj7Fk4BgaFwbwaJtBAIeYqahHAICKZvA20JgB OvG3bmd9lPVrrFIcsK/eOWrMEG4POC5mDsd9SkjZvjc/5weknT3eSv0lDnNBRDbis0EHekej/Hp JnEGKm/A= X-Gm-Gg: AfdE7cmt/AAuwUjFl30jRT3l9tNRrFw3NaQK39/Znu1SlDas5RNk4Ka4J8FtdmeCz+c huy/2yU+E+z136bSaRtPJvRZtwYJXC1Ddsi2/ozm4F5fwFNa0GlquIcH2U03P6HleslzlgTtFYe MgnrcgEO/hdA22JXz5ZmRkzBPLDHzPvh3MELC146TJuxrheNVvmWKjUzPOAZMlzWXTvzev9VEdb RerZc3DL8gTqgb1SK2wQYqNey+//35WG2xNRsUl+39JrR5gSoG/4CftuFKOKlx98l7fFMB0fPsb hRt4U+2qZOwNlG/8EL4AsnBYkViImeijdI8usS3oh2F/EryKGDjnn4vf6Qhp23fNQmROSqMMl8V CEEymjiFCrw441S74iZcN3qaNgpBItkUIsYracZGbxq7oc9ZJ25ZzuZEJdbN9jBEtJF+soskI/X ti X-Received: by 2002:a05:600c:154e:b0:493:d216:ed96 with SMTP id 5b1f17b1804b1-493df0b6a8emr40845115e9.9.1783410509584; Tue, 07 Jul 2026 00:48:29 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH 3/4] logging: accept a unit suffix in virtlogd's max_size Date: Tue, 7 Jul 2026 09:48:21 +0200 Message-ID: <20260707074823.1326532-4-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260707074823.1326532-1-den@openvz.org> References: <20260707074823.1326532-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: Y7KEVUWBKAQ2KVC552NVHKOPVI22VZMV X-Message-ID-Hash: Y7KEVUWBKAQ2KVC552NVHKOPVI22VZMV X-Mailman-Approved-At: Tue, 07 Jul 2026 08:48:40 +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: 1783414922241158500 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. Signed-off-by: Denis V. Lunev --- src/logging/log_daemon_config.c | 2 +- src/logging/log_daemon_config.h | 2 +- src/logging/virtlogd.conf | 7 ++++++- 3 files changed, 8 insertions(+), 3 deletions(-) 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/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 Tue Jul 14 21:18:55 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=1783415004; cv=none; d=zohomail.com; s=zohoarc; b=Ufvb3JAyC0Sxjl/N82gLfRlUmdL6AQjLFI1JJ46NKDYInuhckZF4guFUvneuFCV1hM4FtuPLZvi8kY5EaajBtuVbFAYcma3TNjCwpXSrHdoo/qTyO8UsZbR2AFlc6cMtPyfzO8BzRhEe26IuHzXJYlW7YxG0a7zKTWF1xSUqzic= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1783415004; 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=2WYE1lD9BrQdV7COFDkRvksoGaUeJffW/GSjnsV65N0=; b=LsBIfJ9W5l0qbatC63FXK0zLVIdBz5M19RI2rQ5YlXoCZ9tIdTVYGqgh22JsQDVX5BLh+Kse6hqW3ZkKBlXxDAeCeVAJyNSaCEwd4vsaZYbdYpRhBCQNcXlwVFtJe05bKacG1dEr/rjD6dTYR3jr0DyH+EFt8F35QrZ6vsun2sI= 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 1783415004809152.49456407201785; Tue, 7 Jul 2026 02:03:24 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 6CA2C419C6; Tue, 7 Jul 2026 05:03:22 -0400 (EDT) Received: from [172.19.199.7] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 65B2941D8E; Tue, 7 Jul 2026 04:49:39 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 01420419DD; Tue, 7 Jul 2026 03:48:32 -0400 (EDT) Received: from mail-wm1-x32b.google.com (mail-wm1-x32b.google.com [IPv6:2a00:1450:4864:20::32b]) (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 CD70341997 for ; Tue, 7 Jul 2026 03:48:31 -0400 (EDT) Received: by mail-wm1-x32b.google.com with SMTP id 5b1f17b1804b1-493c2b3dc8bso26395725e9.2 for ; Tue, 07 Jul 2026 00:48:31 -0700 (PDT) Received: from athena ([2a06:5b06:b600:300:6c3a:5ec:1370:4f95]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-493e0f294a6sm72882595e9.1.2026.07.07.00.48.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Jul 2026 00:48:30 -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=1783410511; x=1784015311; 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; bh=2WYE1lD9BrQdV7COFDkRvksoGaUeJffW/GSjnsV65N0=; b=Eu3iLDrqskP1Qg7UiRBtgW5yghbF57puqiCHlkDHGFV7FhFQg4wHJRAjl0P71kkC6k nCfKxb7Xf+OsasebRE+/N0+OQ7snPJTGWyPxnh31nhZ8ary/Wj+1/b0RGpidjJ/0NyjN PVjNM1uLEMxskiseVXBcOLfWBsS1/gtcVaJLVQ+1yI1/6wYsybJMUkCBAtpJ08iV/cut 0PeAs3fS3rgznDhjLE1fb1AGn1eOPTuBP605GjfiEDHiAG5dfV4M2bRQAcawhi80rfM7 UK9ew3cpfli1qH8J8Co+oSEqJwl5OShPtnyu+TIWP/ESkRR5E2T48C3FoMdwWG+Dr8p3 b5zA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783410511; x=1784015311; 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; bh=2WYE1lD9BrQdV7COFDkRvksoGaUeJffW/GSjnsV65N0=; b=faas5HANIxYXBltkHTnCqG76SVvpJGgYKNN/JQ9+3imiK8gQNWApH13Z+IzB2vB4xI 6aZlllVuYyKS+zxl/3PNKGPOL2E37rrDQ8ADRqhXj9tMSwSrWh02p9jZKZC/UGhdFBnL ijXoKVOLHUNrXUxiHAqFrmWNlAvQwFP6nBkPjj3jdOUgka7XxiKs7f3tEJTbH+Tm/uxf K+7F3PZFPrMbDdNcOuXI21jJHq9YlazHO5JxWh7gio37gm3enDpuC2K/Zr9k/EHNaw9i bf1c9+qll7qWUG2tCaa7DX9i4QCObAnO7+UDoZqDOGrzmlRbo57mnUxUvmY1GKLTacmo mBQw== X-Gm-Message-State: AOJu0YzM2Oue5bp4SIzLHzWkzWC/oLicPbtyF66gzuhRl+Qd4VMaNp5j 8VfCKxAZykTpWygrIlaN7y43E838PV32O/4OeK6OtYPYC5+L2wVs9c9K5dbgKEv4X1H8FB1habC GNPI16pE= X-Gm-Gg: AfdE7cmB1CLbZmMxYRkWOoG/egHaRxa16O7w/BTcVgwnVbr1wauaZ0GPE2BwpFNtex4 /6ySsEsQL3BNvB7r95ZDEsNhsDhNnp95B1xI2geR238g4mQ4KP3OhEvcgQR8AjBh6s/6kXd3RLM 7SDjIMiBsfhELXBZishp+GPdrsSr3gJbC19qCD06YwnT467PW4HHpeU1ZDUxmIyvBMr3Qcri2HX rVCfFEOqU/CzpxdLO9SZWCM+1kbSTnjWCntUv8ZH/02wQ+7FGuaFjGGO7lqbQ3dshtiuRGRk2JF Jfu4f0iZt7HgTgUFvmlUX2BzhFtcd4QF8M/kAv1yb237yya436K4nEwtpuzVnL2gP+hLzinW7ub IEWToIv5ZbJIhqW2IRMismp0GluHBAF52sY/YAyZXorTTYZ5fyJ5RRiuXjCai/h3z+dJ7PjfF0C kr X-Received: by 2002:a05:600c:6286:b0:493:c3e4:c9c0 with SMTP id 5b1f17b1804b1-493df092ad0mr43537585e9.24.1783410510589; Tue, 07 Jul 2026 00:48:30 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH 4/4] qemu: cap total size of auto-triggered dumps under auto_dump_path Date: Tue, 7 Jul 2026 09:48:22 +0200 Message-ID: <20260707074823.1326532-5-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260707074823.1326532-1-den@openvz.org> References: <20260707074823.1326532-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: D4IVKUW7JIVEMS6SBLXVKWJAVUZ34JOU X-Message-ID-Hash: D4IVKUW7JIVEMS6SBLXVKWJAVUZ34JOU X-Mailman-Approved-At: Tue, 07 Jul 2026 08:48:45 +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: 1783415007174158500 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 each dump attempt, the oldest files 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. Signed-off-by: Denis V. Lunev --- src/qemu/qemu.conf.in | 16 +++++++ src/qemu/qemu_conf.c | 2 + src/qemu/qemu_conf.h | 1 + src/qemu/qemu_driver.c | 97 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 116 insertions(+) diff --git a/src/qemu/qemu.conf.in b/src/qemu/qemu.conf.in index 97b0141cf6..3828af0fab 100644 --- a/src/qemu/qemu.conf.in +++ b/src/qemu/qemu.conf.in @@ -688,6 +688,22 @@ #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. +# +# 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 b59a714a81..3f021bb7c5 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3557,6 +3557,101 @@ 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; +} + + +/* Removes the oldest files 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 (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_INFO("Pruned old dump %s to satisfy auto_dump_max_size quota", + file->path); + total -=3D file->size; + } +} + + static void processWatchdogEvent(virQEMUDriver *driver, virDomainObj *vm, @@ -3586,6 +3681,7 @@ processWatchdogEvent(virQEMUDriver *driver, qemuDomainGetAutoDumpFormat(vm))) < 0) virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("Dump failed")); + qemuPruneAutoDumpPath(cfg, dumpfile); =20 ret =3D qemuProcessStartCPUs(driver, vm, VIR_DOMAIN_RUNNING_UNPAUSED, @@ -3621,6 +3717,7 @@ doCoreDumpToAutoDumpPath(virQEMUDriver *driver, qemuDomainGetAutoDumpFormat(vm))) < 0) virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("Dump failed")); + qemuPruneAutoDumpPath(cfg, dumpfile); return ret; } =20 --=20 2.53.0