From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670236858; cv=none; d=zohomail.com; s=zohoarc; b=kgXg2WFqjbFF+UdnMNwL6qNDbyur7MdOeS2jjqZ7hVoMnKIjH3zCzjvC464PFdPm7aC99r5Cf5/jQcQvjETvCkz59LVKoouWZZBhPjOTBkPorDSYOt2WfGWExZ8S/9P5l+UJX9wkbbUVekHWipxbdBTaS4QGJ0j4gXR3Z5JTz/E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670236858; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=VH97Na66andw4PozP6BhVAqLMDNlmpGHKEqMqLw6BXM=; b=FTwxg9OLKI8yW9Zu8N9tdkHhOF0ydTmlm+tGAYPtOemHj56rWLEDB9rwDM1muV+0gacqXRUcdsouS2/IuNP5DZk8VbB44oWPeD+xDsS4JxykvLkuJrdHzDf6zSWe7HMIqd34YFGHFURSdAstjr0J4Q0G1UIsdRbwrGg+ZsbDKH0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670236858919312.79942282990396; Mon, 5 Dec 2022 02:40:58 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p289n-0000Vp-N1; Mon, 05 Dec 2022 04:53:03 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p289f-0000Sc-Qv for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:52:57 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p289d-0006MH-3Z for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:52:55 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-16-bQ9mUBvZPYWbolGBp1cgAw-1; Mon, 05 Dec 2022 04:52:49 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 449368339C5; Mon, 5 Dec 2022 09:52:48 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 23C332166B2A; Mon, 5 Dec 2022 09:52:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670233972; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=VH97Na66andw4PozP6BhVAqLMDNlmpGHKEqMqLw6BXM=; b=Ddgkc7pdsO/lLam1K9a7gkps9/M9vmmSyeu66gdnstJo9KpMYEJ2qHVyqZksySdPZW6TKd /z2BQdOJk86Vewb+aXfpNsHGuPh1yyJ6PLf7PwTRU1Tbd4WqmWo+xp8T1RkXUEEiJint4E evIl0TvICqHYqV6Ogfc2GTo/+GE1srs= X-MC-Unique: bQ9mUBvZPYWbolGBp1cgAw-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz Subject: [PATCH v2 01/51] update seabios source from 1.16.0 to 1.16.1 Date: Mon, 5 Dec 2022 10:51:38 +0100 Message-Id: <20221205095228.1314-2-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670236861126100003 From: Gerd Hoffmann git shortlog rel-1.16.0..rel-1.16.1 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Gerd Hoffmann (3): malloc: use variable for ZoneHigh size malloc: use large ZoneHigh when there is enough memory virtio-blk: use larger default request size Igor Mammedov (1): acpi: parse Alias object Volker R=C3=BCmelin (2): pci: refactor the pci_config_*() functions reset: force standard PCI configuration access Xiaofei Lee (1): virtio-blk: Fix incorrect type conversion in virtio_blk_op() Xuan Zhuo (2): virtio-mmio: read/write the hi 32 features for mmio virtio: finalize features before using device Signed-off-by: Gerd Hoffmann --- roms/seabios | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roms/seabios b/roms/seabios index d239552ce7..3208b098f5 160000 --- a/roms/seabios +++ b/roms/seabios @@ -1 +1 @@ -Subproject commit d239552ce7220e448ae81f41515138f7b9e3c4db +Subproject commit 3208b098f51a9ef96d0dfa71d5ec3a3eaec88f0a --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670234211; cv=none; d=zohomail.com; s=zohoarc; b=A6jWkUEn8+fmCXGecHudnrIU/INhn3LltZx0rmm/0re+AQI4Yg+hlr8QMDuEwCmk2dUPXQMlEhgFa7CEWv61s3V2K40WcG5BkNSGKfRYWbYgvJ97SvJVsGVED6mhjwks4hFc9LPV4wsmtCD3hTaTJeBWelWog4A6LCgdl71URB0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670234211; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=C4cpdFMAvXD1tZM8tlrY4rUMXLs2pwp2GsxSFVSg2vU=; b=cnzq87rTIVTLDMefZaorQg7g/y3Di2zMvvYfpxioFkRkyQ8Ai8acjzKxM+G+q/etAvLafRFChVBQvp3Am38vAkdHXuq6jCzaQZdxVCjHWxAUsI5LhAzyF8N//OvtotmkbXFMshgtxSpQYuc1MrBU0ot/Z0tNQE3N4Cj4wDKiASs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670234210996633.7314674295874; Mon, 5 Dec 2022 01:56:50 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28A3-0000b4-Pe; Mon, 05 Dec 2022 04:53:19 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p289z-0000ZE-QV for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:53:16 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p289r-0006P9-9c for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:53:15 -0500 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-253-AlfvkSZKO7ubdsCRGh8p9g-1; Mon, 05 Dec 2022 04:52:58 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 2F1B83811F3E; Mon, 5 Dec 2022 09:52:57 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id A11562166B29; Mon, 5 Dec 2022 09:52:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670233986; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=C4cpdFMAvXD1tZM8tlrY4rUMXLs2pwp2GsxSFVSg2vU=; b=LDslOJUPpiFd226xCRb8/K97Mu7W+9RlfkhFzXzcOIsLyW+EI9ZnVgdHjzWM6Enz+C7zqP sce9OBpbrwIpK5i696yYbJciyZ3N0P7mDv3qiP0NzQ07MzsdVBU5YxBTleI1NLNuAfxXpt CmtYxzuQZmf4keFGIeC9nnQB56Ap5jg= X-MC-Unique: AlfvkSZKO7ubdsCRGh8p9g-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz Subject: [PATCH v2 02/51] update seabios binaries to 1.16.1 Date: Mon, 5 Dec 2022 10:51:39 +0100 Message-Id: <20221205095228.1314-3-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670234212174100003 Content-Type: text/plain; charset="utf-8" From: Gerd Hoffmann Signed-off-by: Gerd Hoffmann --- pc-bios/bios-256k.bin | Bin 262144 -> 262144 bytes pc-bios/bios-microvm.bin | Bin 131072 -> 131072 bytes pc-bios/bios.bin | Bin 131072 -> 131072 bytes pc-bios/vgabios-ati.bin | Bin 39936 -> 39936 bytes pc-bios/vgabios-bochs-display.bin | Bin 28672 -> 28672 bytes pc-bios/vgabios-cirrus.bin | Bin 39424 -> 39424 bytes pc-bios/vgabios-qxl.bin | Bin 39424 -> 39936 bytes pc-bios/vgabios-ramfb.bin | Bin 28672 -> 29184 bytes pc-bios/vgabios-stdvga.bin | Bin 39424 -> 39936 bytes pc-bios/vgabios-virtio.bin | Bin 39424 -> 39936 bytes pc-bios/vgabios-vmware.bin | Bin 39424 -> 39936 bytes pc-bios/vgabios.bin | Bin 38912 -> 39424 bytes 12 files changed, 0 insertions(+), 0 deletions(-) diff --git a/pc-bios/bios-256k.bin b/pc-bios/bios-256k.bin index 6163fb8149dca8c30f1c64736a63dba33716b9e2..211b2a4da224427c33aa0aafa2d= 8ef12b0292573 100644 GIT binary patch literal 262144 zcmeFai+>c=3D`S^b}*(4iSm<1LM5H#STM588(N+ifaB1AzAgi8QL+G-kvR)k$aLEUr{ z%`mQ7Z?#^kR&B9r^;0z@!An9Q;i6m>B6#7ZPF&Cc76J(SeLu4aV*C02et*Ds^!3ip zoH^I$ob#OLTxL+p{?C?xEdg5swghYm*b=3DZMU`xQ3fGq)A0=3D5Kf3D^>_C16XymVhk* zTLQKOYzf#Buq9wiz?Oh50b2sL1Z)Y|60jv;OTd_C16XymVhk*TLQKOYzf#Buq9wiz?Oh50b2sL1Z)Y|60jv;OTd_C16XymVhk*TLQKOYzf#Buq9wiz?Oh50b2sL z1Z)Y|60jv;OTd_C16XymVhk*TLQKO zYzf#Buq9wiz?Oh50b2sL1Z)Y|60jv;OTd_C16XymVhk*TLQKOYzf#Buq9wiz?Oh50b2sL1Z)Y|60jv;OTd_C16XymVhk*TLQKOYzf#Buq9wiz?Oh50b2sL1Z)Y| z60jv;OTd_C16XymVhk*TLQKOYzf#B zuq9wiz?Oh50b2sL1Z)Y|60jv;OTd_ zC16XymVhk*TLQKOYzf#Buq9wiz?Oh50b2sL1Z)Y|60jv;OTd_C16XymVhk*TLQKOYzf#Buq9wiz?Oh50b2sL1Z)Y|60jv; zOTd1&_m8*aqLhzu`E)ep{t zp-=3D;#!3ik1NU6U-GpvVx7b`Uxo`;v=3Db@&06W-GNFrsXI#8$N z1b^VV47tFl%az&W>mrEVLo)Wk8weT`CcuT|sjcuiWKP6Cd;|Mn!z86Xg)Wno^1yXa3=3DhB>*ad^8kS2^Mp)E~Ss%RSWhk-W} zekOJGYvl18rB=3De(wh zw_rCMhs570H5%UkJ>|PysiSk1%9=3D+U@OQ|ZuT(b7f-NvRfK1@MJLwZ}+XAJQz*&na z7u*Do!rk{N6@n+>S;!74H31%jzrf$1?hlj+)gZsgNr{G1XgY|H3 z1@XZYxCMR(_rqV{N*y`F%q2>tKSa46QEJ{}N*#ED_VFZb398@^e^P2E2UHD z>i=3D)Z6sG*0HVt#(UU&+YEyeGv_gjoRjL$rKyjT?!IgX+A$Qs z6Og=3D(x`A8aU04srElO>MZ7}dN?%@r{+fH4=3D6+0*sEQM8|K1avH`EUm;flaUnjzhOE zkU3ldkHX9F9;}C>(Dh6759nVh_4FQe)7QxATl#=3DW--^=3D5_9<1lpLX><`Tc=3DBK)*KH z7`*wTQiuMHZaAV;v>iQg98RGB;j@#-Jw~5~1InQ$I2>v~f~yG);Y+Aa zaVS$rb*LM=3DI8>mkLydJi)Nf!h~mU zR4b%k;7}tW<3b1H1o6O(9EbV~yboP3aj5BVKRf{gFLkKbE+;?mCHw$C!bxym;ZWDZ zZ{U`p4pk11!?;|B`W4i``>+z$KZh@IwI7uvx+hP2?3Ldpw6uSIrn3(SGJ5P*fS7@T9tGq}M6UMPSV>BNzhL!7g}N!*=3Dnaqk7YyVLU7V1K#MP)Q1p-E`8BYum{?q_H6WfhEj9D zHGp_w2#kZLA$cHu5thMsa145#!#E6KcmzI#DEtT~_t7qTFyL{0i=3DX1@IWW z4%@+ZE;bL$fw$lwoIO~nd^kH(ssFhE+cS%?=3D0e7G*aHW^bCFWl!y9nx#pDT&LYHiG zFYJYba2fVl5dIF|!lRd`gDWnjyl^|{@D6N-{2|zYFc+#|H~a`AE~EZnJ?w%5 zFz#~30GI>s!Dp}!es_gZufW%^cqlp+-iA+LHynmRxr}`<3VsdqVF~;ZUV+!)Ls$KxB+g0hhQnZ3+rGz zdA>&cE%*d>gQJjog>~S*hV}@5h1a14zJ@EXss9JwhhAgpzc2!(z)IKygT_&x z@F8r0FW^_#(H7uiXod5xr|-daa2wnU2K)uQMaUSQgyrx(`~?2-jG-_SUV&i~u!Z1D zh{8{BcQNvX^oh(%;34o$M((f-S|EQ4{-6r}3D=3Da6KlnW?f-2ZO6&Xzqg1~Q{lJZzKME*G4N|x08hX_;6wNvj=3D_K#N?i`)p%g0M&+t$95Wa@2 zn~^Vk0E1_uBVh^Dz-Q13!+wQ*@@v`;+yn;v1vWs+Z>UEY2h$-0UxMov(uF1PA?$@i z;J%eM0I$I^XoNkGRZ5?Lr(p#ggol4i+kp2Wvy6EWJO|%{YZm$y2EuqKhd;whP!094 z6-M8NY-ZD@;3N13qA+?6_AVTP5x>K}f^&Y49S+yS+S{3{&BY%~g6E+Iwn5K3h;JTx zFn~@E(zoExa1@&E#5RS%0_JA$7OaKsaPC6#eHZ>=3D4OA^69NfPcT@MrQAx?M;K7}JN z`(ES?kHbG<8T=3Dc1-iHkc8z2fdhUjl_0Z%|uC3OtrVKEfwv_Du1 z@4YtS7P5MYReQz1{1aH79=3DvRZDgIRTyZ8>W<@ORh-J>H`oypP;q z3Oo;c;HD2~NAM{0{!pnuHBkR6urc6Yun+EPM6PiDO4>HehgxA3X*N+`;B97n1_QRs z^=3DkAa%!TLSBiOzM8x6|V5$8wrvyaiW>**Kp0=3Dxz-8_-u9nRi1gJh&PC1kNqg1>69~ zVA3bV2RD3582ARx+DcmR2CRfH-~imdjkXDoL7x`JCs_6weGT@&4cqDO&;aXU2kZm2 zgYv;eaMtJOZ)k#7zGMyJE6M>Y;ZvBo6CDD7gL%7<3Ft6!H+2CAVc;J094v$gd1FynzSP%Q* z`BvH_bdMq)1}_cO-8YtR4>d`~?=3D6wdsC^gy*SZovI;)dBPagur`{ zc%cIR0&8G99D=3DTg&}T3O9)!Xl>1+RHJUv4C;B800LgG>ERd@zIh0l)B{*F_RQ1BCR zL*@x|DSQHL@Z3qp9ymWnKZbqaV$NL;*$(EXa6y7YeE^ENcMtd!zJ)_@33KrK;ZI<~ zACerZ7A{F$Ho+b^)8$a-Lot-XJ@5$B!bjj|PJa(P4tt0=3DkaWI7Wx&Ny1}njJ0eOQ>FeHokz{PsSnQ$rm z3re#cs&9@%HN$prvSx7x+y#%oN3a)iS;v?Tr4WQC;AwadK7l=3DO0DMD;8z#U#5P@Z| z3ciN(FC#B-4Ll0Zz`L*;4#5Sii$vgetcmPlE#zL-J^uKKL;d;h399OY1XcP-=3D_B-1 z`0xK>{AanAK62`L_G#DuTey^XH2>E)d;NDZr{X^SQ9NI#yV%#Z1Z)Y|60jv;OTd=3DE z{}U4Ug{|?+5{rG%`M=3D>Y{7&6dxjB%ik8(B|UGyTS?y6kF?MSDd&}bAohZVZ!Csp-` z`JIi9hTPS`#GLxZ;w62DrUg>^)Q49)qAvd^ocHI{Pj8%D9GT{b4C$gbEGdpvY!0N3 ztQsH7&pi}uYr>yjykZkjpQvwh+TI&*eJuc_D(>{&M??mh+gs>YmH^g^wA z%c$u7@)+|16=3D>0_59tR9cLmR{Ebt`;dPOEXxIfSGKZYnijlNygGHv>dn{T23dZWH| zX-Y6hTUKA!otVuS`K_p5m=3DSJtY0Db5>TS6PgJtcEf#jLCkxR7iY-GvDC218ZW2OW*YM%vJ#E&+t2w^Z&39*8FBeWoLlE&5uct8tA> zcP+WbQ&s3(a&1C*msVAnv}A0bs>0+YW7Db%Q%a3%ouzuAYsrMf@b1K_qAt@Lk&a|m z-(VDZBBN3hi@muU=3DU=3Dd-&=3DET744e}>niM>9Nnt|yt`McjJsRw?q%bkOD>3&#AXTe& zIaWtEQDZZ1ZZ!NZ!|#nuEb`>km;TUk8(!fx3LbHWcRGG{XvV>jz?}V5!V$m6%)`>v zmW^>X?DS~Wll!D@)T)bnH|$PH-I%jEbZ?r{o>-o;+ zd>6&^8{Lg-oHXC_j9JdmJt+ynG~;^L$c9~KYSqEyhHpHn2g+HcQ2uD5ab1l**0tn@ z#L%w9VE@pu1Tv~sZ@#vi*}Q5mU!nZUmAa9bqwdhr#9&JKSeGN6#Xo5!+Op6K_|jK2 ze5VDR|D#1yYo)1Ft_eD|>W0SR$oQDvxaD|gk0Y3@Z>roJ{2u4&jg5wMwC+ZsEB9J=3D zFxe<{>({zl@A@eg(;IR&8_p+QexkdQ#u7-$Ep!F{9Zen;K9&^xMp|W)*@B>XG*E90 zua4y&3Z#b@c~syGy~TWmCz1Sp=3D5ze!)JGF}P9vnY zdwx<)HaQNP*^R_*%=3D0A9a~adznTK*)<|pVaMo+@E{ztfOzX&J2+35WO5k?+Nh%t95 z-=3D*4PG4sN)%+OZP>u2;IGD%Z4>Zxwr66fl0y+_Y?=3D^LX7aZO=3D#tGG#1k*TrSYrN$R zFK}JCV_}9d@<(HQd*aA_y~ekNkEsQz#vMO}zd3Pzz%@49>WzM$Q$L*DG)4a9=3DcN$A z$cePbCVh+9TIf)EGo7oi(f?VpR=3DFeKjTAfeqk5Y;;+v9x@lS0x7X z=3DtkNyRp&$?=3D9X(5D!en1ew`TTjWGLb%M$CZk|#%aveXrb8q?h*VAh~q)bvJChIHtS zOZqJFph~)ij$Ir$w_6&C0{bBSnu5}qjqM(x~Lu^-M zltWa=3Drf_>g@Cu{%+$X7yX%4-=3DTu_Bq8okRVYASrJ*Mf^Jce&G@pN8be{b>b1(KEvB zj^H+<_ngkKauHo2(XKG6{2B{dBOUr5i$d`?<)=3D+W+^=3DgX-#7W?QM@1?wegW>jRZ@MexS;Nt;T6NYi?ahyM_XqxP zyDPYrHt!17hF7|*uJ*z$O;eKMd)pTGs44fA*U*u(&3^#QLj}? zbu_-1LEVQf z&?s_t-uFb)Q~$-@ON(6R6uE;vjJcl5!+~Udt=3D$E;9~@d3Q!->8 z3N1XTf=3D8msxf|!589g^r=3D*-}altsBtKW@2_mP(HW_4t{{_%iS`u792 z=3DwFFPeXw3aC-s>giJ^h+!1ebGxS8wweAOA^z<`DU$9RA(Q{)`hO(d&t?3W}m)E=3D#0 zF3IGsBQ@6FH))Tqknz8suq!=3DQ_thKf%_Lk5XJu%DrnZ>UE1E~K`j@JjM`izuV5QBY zh8$?qmL)BwF7;7EX`%YH{&2lZA2qIdRME~iEiWa`1Uyc6I-5t$jA=3D2gdDPrjLf9hz z9ajRz;xFTh6uR_l$A#-N^if4b(ixTKKcWin)WYql3!LHl?8b2Y6&>d1HmtKbzH}qt z%P_|I(lR$SDevsh+~LL)>Z;+mv#KOv36-`-3$OE6l{k#E^^(L$iL1$Y zaO%g*=3Dtx#;>x0P=3DT%uj_qr1d9pu<~LLjxzE=3Dxx!@IWZj#owLKp^J&#XQgUJu_bRDW z?Uf^2zB$~G5pe29at@~ke9qM4{@fJ|7}9{YPn~YX6<2dPJM_L<4p@o;Lz}QofVb;HS%7;WpkX;48h$&|?ZcF~t(|dTL%}0Ah{DZ9oiD{`7FsB|p z-WIv_M@vv05^vPqzPQ90GGkVW#-GYWoiCp7AQG7}IiCHDxKmG@elAmozY`QS7VxDD zKl_eO3N4~+(|?Xu3}o`Y9`Bvey5mmEar!yh4u609uV_1bM|coknGroBl0SILgm{V~ zD>J}@sng>lH$$Jk-l(d;J$L=3DQp2k}bN>bYny=3D;WU%`#FM+obK5?{m@;jQ%$=3D(qmb< z7)e{Z(PSd;`4;d~8{tn*{h@z!+7GIf|o9CN%Q^k(J#L(S|DsX+N(f9u2Ih$vH=3DPn)g zT&PG>!ECMii7*$DtVjmgEk7ZtXb=3D2~P8lg)%wUXU2?5LD3^Mf1eU5|rhK86c{H><1Z#e0R z{`&ncSt zZ)$VC8}Cf$jd5@Olo)ukz_BKCJx1ge(t`A(4Kb%AsbNm)xs`{5UG!oX^EFlguFc(g zZ#=3Dz?jAmAPnFrq&sp~)J2ey2BgP!Npn@KpPA4TB}*buosw&m;G6Zduve;mWZ*OA2+ zJL0kF?VXlrys0vBDMsaqzQK}v<8dEr7b^UokG`%P2v%utIvnWou1x3xcyc~T%kT#e zwKkyra_S=3DiUzR>ZRO~80Hmc!%+cJ#bbT5kx>7fUF*wo%tBdsToVI%*EMBL&u>K9JT zw7skHf8pfSs@*Dxh8k|pLTK|cKV$DoXyNhw90WbqsTa4 zmQ<9no3! zmOMzo%xuqGk-5dl@;Oc*D*Ynl?Q*P=3D%ilY>b~`?`u3cO^9bZ`2Zn@5kUwaG;!ptoV z$Ghq?ydq1oCoNVVoray4*=3D}8?hZ{1&O&O62pS1Yg)mo*Ku2{ZO?kp{2&1+aD2#lRv zyrfTLobqpBBXs=3DcK&s(6<&f|n4%Z}xj>dg3Pfe@pVyGsLe#!WOA#DA|M|gL9 zV42H<=3D-JjV?XD&5xL%BQ3)c^h-}c1K96sEk8jH2+wK+Si!L)nv_|t-)V+9wtpCizS zpwq#MV%b%kmYycF-gx>0ejYd_59Xh&=3DkZu);t(Bc#Txf^DqeFg-lmpB^1W7CIh&*B zh8qW4QCWT@Db(P#@yIME+15qDw%*0@aS~?{&KNi9^7~s$b$329VsG$=3DCQcU<=3D)>>O zWi6f4ZI9kz@}rA$_G68?Xo&pyFiRb-aS%cNif?{Gty;jwe)T&n0f0r2EnG#v( zV4*>)K=3Df*X7CPn(q=3Dk;T0>5cJh^NpoO{+M;MeAPvM7$im5Y=3D@!-{A=3DM$M!?hH#8h& zrp5~ldP8_uiuTg_`QOU2&Y$TYK0R5V?39jTU4-*kysdnOh;r&%Uz7Oq6Y9heG#CFn z7CYrXlJAVWmf}j&+A7(%rW{fv=3DH!OT-Ktd<6G3i+R>>L@ixFc}n3&ba!kc5!fv2J! zbb7S-!KMv2#KK!*j)opvI$|wxk}XH;EwpH+_m0TjiPBlaJMRmd$$3ugfj08Tq$TF7 z{JfF{74jzS(_H%_d275j2wD zCGPP7Jc^pqQ}ihW?{2w9eUapPIzKVj=3D?kW|-im5-oQNiqX{TdVF6u*j_@5_YF|4r8Nt}#) z}VXraGia6fatE%?q)<^(s#4yH`($VO=3D*_HFVfHA6DM{RLPOmPu<~3n zU!;vn7K15gbFDQ+8LBO_Zmjvq1%`E&!aGM)tzZ@FSVHhD+*ugLn&hw;mSJcyf4f+5 zS&O8sYqI~bL0i^>xKIFBa403UU0b%=3DklUN5-`qNjV=3DPn-32igfWfO`EGK^wp`N5)z z6Eada1`EQmUU!bL3`s&iKZ^a46;vy$lNW{-X^uPl8S}llN9JX)Jukz*IhymkjJhGeu(Ub9dvQi{zGqZPQNEtY@G_|1!vk*@I3 zlzS5+Bg^!3%VzFaBGH>L61{YvG)A-Z@Ui4TY9##$4^c(EOZ;i{-<%yMS8IA}oE9FEH9)p~$)MAk4yxkNjcwUHy{Y)_yPtot9Sd@GkCnoh^L zc(QsVjoBY7D@_TfW4<{4pY)t6rS zm|TR0#F@EjMBw;@Vq=3D|F`ts3@HkS5>fGvb+jJ`Z@W}-2Az29NOjhX)G~wM^XqQ{7 zN;I~RKiLJvyxKp zXwJm=3D85ut6(JD2fn1u$c=3Ds_`GPi&`AS!*KiRf<^r!=3D--)e_%Wv=3Dkr7=3Dd=3D*mHGS= =3D23 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%0Dn>bwn$FIor9u{DYrhL6K6Y`7$!gKhWw=3DGb58n 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�>%t{dO*vUKu4{flnPJ(7H9 z{3eFV7vYYNzKV0^ZCUr!S6>W&x$G(KfN#yQGc}iHx8yA4>6X(jOZ=3Dv+?$o^L)bEpe z0Czj0HD}Q|vRZ0%4$VSaUvaK)_6J&|dv|bhvPQffR}V>@+w^I#{Pya#^2zM!qHJ~7 z*)n@@w;$^QxC--W<#UJW1SWXoQ(~_)KLz-E0(@}>c+F?u;4mQrJ8b$$Xyz7)?K5VJ z#j5hKBa2sujOmW1CY=3DrMLwDo4tW#Ci@&X~|tlLUZ^ctK{msZURjF3`XloD?4RT-GU zm-zqqlc3CItkjct(%0HiPk1xh7h>mLX&f;3ynoT+mn3ckoaw9w4vAVfwC(D->%Dc2 zyWZjLE%oPRoT225n}vzHnQI49b4}VqPk$q&U&hY-h?fLu@6lQDl4CY6*%8#`G>qEX zjNU+a>>pTqyuqpKM(pwpZ`|eG<$Z1yMP0w{lwCKhi)cUX9oF#HEWU1+uXRzqkCWoF z8|oUJ##s71Ci|*-5Ms<|PMkylyXlnT5@hlYKSrz$F(_7At_B37U)oNXC!J(R zhrY~M;{Aair7v&LcK9fYi@qAeSxCJ9F~dhh1?ptNV>A6z&s2T?s_WD@Hq+-H zr*h1%Qxc6}5MFAVym)uS?~QmTs1M*CpwQY=3D{T$flvP1Syo*MC=3D67im@nsij~^F)M9 zseWZTKICf2xnd@bt2IN#qrF}!u4yifuCtILb%&eZhCv;E-m6>IP=3Dw_+H^nw$X2fz9OcCm{Ah*`7tpJTxq~-UM?k#%*L})ciL%Jxx)c<9Y0_}_1+uJ zRtc3*3khcucw@95BpOlDCeFIcz$)A|)>$`)m)gy;cxiL?E*312Bd)ulhdf<1btlNv zEl-@Blx+0;8lHi1h;q>}=3Ds2X6)96sF*`gBw4o2A&E4Fx{`@qy{?mD6#s`kKgm>qZ{ z6I)IV9W`Qe*9-Xld7=3D$(y@_XkzH_vK;y}Jm;7gyG)bN6JqF%O87obsK9#!qabS3MH z0SfbUs(SExS?b10dgpDu%+NDb1EJC#KQiCLKRBH$zmpgA!G6efu2kkC@We#K9djA0 z%z+|&f&Cga+?^bY4w_Gx+F2rlDj~jf;&X)q7%tn`4XhW5Ckdm$O0{LB+?5OBS|5k! zFgJ(@+UkUp1VHdqR$b}yQb<{cx}N4*P*k~~2y-uCqs)c2f31u_M?9Yn&}{Qjy><_A zM?RZVIc01pv8|UO>HGFd?o7fR4GRIzU!`DnwhomI|1AP|RnjbtfXwIpL<5m6$gHwJ z(b3yX2{S6)f(t@WbQ?v*!f`Y+kE_sFKLCqN0^dBo93?HAY6U!dnmJG&Bul!8-Z z)X4E%fSTl^0U@6_Dqzz>Qh6;BJ%&xgE+Enb`PKpNqhA|N`lA)O)nqDYz#cF6EA_fa zcABovk-g^*Mtjb=3D<6#=3DS{IKPGZ{4aIXz&OC2c-et3&4i~&8Wd%iNZebIm`)-TGQ!kbaefms;m+fjACgnVbuEiQ1@SMtWnmQUv2i18jr z`%;yFbNwje$LfeT3tb|O;<{dDG3LV57ev+-q(f*CIF>OqW|z7eY6Y^Vnp^Osrk3Ej zCO7~8C_5MUsEX_H-%U2jCTzG11PvM_=3DvqOeCKxo)AR#W*8v<(EKYTWK z=3DFH5QnKNh3yw04NDOGD(w@%8`Zrx?aDwdM1^Y>@y{3+qI&WDYfY_HHCHEZ4vSd8{v zx0)oND#{M@z;;$KAr11!`VEKP>s)pbHm(6eXRcJuF_pyL`!MM#HYwIQ>$*h6RM^n983!O*AuUTuL@DncDe{-jr5#|i#QYdZ|5 zUTv4`dRe`5n9xls<-k3+6yvn=3DT6C#zr_Ew3elAfI*th2D z>q}G2Vvlv=3D86s~z7Z{$KFwy$xX9TFZs+Ii}>=3D-GN#MtC1rcyRFo`G1b(Yi}ps#EdE z!^GKmsB5i-x~#9A;W8}TDBsCvWZ`XVL4?Je-RF`iNB1m*u=3DjOl(tR$ z0x7^subl5FoA^Rvq{P>3;^%ugsB>S%z9#J)@+MXaE`tQW7u8__pKCZcERoO~XwPuR5f3YA(zTe4&1et_BPxx}jAJzy6$_y^_t;KdzHLZ{J#_mm60w z!Ix%G&@-B`>P~QUU9=3D=3D^R zalT-i5SxNswrut(NY_oA9SVXmqFna)(?Uzt7EV)OkX@=3D(QmPG1c_p_mnJ`LjU#M?^ zb%?M1N=3D)Qq0nL@NvC(}O3x|W&GR9H6xPUsU?JXRuqAOHwt9F8J%`xY=3DLfd+jDliqk zk+>bzBgESNWrg&uhuLaj#l;I8ON+57JjNV9B9N+x)d4Y;;8xuTqx!EoD0 zZ5cA${+jm6Tutjb3C&>y%gtuWrgm8K;mJ&(1!{^K&i{uC+E<_Ck zS}fCmrUgtFoZcEX_Q@xM*#w(Rj6C^}ez1n5$Zh;3`#8j$z+7ll=3D!`3{IkcsK%wq>j z6GWEYBYB8{KeYyR*=3Do6Y4B=3DDDsO|-gKNbtfBKSgECa8w*#q61J{&VZgT&a!~?90bC zPw&4f^fA_s0Onpo_mFm#2$!pPC4B7148$6JG}HLFQHDAq+{*!#?1)YBEs?@#6owtE zTh*m=3Df{RI*cQ~)(0d$T1@+L8Q*0g$tbw@p!c*kL*QG5%L1yvkXJA=3D`ER!ur8eke42NRx-$smZp#A%*1WqXfA012XIwULKfF6a!ud`>PH=3Dj(+r zzzG5^wjPx#Uo2IYc{L~J*OSotf{7fv>iOQtcZsfOshIz6Yx4s(H7}17vgg+c>9PqK zf>VWxqWXa#y1>$BiohLy5oY4lyB!zbHPLscWLHOaNExnNArU(w$##OC)`v5sTzMU# zR!8Vv%|JPFsi(M&^Kws@*yBf>jgJs?kXL;dby9!Nzk}3p7>+2_YXL8yu3i7i!@aCrBdcU_kwbjo| zah$h;Cj&1thr2`U?*=3DZ?*PqmX&uxJdCpal_R~Xfo@QOp0%)Tg3y4-}jLH=3D(aZ;nSVkQ6LmC^^BLxCauC8xZyi1AnjXDWuX_gh zXO8q(>C0^Lhw!xuSCu@tF=3D_5D7+`s;ax{MNZwNg?c^EfRD4S^md z6^z!mt7~WSJ}h@7tU>dL%&-jWxy?zUBjG1`^d7a)wLYMT%ZK+Ut{>i`epDaASt?5w z+jqyZ@aLHmUC5cSPRS*htjQ)qspzFjOqIh9CFITfoc;?UvnhI)D!U_(13&?In7)2z zMGdQyj)X-iYL|BRzKReRQXd~o1S;+Ath7`?R_tD7GowTb(h{rfan|f)KZs%^@Vy?p z+ER>h6l0KeizdyR$t`PS?MJTGrLf79zhS67vG@?LyZAmI#7^ z{_Bh(d6aOIYwXMgZm%d@lAzbkw;`DDO)!hRj;(}-r=3D+qZ;jm7xy+blxpXk_AxK)3w z1W$0O!|6{N%Tt7Vm*1KcJelh6%dOf#`tn;-f+tJ;p5VzD(bV9{#K7N!OOqXecTi6N zt-gLTMvbI7Q|*?NbL)6Z`a~Im1;2FokJuEW1fnc?ABJD;GPMunC4!9Q!;^|q^*R|M zL8`E=3DPHxl&Ql=3D#-iGid>?Mjgm@QK}$DMG@lR7)mH4ssw@_bB+!s-%yzuBo6$_`Ri4 zOb=3D-%NO!#&hfkGOE}lPJvrN(_&5idT!1SdZ4t_ z*DM%jfdK&-T$(b2`|~6=3DAuN&URw+fv^fVGje}w-AE*YjZ>qFe`)#j_Qad%h_De8GmzF6pWEQ%vIivWU?#3q3 zIPW0UNYhcdP_ykU#3l>~b>WIEH7#}9le}vg%VWwh1v1N)vC$e#1)~qf?_S+Ii(Ht) zb7PYM@v@M`y}+-E9P27Gw0e2<#%YYs;o~w!=3DkjqIqw_hXZnFl3!Q9-~4#gOQ-#Ve% zFvF+a1O+dxp`Pv5MYPbAsO%zosJOgzR8bG6CfDDwKVi*o%vi`aBvv8Jda-7Wf-ZyER_ zszWJ?B@`w4$1d)R1%^RINQT1_ncY0f>7ksYaYt8kpQ7%qvjHdGQvt5%6S0^F1ke%* zK#v&YErD!}a4sBMV#Jmj?g-OzRij$I5D&}x53`zh2&YT)S8W^tSWO+qSx?M>*?EU2 z-kMdkCVWKCUBZlQnQF;eZ;%AWD_%jTn%Fkg0iA4vdW}CHttQ^%tm8+eef6g%(vZIA zg~&HQ%B)2R=3D4&W!taUDvlFOCzi)@%Qo{lq8NIDU3dfm0S?2bcsl#VhuS!xRhdwkmj z@joA71dh0fCY{w0cr-L*g&ZmAbo2 zRjKP(ImSCu|1?e1BhSjxEaIpl-?xWdXvs;s9usoSmr?}s`->6+kA#LiDMbhb?CifH z`=3DmvBsjojVtb7VwHYIv@*HVb7!gwhfXGtjng({c!cgaPNA@Q#8jgj9z;v4~Rv#$%F`6bg+cIVTVO~Q}{OPgTH$#>UB_G6Gt)6LyW_S@qpfC( z%nsDb?s360($)}-?z7GO%Py?bz}~a)kM$*U58IS>kH#F48La|!P|4_Gqs1(dtpJx< zRbYNM-+Um~EXgsP-WcaGZ0h&ZZYbDw<-0^GU<}VO=3DH?np^Nnh;jlx~UB0lJu7u$EO z_Se%4&5dOc1T1yOqzwKvoNr%&oY=3D-Bji(7ZZC8WuZCk*}ObOylv@69(K&Nb)f#D!gD88d1v$SX%01EjGar~bZteZAXTfBRtLkzCHq!=3Dn;P*(}Ll zE<2i|2AA?DzqDgfj&C+4NOkjA2(v2?5XSg`bE5F%jCIAIQTwjD0>8db z?FvwhZ`~ERbBx**xcM_7&qF=3D9hP01rZ9-J?4w@@)l&yl4z;ErXf_v4n_)gj}PSy6S zV^m!sR9z=3Dj)tKQ%ShX`9*4Lj;);>}oja`Z^WL=3DKI+fg=3DE+b55o=3D=3D&d=3DfJ!&CD*= ?mz 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 literal 262144 zcmeFZd3+RA+P__$bdnBfs0JDd7$j(eiAE%fN+f7Q0z^O!B(f^t=3DwyO8qe3^Jpd?nJ zsg&(7?m9Y;j>|YMqcdtq;+7Cd0Ji|L2rdB?D>O&|g%Fm0ue&+{W}bQ9_w)PvSMa&g zRi{p!I_G<~`z%$8V*j%huobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWs zuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWs zuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWs zuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWs zuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWs zuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWs zuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWs zuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWs zuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWs zuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWs zuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWs zuobWsuobWsuobWsuobWsuobWsuobWsuobWsuobWs_&-zN!x%+5D^^j?fk{vZw?l$c zQQn0Qp$(2gPMo6T!z`$P591YOGjvZ-l#wtVu7g?d2Ur64!vj#`Qj~hQ%fmT54R655 zuo3n^2VC1*Q64`_QQk{dlz9WWHb_yj1}n;Mp#*+}{zDXHIvj^9&sUTu;i@!6$%R5# z1fRl%7b?nFD1?{{Me#!g{0%;Y&tW@+;rACQ%ERz4I0n;)DoQC-z-I7VtSB>JHWb0@ zFlU&eJPK!JD$4m#0Z&6KWM9IwFIAK>I1En?SClpI*ky|1yj)RUgDb93ln```P!v~| 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 &hK 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 =3DS~=3Dm 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%0Au(+iZ64qbi2 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 AtpET3 diff --git a/pc-bios/bios.bin b/pc-bios/bios.bin index 68f65ff2fde1afe8ad23e5eaa42030c37d2883ce..12d6a037be66d7246c906bbfb1b= 05e99f0a83fba 100644 GIT binary patch delta 73563 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 diff --git a/pc-bios/vgabios-ati.bin b/pc-bios/vgabios-ati.bin index 4533d0d063c22890a9973e1260264813f1179406..39b24051481955de4dde9f36c30= afa6d9f237bef 100644 GIT binary patch delta 13917 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 A$^ZZW delta 13834 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 HO~3yi2ouRe delta 9868 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 diff --git a/pc-bios/vgabios-qxl.bin b/pc-bios/vgabios-qxl.bin index 8a27dac557290e9ad4abcdbecc757d4aac3e623a..4b5573a85781bc86bad592e4efb= 5a37da996e260 100644 GIT binary patch delta 12577 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 delta 9975 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 diff --git a/pc-bios/vgabios-stdvga.bin b/pc-bios/vgabios-stdvga.bin index 55390c45c9252ade6af86d139ae1044221488722..797e1036c98532323cec8cdccc9= d51314ec2ac39 100644 GIT binary patch delta 12577 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 U8oMj|5x#u$A3i+taJu||0l~n9SO5S3 delta 12255 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 AGynhq diff --git a/pc-bios/vgabios-vmware.bin b/pc-bios/vgabios-vmware.bin index b668ac04a67c22497901c3a8d0f1c1120b231b74..d5f263a9f74a07be5d02efaa44a= a21e98869c68f 100644 GIT binary patch delta 12577 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 delta 12255 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 B&es3{ diff --git a/pc-bios/vgabios.bin b/pc-bios/vgabios.bin index a924891ea58e0f6a98e8ea0ec31e611f73907654..d26af416ced07e63ba5418dc406= 5e7c11fc1b9eb 100644 GIT binary patch delta 12426 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 ZoBhbNyxHu|+=3DuzI+kW@H{sDvde*vahLtOv> delta 12085 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 (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 16702340749851004.5945601112537; Mon, 5 Dec 2022 01:54:34 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28AH-0000gB-PN; Mon, 05 Dec 2022 04:53:36 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28A2-0000b9-U5 for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:53:19 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p289w-0006Pi-U5 for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:53:18 -0500 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-232-y6LLJ39VMn-SjpfmQaPpNg-1; Mon, 05 Dec 2022 04:53:06 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 2F4AA1C09B82; Mon, 5 Dec 2022 09:53:05 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7BFA32166B29; Mon, 5 Dec 2022 09:52:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670233991; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=gM1FzBim53KQXgBVytxLzbWYxEf9vN7NkiErlAjlFr4=; b=KzQkt/tc7jHKpS/ZW/kiObBg8cz+d0BNM3vy1o6kib/YzBTLRhhl7unUK8G7FCXbsrRKmD ZlKiP717BqVgQT9rUcawdMj8y+FA2bMeEN79Wf05pBEx/1lm2axYSjo7SS7/j6nJPQc/uh zYv/9e2Q8jv09D5Rh40e6lNoKSMmgYI= X-MC-Unique: y6LLJ39VMn-SjpfmQaPpNg-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Wilfred Mallawa , Pavel Dovgalyuk Subject: [PATCH v2 03/51] replay: Fix declaration of replay_read_next_clock Date: Mon, 5 Dec 2022 10:51:40 +0100 Message-Id: <20221205095228.1314-4-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670234075227100001 From: Richard Henderson Fixes the build with gcc 13: replay/replay-time.c:34:6: error: conflicting types for \ 'replay_read_next_clock' due to enum/integer mismatch; \ have 'void(ReplayClockKind)' [-Werror=3Denum-int-mismatch] 34 | void replay_read_next_clock(ReplayClockKind kind) | ^~~~~~~~~~~~~~~~~~~~~~ In file included from ../qemu/replay/replay-time.c:14: replay/replay-internal.h:139:6: note: previous declaration of \ 'replay_read_next_clock' with type 'void(unsigned int)' 139 | void replay_read_next_clock(unsigned int kind); | ^~~~~~~~~~~~~~~~~~~~~~ Fixes: 8eda206e090 ("replay: recording and replaying clock ticks") Signed-off-by: Richard Henderson Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Wilfred Mallawa Reviewed-by: Pavel Dovgalyuk Signed-off-by: Stefan Hajnoczi Message-Id: <20221129010547.284051-1-richard.henderson@linaro.org> --- replay/replay-internal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/replay/replay-internal.h b/replay/replay-internal.h index 89e377be90..b6836354ac 100644 --- a/replay/replay-internal.h +++ b/replay/replay-internal.h @@ -136,7 +136,7 @@ bool replay_next_event_is(int event); /*! Reads next clock value from the file. If clock kind read from the file is different from the parameter, the value is not used. */ -void replay_read_next_clock(unsigned int kind); +void replay_read_next_clock(ReplayClockKind kind); =20 /* Asynchronous events queue */ =20 --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670234078; cv=none; d=zohomail.com; s=zohoarc; b=mr2WuvVO0rB/VbRiueaOIadNdlVHFIa82lY2TL73dz+q2/pBOEmvZp7BKWwQyrt8MwCdET7uOyhvBz8w29+zFDfrvnu3zJi5ADftmc1ngf7IZHH23bLkoJswWbkFYSx108R0cyWqBlHsHT2yAVLWnAxzpymDD2DQZcY/azlUG2g= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670234078; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=i2+Mno2782955D37e2Tk3rpJLYwAGRf+TLqC5a0fYsE=; b=IO09Cve6/AogqKW0ra8w+T7aMhOnmVHryqOXoMX9Ymp++T+2GYFYGYp+tj2iWcxnrh4RIjw/jDQUDXjhroJDoDQlZKn1iSo6qVmm3YwX3VYY7OoTaZPLxPgsfxpmCj0t3m4t7KlhuEzg3oyokTZxU3uAFWAP9Ak1aTJIe7h+ugc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670234078448778.7773981632591; Mon, 5 Dec 2022 01:54:38 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28AM-0000lS-Ns; Mon, 05 Dec 2022 04:53:38 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28A5-0000c6-Du for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:53:23 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28A2-0006Qm-AB for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:53:21 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-416-CHUk4CsCOM6mJ6mmfIORaw-1; Mon, 05 Dec 2022 04:53:14 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 0FD6E894E81; Mon, 5 Dec 2022 09:53:13 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7B08C2166B29; Mon, 5 Dec 2022 09:53:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670233997; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=i2+Mno2782955D37e2Tk3rpJLYwAGRf+TLqC5a0fYsE=; b=Gt0X0oqclauMlmYCZexZ5PycCHQLKs41W3j3WE5aw9OwC328mx4vfwhnehtYpHeBCIEL79 Xlj3P81DpvM6uggj96Y78DQJgOOFmXn/iaQG4j3QMNXd8s3oMYXelvoIO7JMQGjG4XPViu A6yr0ziTHE0ABQx5IaLF/LtURCXKH0U= X-MC-Unique: CHUk4CsCOM6mJ6mmfIORaw-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Subject: [PATCH v2 04/51] hw/display/qxl: Have qxl_log_command Return early if no log_cmd handler Date: Mon, 5 Dec 2022 10:51:41 +0100 Message-Id: <20221205095228.1314-5-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670234079174100007 From: Philippe Mathieu-Daud=C3=A9 Only 3 command types are logged: no need to call qxl_phys2virt() for the other types. Using different cases will help to pass different structure sizes to qxl_phys2virt() in a pair of commits. Reviewed-by: Marc-Andr=C3=A9 Lureau Signed-off-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Stefan Hajnoczi Message-Id: <20221128202741.4945-2-philmd@linaro.org> --- hw/display/qxl-logger.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/hw/display/qxl-logger.c b/hw/display/qxl-logger.c index 68bfa47568..1bcf803db6 100644 --- a/hw/display/qxl-logger.c +++ b/hw/display/qxl-logger.c @@ -247,6 +247,16 @@ int qxl_log_command(PCIQXLDevice *qxl, const char *rin= g, QXLCommandExt *ext) qxl_name(qxl_type, ext->cmd.type), compat ? "(compat)" : ""); =20 + switch (ext->cmd.type) { + case QXL_CMD_DRAW: + break; + case QXL_CMD_SURFACE: + break; + case QXL_CMD_CURSOR: + break; + default: + goto out; + } data =3D qxl_phys2virt(qxl, ext->cmd.data, ext->group_id); if (!data) { return 1; @@ -269,6 +279,7 @@ int qxl_log_command(PCIQXLDevice *qxl, const char *ring= , QXLCommandExt *ext) qxl_log_cmd_cursor(qxl, data, ext->group_id); break; } +out: fprintf(stderr, "\n"); return 0; } --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670234762; cv=none; d=zohomail.com; s=zohoarc; b=n8D4boLK389C59ogX6I18ulmi4/wEk4oYqlAMw03UAejkaZUQnPTghhGLmlmX/z9SOpy52trBbwkS1FB6ZZDSpd/7/BytJ2Z2Sl1HOTjnacA8IhZJtBh6vPGQZrcdW9Q9cJIp30vIuUAMQrAF2zqK4pOb2b1QNTNbgk/PcFmG6Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670234762; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=vhSDhIeSjhWPGH/YRvNS3wqYgEd3nq856LWIZM6CoaU=; b=O5dqRZEG6QcRkkfvsVRrlVZpyLAUK6vg5W3xBGE38wD/m0gGF00L6c+OQdQzGERBBNeExVtcOT9oRrXVUdROmM1NuKcy1LF9igbQmZm9J5o0F6xkjaQosm3gjtrgipiEYz2miJvx59LMR2xN77NRPSJHo2y90ZvHXplo/wYsk/U= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670234761971602.5139504189497; Mon, 5 Dec 2022 02:06:01 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28AM-0000lG-Ds; Mon, 05 Dec 2022 04:53:38 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28AB-0000dX-9z for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:53:28 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28A8-0006SA-NH for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:53:25 -0500 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-526-8YXU1xDhMUavtm--5Ww-Tg-1; Mon, 05 Dec 2022 04:53:22 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id F1CC73C0E204; Mon, 5 Dec 2022 09:53:20 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5C8BD2166B29; Mon, 5 Dec 2022 09:53:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234004; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vhSDhIeSjhWPGH/YRvNS3wqYgEd3nq856LWIZM6CoaU=; b=TQx617hakVnVntdBm40+3qOPKND1LYLeR+cT0y44gHWmuhCuD6+bCDR/3A+AosvaKOPz0H A7vOmpEBT86sC8ntLofY4f9qzqXNKu+uHKN3WI2zzHtNq+BhyvCS9z+mz3poSbiblFlOxB pMeokZVgWrgaKYyB9+Pp9TqsXDurAgU= X-MC-Unique: 8YXU1xDhMUavtm--5Ww-Tg-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Subject: [PATCH v2 05/51] hw/display/qxl: Document qxl_phys2virt() Date: Mon, 5 Dec 2022 10:51:42 +0100 Message-Id: <20221205095228.1314-6-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670234762843100001 From: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Marc-Andr=C3=A9 Lureau Signed-off-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Stefan Hajnoczi Message-Id: <20221128202741.4945-3-philmd@linaro.org> --- hw/display/qxl.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/hw/display/qxl.h b/hw/display/qxl.h index e74de9579d..78b3a6c9ba 100644 --- a/hw/display/qxl.h +++ b/hw/display/qxl.h @@ -147,6 +147,25 @@ OBJECT_DECLARE_SIMPLE_TYPE(PCIQXLDevice, PCI_QXL) #define QXL_DEFAULT_REVISION (QXL_REVISION_STABLE_V12 + 1) =20 /* qxl.c */ +/** + * qxl_phys2virt: Get a pointer within a PCI VRAM memory region. + * + * @qxl: QXL device + * @phys: physical offset of buffer within the VRAM + * @group_id: memory slot group + * + * Returns a host pointer to a buffer placed at offset @phys within the + * active slot @group_id of the PCI VGA RAM memory region associated with + * the @qxl device. If the slot is inactive, or the offset is out + * of the memory region, returns NULL. + * + * Use with care; by the time this function returns, the returned pointer = is + * not protected by RCU anymore. If the caller is not within an RCU criti= cal + * section and does not hold the iothread lock, it must have other means of + * protecting the pointer, such as a reference to the region that includes + * the incoming ram_addr_t. + * + */ void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL phys, int group_id); void qxl_set_guest_bug(PCIQXLDevice *qxl, const char *msg, ...) G_GNUC_PRINTF(2, 3); --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670234688; cv=none; d=zohomail.com; s=zohoarc; b=hZ8cMnPcNxRoZno+cQTyxCTu7yUMhj1fZVXfQn6SZH09rK79ohwZtygCC4/3u227axuaRYTMRjnLuDTxFWWZLJuRBybXhuV1zcR4VXTistFOR8lYZZtB/UELGcIjjBVFxwStiHxUYhdRUup+Eg6krWXUqbitpt9RiYAeg1dADeU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670234688; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=jwMT4Bso8g+QZEocTdEaOsjlcxvk1sa133j9SQ/bU+8=; b=TMnEA37Z6lv2POuidQrl98v5zdP+VfjBgDg/ZoUDHEzuMlsOeiPlESDqOEH8oyhUnY4Rs4CrvntErxlFsMbg8xSzs3PJvVFO3U6s3ETK7Egnwj3+LaNnsm/pFT5z1Hdw/XFaKfYF0eyT9Wc6zhU90EN0Pq5WQrWu4tjN3XrnuiM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670234688328921.4722760694243; Mon, 5 Dec 2022 02:04:48 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Aa-00014l-9Y; Mon, 05 Dec 2022 04:53:52 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28AY-00013V-PV for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:53:50 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28AH-0006Tw-SQ for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:53:50 -0500 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-267-Hb6V3QcrONa-b0idYxANAw-1; Mon, 05 Dec 2022 04:53:30 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 9FDE13C0E206; Mon, 5 Dec 2022 09:53:28 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4AF7F2166B29; Mon, 5 Dec 2022 09:53:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234013; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=jwMT4Bso8g+QZEocTdEaOsjlcxvk1sa133j9SQ/bU+8=; b=iaxYstRWYuQUUxDESAoB4VX7sffFMhc3LM/q6uocRaC0fUuGtH6TlL+H/BJTJwQMB/ke6K Shs6BsO8LhSiqKg999FhfBjkdN8gCEdwrSUsNARau6lbPqNUeSChk7cRulWEE8u5BCSMrp uCVMBTrpYqZY8b3Fe6WtZap8h5lEGms= X-MC-Unique: Hb6V3QcrONa-b0idYxANAw-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v2 06/51] hw/display/qxl: Pass requested buffer size to qxl_phys2virt() Date: Mon, 5 Dec 2022 10:51:43 +0100 Message-Id: <20221205095228.1314-7-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_PASS=-0.001, T_SPF_HELO_TEMPERROR=0.01 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670234689423100001 From: Philippe Mathieu-Daud=C3=A9 Currently qxl_phys2virt() doesn't check for buffer overrun. In order to do so in the next commit, pass the buffer size as argument. For QXLCursor in qxl_render_cursor() -> qxl_cursor() we verify the size of the chunked data ahead, checking we can access 'sizeof(QXLCursor) + chunk->data_size' bytes. Since in the SPICE_CURSOR_TYPE_MONO case the cursor is assumed to fit in one chunk, no change are required. In SPICE_CURSOR_TYPE_ALPHA the ahead read is handled in qxl_unpack_chunks(). Signed-off-by: Philippe Mathieu-Daud=C3=A9 Acked-by: Gerd Hoffmann Signed-off-by: Stefan Hajnoczi Message-Id: <20221128202741.4945-4-philmd@linaro.org> --- hw/display/qxl.h | 4 +++- hw/display/qxl-logger.c | 11 ++++++++--- hw/display/qxl-render.c | 20 ++++++++++++++++---- hw/display/qxl.c | 14 +++++++++----- 4 files changed, 36 insertions(+), 13 deletions(-) diff --git a/hw/display/qxl.h b/hw/display/qxl.h index 78b3a6c9ba..bf03138ab4 100644 --- a/hw/display/qxl.h +++ b/hw/display/qxl.h @@ -153,6 +153,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(PCIQXLDevice, PCI_QXL) * @qxl: QXL device * @phys: physical offset of buffer within the VRAM * @group_id: memory slot group + * @size: size of the buffer * * Returns a host pointer to a buffer placed at offset @phys within the * active slot @group_id of the PCI VGA RAM memory region associated with @@ -166,7 +167,8 @@ OBJECT_DECLARE_SIMPLE_TYPE(PCIQXLDevice, PCI_QXL) * the incoming ram_addr_t. * */ -void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL phys, int group_id); +void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL phys, int group_id, + size_t size); void qxl_set_guest_bug(PCIQXLDevice *qxl, const char *msg, ...) G_GNUC_PRINTF(2, 3); =20 diff --git a/hw/display/qxl-logger.c b/hw/display/qxl-logger.c index 1bcf803db6..35c38f6252 100644 --- a/hw/display/qxl-logger.c +++ b/hw/display/qxl-logger.c @@ -106,7 +106,7 @@ static int qxl_log_image(PCIQXLDevice *qxl, QXLPHYSICAL= addr, int group_id) QXLImage *image; QXLImageDescriptor *desc; =20 - image =3D qxl_phys2virt(qxl, addr, group_id); + image =3D qxl_phys2virt(qxl, addr, group_id, sizeof(QXLImage)); if (!image) { return 1; } @@ -214,7 +214,8 @@ int qxl_log_cmd_cursor(PCIQXLDevice *qxl, QXLCursorCmd = *cmd, int group_id) cmd->u.set.position.y, cmd->u.set.visible ? "yes" : "no", cmd->u.set.shape); - cursor =3D qxl_phys2virt(qxl, cmd->u.set.shape, group_id); + cursor =3D qxl_phys2virt(qxl, cmd->u.set.shape, group_id, + sizeof(QXLCursor)); if (!cursor) { return 1; } @@ -236,6 +237,7 @@ int qxl_log_command(PCIQXLDevice *qxl, const char *ring= , QXLCommandExt *ext) { bool compat =3D ext->flags & QXL_COMMAND_FLAG_COMPAT; void *data; + size_t datasz; int ret; =20 if (!qxl->cmdlog) { @@ -249,15 +251,18 @@ int qxl_log_command(PCIQXLDevice *qxl, const char *ri= ng, QXLCommandExt *ext) =20 switch (ext->cmd.type) { case QXL_CMD_DRAW: + datasz =3D compat ? sizeof(QXLCompatDrawable) : sizeof(QXLDrawable= ); break; case QXL_CMD_SURFACE: + datasz =3D sizeof(QXLSurfaceCmd); break; case QXL_CMD_CURSOR: + datasz =3D sizeof(QXLCursorCmd); break; default: goto out; } - data =3D qxl_phys2virt(qxl, ext->cmd.data, ext->group_id); + data =3D qxl_phys2virt(qxl, ext->cmd.data, ext->group_id, datasz); if (!data) { return 1; } diff --git a/hw/display/qxl-render.c b/hw/display/qxl-render.c index ca217004bf..fcfd40c3ac 100644 --- a/hw/display/qxl-render.c +++ b/hw/display/qxl-render.c @@ -107,7 +107,9 @@ static void qxl_render_update_area_unlocked(PCIQXLDevic= e *qxl) qxl->guest_primary.resized =3D 0; qxl->guest_primary.data =3D qxl_phys2virt(qxl, qxl->guest_primary.surface= .mem, - MEMSLOT_GROUP_GUEST); + MEMSLOT_GROUP_GUEST, + qxl->guest_primary.abs_str= ide + * height); if (!qxl->guest_primary.data) { goto end; } @@ -228,7 +230,8 @@ static void qxl_unpack_chunks(void *dest, size_t size, = PCIQXLDevice *qxl, if (offset =3D=3D size) { return; } - chunk =3D qxl_phys2virt(qxl, chunk->next_chunk, group_id); + chunk =3D qxl_phys2virt(qxl, chunk->next_chunk, group_id, + sizeof(QXLDataChunk) + chunk->data_size); if (!chunk) { return; } @@ -295,7 +298,8 @@ fail: /* called from spice server thread context only */ int qxl_render_cursor(PCIQXLDevice *qxl, QXLCommandExt *ext) { - QXLCursorCmd *cmd =3D qxl_phys2virt(qxl, ext->cmd.data, ext->group_id); + QXLCursorCmd *cmd =3D qxl_phys2virt(qxl, ext->cmd.data, ext->group_id, + sizeof(QXLCursorCmd)); QXLCursor *cursor; QEMUCursor *c; =20 @@ -314,7 +318,15 @@ int qxl_render_cursor(PCIQXLDevice *qxl, QXLCommandExt= *ext) } switch (cmd->type) { case QXL_CURSOR_SET: - cursor =3D qxl_phys2virt(qxl, cmd->u.set.shape, ext->group_id); + /* First read the QXLCursor to get QXLDataChunk::data_size ... */ + cursor =3D qxl_phys2virt(qxl, cmd->u.set.shape, ext->group_id, + sizeof(QXLCursor)); + if (!cursor) { + return 1; + } + /* Then read including the chunked data following QXLCursor. */ + cursor =3D qxl_phys2virt(qxl, cmd->u.set.shape, ext->group_id, + sizeof(QXLCursor) + cursor->chunk.data_size= ); if (!cursor) { return 1; } diff --git a/hw/display/qxl.c b/hw/display/qxl.c index 5b10f697f1..231d733250 100644 --- a/hw/display/qxl.c +++ b/hw/display/qxl.c @@ -274,7 +274,8 @@ static void qxl_spice_monitors_config_async(PCIQXLDevic= e *qxl, int replay) QXL_IO_MONITORS_CONFIG_ASYNC)); } =20 - cfg =3D qxl_phys2virt(qxl, qxl->guest_monitors_config, MEMSLOT_GROUP_G= UEST); + cfg =3D qxl_phys2virt(qxl, qxl->guest_monitors_config, MEMSLOT_GROUP_G= UEST, + sizeof(QXLMonitorsConfig)); if (cfg !=3D NULL && cfg->count =3D=3D 1) { qxl->guest_primary.resized =3D 1; qxl->guest_head0_width =3D cfg->heads[0].width; @@ -459,7 +460,8 @@ static int qxl_track_command(PCIQXLDevice *qxl, struct = QXLCommandExt *ext) switch (le32_to_cpu(ext->cmd.type)) { case QXL_CMD_SURFACE: { - QXLSurfaceCmd *cmd =3D qxl_phys2virt(qxl, ext->cmd.data, ext->grou= p_id); + QXLSurfaceCmd *cmd =3D qxl_phys2virt(qxl, ext->cmd.data, ext->grou= p_id, + sizeof(QXLSurfaceCmd)); =20 if (!cmd) { return 1; @@ -494,7 +496,8 @@ static int qxl_track_command(PCIQXLDevice *qxl, struct = QXLCommandExt *ext) } case QXL_CMD_CURSOR: { - QXLCursorCmd *cmd =3D qxl_phys2virt(qxl, ext->cmd.data, ext->group= _id); + QXLCursorCmd *cmd =3D qxl_phys2virt(qxl, ext->cmd.data, ext->group= _id, + sizeof(QXLCursorCmd)); =20 if (!cmd) { return 1; @@ -1456,7 +1459,8 @@ static bool qxl_get_check_slot_offset(PCIQXLDevice *q= xl, QXLPHYSICAL pqxl, } =20 /* can be also called from spice server thread context */ -void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL pqxl, int group_id) +void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL pqxl, int group_id, + size_t size) { uint64_t offset; uint32_t slot; @@ -1964,7 +1968,7 @@ static void qxl_dirty_surfaces(PCIQXLDevice *qxl) } =20 cmd =3D qxl_phys2virt(qxl, qxl->guest_surfaces.cmds[i], - MEMSLOT_GROUP_GUEST); + MEMSLOT_GROUP_GUEST, sizeof(QXLSurfaceCmd)); assert(cmd); assert(cmd->type =3D=3D QXL_SURFACE_CMD_CREATE); qxl_dirty_one_surface(qxl, cmd->u.surface_create.data, --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670234983; cv=none; d=zohomail.com; s=zohoarc; b=RjZjQaPrsiN2pdPOLJjLncxsr08sLxbHRkJlGanDQLn/YcshLPRyDh8hNF+avEb3W5yXxjJdsBbxGyOtov4SZ1i7vfo/rgPgVpgGKxmGl1rpQ69p0CHRz/X8aSgoSskInXjCQkgAqPLf89vQLSGc5/vRqYVfDaN+qi4BuErYWUU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670234983; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=5SGCfToDbM9WhOy+q3kxZx78SijHUnLuNZHHeTrr+MM=; b=QxPvshB5J+WtlIme9iSJNoBqxR0YzIploi9cODekyt+OGbuBAeQa9m0OvBqZKANVt/lA0EMho7s/8McS7qgT2+/eQboZS2pJGqTFaYZNjhYa2zlw+8NZqgGyGUumcWBV4bgSg6KpAm3L4ToOwcAoaT5hn+n1/gI/aEXoajQP26Q= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670234983802421.913577756357; Mon, 5 Dec 2022 02:09:43 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28AT-0000uW-4P; Mon, 05 Dec 2022 04:53:45 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28AQ-0000qd-UI for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:53:42 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28AP-0006Vn-4r for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:53:42 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-654-z77S-848PwCeZE2Tmiy1Ew-1; Mon, 05 Dec 2022 04:53:37 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 8A304862FEC; Mon, 5 Dec 2022 09:53:36 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id ED0652166B29; Mon, 5 Dec 2022 09:53:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234020; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5SGCfToDbM9WhOy+q3kxZx78SijHUnLuNZHHeTrr+MM=; b=dJmSUhZ5zv6IJN8q3hsNbWHtS60OYAQ8jyPQA+rcfoqAI+BMh5dp5vu9prZP7heh12TS4T p5rQCBsXJIW3FUXs2rHaV7w2SmHAxerZlXy8c62ie0QwJYhrO5g9x2a+kifMT/jd4eAbeB bLml/iyDtkSKg9sghBXKBPVe+XaCdJU= X-MC-Unique: z77S-848PwCeZE2Tmiy1Ew-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v2 07/51] hw/display/qxl: Avoid buffer overrun in qxl_phys2virt (CVE-2022-4144) Date: Mon, 5 Dec 2022 10:51:44 +0100 Message-Id: <20221205095228.1314-8-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670234984656100001 From: Philippe Mathieu-Daud=C3=A9 Have qxl_get_check_slot_offset() return false if the requested buffer size does not fit within the slot memory region. Similarly qxl_phys2virt() now returns NULL in such case, and qxl_dirty_one_surface() aborts. This avoids buffer overrun in the host pointer returned by memory_region_get_ram_ptr(). Fixes: CVE-2022-4144 (out-of-bounds read) Reported-by: Wenxu Yin (@awxylitol) Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1336 Signed-off-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Stefan Hajnoczi Message-Id: <20221128202741.4945-5-philmd@linaro.org> --- hw/display/qxl.h | 2 +- hw/display/qxl.c | 27 +++++++++++++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/hw/display/qxl.h b/hw/display/qxl.h index bf03138ab4..7894bd5134 100644 --- a/hw/display/qxl.h +++ b/hw/display/qxl.h @@ -157,7 +157,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(PCIQXLDevice, PCI_QXL) * * Returns a host pointer to a buffer placed at offset @phys within the * active slot @group_id of the PCI VGA RAM memory region associated with - * the @qxl device. If the slot is inactive, or the offset is out + * the @qxl device. If the slot is inactive, or the offset + size are out * of the memory region, returns NULL. * * Use with care; by the time this function returns, the returned pointer = is diff --git a/hw/display/qxl.c b/hw/display/qxl.c index 231d733250..0b21626aad 100644 --- a/hw/display/qxl.c +++ b/hw/display/qxl.c @@ -1424,11 +1424,13 @@ static void qxl_reset_surfaces(PCIQXLDevice *d) =20 /* can be also called from spice server thread context */ static bool qxl_get_check_slot_offset(PCIQXLDevice *qxl, QXLPHYSICAL pqxl, - uint32_t *s, uint64_t *o) + uint32_t *s, uint64_t *o, + size_t size_requested) { uint64_t phys =3D le64_to_cpu(pqxl); uint32_t slot =3D (phys >> (64 - 8)) & 0xff; uint64_t offset =3D phys & 0xffffffffffff; + uint64_t size_available; =20 if (slot >=3D NUM_MEMSLOTS) { qxl_set_guest_bug(qxl, "slot too large %d >=3D %d", slot, @@ -1452,6 +1454,23 @@ static bool qxl_get_check_slot_offset(PCIQXLDevice *= qxl, QXLPHYSICAL pqxl, slot, offset, qxl->guest_slots[slot].size); return false; } + size_available =3D memory_region_size(qxl->guest_slots[slot].mr); + if (qxl->guest_slots[slot].offset + offset >=3D size_available) { + qxl_set_guest_bug(qxl, + "slot %d offset %"PRIu64" > region size %"PRIu64= "\n", + slot, qxl->guest_slots[slot].offset + offset, + size_available); + return false; + } + size_available -=3D qxl->guest_slots[slot].offset + offset; + if (size_requested > size_available) { + qxl_set_guest_bug(qxl, + "slot %d offset %"PRIu64" size %zu: " + "overrun by %"PRIu64" bytes\n", + slot, offset, size_requested, + size_requested - size_available); + return false; + } =20 *s =3D slot; *o =3D offset; @@ -1471,7 +1490,7 @@ void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL pq= xl, int group_id, offset =3D le64_to_cpu(pqxl) & 0xffffffffffff; return (void *)(intptr_t)offset; case MEMSLOT_GROUP_GUEST: - if (!qxl_get_check_slot_offset(qxl, pqxl, &slot, &offset)) { + if (!qxl_get_check_slot_offset(qxl, pqxl, &slot, &offset, size)) { return NULL; } ptr =3D memory_region_get_ram_ptr(qxl->guest_slots[slot].mr); @@ -1937,9 +1956,9 @@ static void qxl_dirty_one_surface(PCIQXLDevice *qxl, = QXLPHYSICAL pqxl, uint32_t slot; bool rc; =20 - rc =3D qxl_get_check_slot_offset(qxl, pqxl, &slot, &offset); - assert(rc =3D=3D true); size =3D (uint64_t)height * abs(stride); + rc =3D qxl_get_check_slot_offset(qxl, pqxl, &slot, &offset, size); + assert(rc =3D=3D true); trace_qxl_surfaces_dirty(qxl->id, offset, size); qxl_set_dirty(qxl->guest_slots[slot].mr, qxl->guest_slots[slot].offset + offset, --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670236721; cv=none; d=zohomail.com; s=zohoarc; b=ikMTgSbJGByyXGEPOWvFLjIisq9ykGwIv+ysIDMqKCxLl1Ga7lJJI2vizKXRTUcBlcVol6e7ESskxSCHOhmNCQWMdHavT641LjtQNpGWAh0993tlPD8QhgVKHem/CaEdS5lhdq6Fd8YAd08ERpewdLYyrvs+jN3NL3p4GjIH+wI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670236721; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=sWawvSWadu0bL+au53S7AJrJqJZVUFdCmV8iHivocyk=; b=fJuIOHSIyeaR1Q0X1rU/VcW/d+RBWu9uswEEFR4RsKZ+VGVYhB3SGCuHjCgXiZod0Ymr9uncASYXTt3XmZh6iV4OF/xTMZ8lGe4dkLwjt/UPXlWj9jWpDeFhGc/m4+6k1IJCBBvVFTJ8SU2DF74yK+oObtv0b2k0fR1Vvgibpeg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670236721489370.7223501058968; Mon, 5 Dec 2022 02:38:41 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Ad-00016j-2k; Mon, 05 Dec 2022 04:53:55 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Ab-00015L-Kj for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:53:53 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Aa-0006Y3-3R for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:53:53 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-392-aAy9LTFLPj6yCjW41-Z7hg-1; Mon, 05 Dec 2022 04:53:45 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 2C0F185A588; Mon, 5 Dec 2022 09:53:44 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id D73122166B29; Mon, 5 Dec 2022 09:53:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234031; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=sWawvSWadu0bL+au53S7AJrJqJZVUFdCmV8iHivocyk=; b=C8yFVILyjXiZ8kqUpyh2yX8GLEPMRRIOjIGzEMcnfkvRVNGsMXW2qkX/5neNej0B30/nYo ZgJ6Eb1BITUaGFfiPUavsvDOV/Lu+nFp/7AgssL+xuWvEWE6WcgDUwq/9kKS62CgtoWnVx jIC0LIzwVgXLkKw9Rc3SRpnDh+g5uVs= X-MC-Unique: aAy9LTFLPj6yCjW41-Z7hg-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v2 08/51] hw/display/qxl: Assert memory slot fits in preallocated MemoryRegion Date: Mon, 5 Dec 2022 10:51:45 +0100 Message-Id: <20221205095228.1314-9-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670236722567100003 From: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Stefan Hajnoczi Message-Id: <20221128202741.4945-6-philmd@linaro.org> --- hw/display/qxl.c | 1 + 1 file changed, 1 insertion(+) diff --git a/hw/display/qxl.c b/hw/display/qxl.c index 0b21626aad..6772849dec 100644 --- a/hw/display/qxl.c +++ b/hw/display/qxl.c @@ -1384,6 +1384,7 @@ static int qxl_add_memslot(PCIQXLDevice *d, uint32_t = slot_id, uint64_t delta, qxl_set_guest_bug(d, "%s: pci_region =3D %d", __func__, pci_region= ); return 1; } + assert(guest_end - pci_start <=3D memory_region_size(mr)); =20 virt_start =3D (intptr_t)memory_region_get_ram_ptr(mr); memslot.slot_id =3D slot_id; --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670234105; cv=none; d=zohomail.com; s=zohoarc; b=R/UirN1SL1uFgu3UvLoFKB2MGXYAvMfxXjb4d2WZ1oPYyt9fe/+sPH3jqk+xUpM0fp0SSJCvnehEZfWBUNlDpFVrEQyKfrjkjEuzeDKyPnnawHOtGqqLQw/mrgBIDAbvlpA6GD/vtx2VfrFXdWmV39iMa0KmYe6AVEmsiKj/1ho= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670234105; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Yv32VybYVhxmtkUKSRTxJbrtrMCQayUU3iWUHvoUh0A=; b=aUDNE1yu2uBlWsDbl/tdM/zHoUZUcpQO83YFjjFFoBYPrKXKc7MH47BEBONT+w2EV1C4YjhsWGebNsV7rW66mnKR2Gi3kmbq2EuhtpdziE6w3ZLD9mSnl4k6oS3zlR5g/iW61amhJpwmTtNNnUPl/XIgKD3mDlK1MavcaBno9K4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670234105182429.7918474909353; Mon, 5 Dec 2022 01:55:05 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Ak-0001Dc-UV; Mon, 05 Dec 2022 04:54:03 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Aj-0001B1-4K for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:54:01 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Af-0006YW-EM for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:53:59 -0500 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-553-4ZY-NG3LODKLWCT2EFEwLQ-1; Mon, 05 Dec 2022 04:53:53 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 26DC53C0F663; Mon, 5 Dec 2022 09:53:52 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7A9DD2166B29; Mon, 5 Dec 2022 09:53:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234036; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Yv32VybYVhxmtkUKSRTxJbrtrMCQayUU3iWUHvoUh0A=; b=CVrFhvGDbIJBawFCUO1V5nQ3tkm+tMTHYJykUOXQyKmmz9cC2JmscAg4BFMnW9p9IxiZbL O/wvTxYmP5Hj+FfJwf8ZBwcKLOAs8whSMF6PkNxNyiN8rGcBKE0LF1lj2jRJm2vcW12hZQ L2BIuSA27pqhZIA21ZB+bg6YTWGmcck= X-MC-Unique: 4ZY-NG3LODKLWCT2EFEwLQ-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Jonathan Cameron , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v2 09/51] block-backend: avoid bdrv_unregister_buf() NULL pointer deref Date: Mon, 5 Dec 2022 10:51:46 +0100 Message-Id: <20221205095228.1314-10-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670234107407100003 From: Stefan Hajnoczi bdrv_*() APIs expect a valid BlockDriverState. Calling them with bs=3DNULL leads to undefined behavior. Jonathan Cameron reported this following NULL pointer dereference when a VM with a virtio-blk device and a memory-backend-file object is terminated: 1. qemu_cleanup() closes all drives, setting blk->root to NULL 2. qemu_cleanup() calls user_creatable_cleanup(), which results in a RAM block notifier callback because the memory-backend-file is destroyed. 3. blk_unregister_buf() is called by virtio-blk's BlockRamRegistrar notifier callback and undefined behavior occurs. Fixes: baf422684d73 ("virtio-blk: use BDRV_REQ_REGISTERED_BUF optimization = hint") Co-authored-by: Jonathan Cameron Reviewed-by: Kevin Wolf Reviewed-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Stefan Hajnoczi Message-Id: <20221121211923.1993171-1-stefanha@redhat.com> --- block/block-backend.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/block/block-backend.c b/block/block-backend.c index b48c91f4e1..d98a96ff37 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -2576,14 +2576,25 @@ static void blk_root_drained_end(BdrvChild *child, = int *drained_end_counter) =20 bool blk_register_buf(BlockBackend *blk, void *host, size_t size, Error **= errp) { + BlockDriverState *bs =3D blk_bs(blk); + GLOBAL_STATE_CODE(); - return bdrv_register_buf(blk_bs(blk), host, size, errp); + + if (bs) { + return bdrv_register_buf(bs, host, size, errp); + } + return true; } =20 void blk_unregister_buf(BlockBackend *blk, void *host, size_t size) { + BlockDriverState *bs =3D blk_bs(blk); + GLOBAL_STATE_CODE(); - bdrv_unregister_buf(blk_bs(blk), host, size); + + if (bs) { + bdrv_unregister_buf(bs, host, size); + } } =20 int coroutine_fn blk_co_copy_range(BlockBackend *blk_in, int64_t off_in, --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670236054; cv=none; d=zohomail.com; s=zohoarc; b=WT7/M5skcx68W6H0wG0agp+IHzrs33latSR8AzkVw1KjexcSW2U7/mL2k41YusHO4p35hxLyNRA9i+ohZs605mZuKBNgW3bSV6eQ6XRgoM9njyvnVQmmfZz4rlgQzBofBIdetbG3bbq9c3eYqwzpin8YV5b4pVxYBD4GX4b94b8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670236054; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=QGsT94LJsQpjrOeUhrN/Lye50j+vEUGPnyUCzBtYNtE=; b=iY+QePKthFgKn50TZT6qdUcXLt5Stwg8Fs8LG5lNW8vPJlkReJ+1Q3Z9lLzHiKZDZJ3hZ/+n5FWIh6eXIbG7QQQhkcyUWizvflGWTden2QbQVScXysP+aD8j0n1gLyS84xKSq0bPg322xyh7ycnjaONWHcue6i6NAScLB7Cv9HE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670236054461602.0866603934486; Mon, 5 Dec 2022 02:27:34 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28B3-0001a6-6x; Mon, 05 Dec 2022 04:54:21 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Aq-0001ON-0Y for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:54:09 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28An-0006cN-72 for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:54:07 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-258-bPnN0Ow8OEe5yPQXjP4OrQ-1; Mon, 05 Dec 2022 04:54:01 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id C595285A59D; Mon, 5 Dec 2022 09:53:59 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7B2282166B29; Mon, 5 Dec 2022 09:53:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234044; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QGsT94LJsQpjrOeUhrN/Lye50j+vEUGPnyUCzBtYNtE=; b=bH2XXUuVtKmwULNxmVsPJ+un6nhnoJPdJBQlNlXTjAWyJAzKZwVRDwTLQoeZtiqL9TQUx/ zP/I6eHmFiWFRy8aqRsLDtQeliiWop2tH9XJYu00z5kdpiWrxM98WfoGdGylbCKd9qcwUe 9YxmnYMVxGXaleoq/kpA56+9h695ixc= X-MC-Unique: bPnN0Ow8OEe5yPQXjP4OrQ-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Evgeny Ermakov Subject: [PATCH v2 10/51] target/arm: Set TCGCPUOps.restore_state_to_opc for v7m Date: Mon, 5 Dec 2022 10:51:47 +0100 Message-Id: <20221205095228.1314-11-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670236055253100001 Content-Type: text/plain; charset="utf-8" From: Evgeny Ermakov This setting got missed, breaking v7m. Fixes: 56c6c98df85c ("target/arm: Convert to tcg_ops restore_state_to_opc") Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1347 Signed-off-by: Richard Henderson Signed-off-by: Evgeny Ermakov Signed-off-by: Stefan Hajnoczi Message-Id: <20221129204146.550394-1-richard.henderson@linaro.org> --- target/arm/internals.h | 4 ++++ target/arm/cpu.c | 6 +++--- target/arm/cpu_tcg.c | 1 + 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/target/arm/internals.h b/target/arm/internals.h index d9121d9ff8..161e42d50f 100644 --- a/target/arm/internals.h +++ b/target/arm/internals.h @@ -185,6 +185,10 @@ static inline int r14_bank_number(int mode) void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu); void arm_translate_init(void); =20 +void arm_restore_state_to_opc(CPUState *cs, + const TranslationBlock *tb, + const uint64_t *data); + #ifdef CONFIG_TCG void arm_cpu_synchronize_from_tb(CPUState *cs, const TranslationBlock *tb); #endif /* CONFIG_TCG */ diff --git a/target/arm/cpu.c b/target/arm/cpu.c index a021df9e9e..38d066c294 100644 --- a/target/arm/cpu.c +++ b/target/arm/cpu.c @@ -91,9 +91,9 @@ void arm_cpu_synchronize_from_tb(CPUState *cs, } } =20 -static void arm_restore_state_to_opc(CPUState *cs, - const TranslationBlock *tb, - const uint64_t *data) +void arm_restore_state_to_opc(CPUState *cs, + const TranslationBlock *tb, + const uint64_t *data) { CPUARMState *env =3D cs->env_ptr; =20 diff --git a/target/arm/cpu_tcg.c b/target/arm/cpu_tcg.c index 60ff539fa1..9a2cef7d05 100644 --- a/target/arm/cpu_tcg.c +++ b/target/arm/cpu_tcg.c @@ -1035,6 +1035,7 @@ static const struct TCGCPUOps arm_v7m_tcg_ops =3D { .initialize =3D arm_translate_init, .synchronize_from_tb =3D arm_cpu_synchronize_from_tb, .debug_excp_handler =3D arm_debug_excp_handler, + .restore_state_to_opc =3D arm_restore_state_to_opc, =20 #ifdef CONFIG_USER_ONLY .record_sigsegv =3D arm_cpu_record_sigsegv, --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670235367; cv=none; d=zohomail.com; s=zohoarc; b=f7oeEV/LrqycFtOad7sO8Kz0tsaKejLFpXjsfUcWNkohsWEAGK3YD7MaGQX3Xa9ZVcoOmIPC5tWOWXL/EUKQhvhabgSxmcgvEsXwSGdxJh2GBv6N0mj0KY7JBJx4r9N22aFIvJQ4ZdYEdAUb3h8Rl1g3qBFOx38MsHvn7AtfOw0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670235367; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=A58yn8gbgM6uMQJ3134uqu6AR7IEA8M1jgXqbvIAcqs=; b=Er9EZYajL8X37DKfamM2Tc8kC+QNVrC1BiuzFjA85FmKNgmQGOlEoRHGs1mwYsNuFrTb2pbpRHxcULpmOttcM70IfootR/VEXfAcaUE0DW0U6KYo8BO9A8HrBm0hpLVY0vJTnHR/Ad7zR7hE07MNxhsTjdKMlppzwPEixvkPfrg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670235367180557.4528443184179; Mon, 5 Dec 2022 02:16:07 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28B7-0001en-Bz; Mon, 05 Dec 2022 04:54:25 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Ax-0001X9-Jt for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:54:19 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Au-0006es-RZ for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:54:14 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-201-Gnhs0bJhMzKaVwmFU5Zkpg-1; Mon, 05 Dec 2022 04:54:08 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 54A4B185A7AA; Mon, 5 Dec 2022 09:54:07 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1E7FA2166B29; Mon, 5 Dec 2022 09:53:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234052; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=A58yn8gbgM6uMQJ3134uqu6AR7IEA8M1jgXqbvIAcqs=; b=diwtWlNkd29LTQYqRjCbElxeIW4c/FEWL+q+aKDSlv9HOo1fsbXYdKFyHoiUMopLFh0RVB mynu/A27Crpb8hnErlPQymrwTu/FREA1xoyq8mofvAju12/p2wxRnEBjM3PnvHpZOQRzY/ bGUY0LFY5i5qm3OPs+F9gKGPtp2v2yE= X-MC-Unique: Gnhs0bJhMzKaVwmFU5Zkpg-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz Subject: [PATCH v2 11/51] Update VERSION for v7.2.0-rc3 Date: Mon, 5 Dec 2022 10:51:48 +0100 Message-Id: <20221205095228.1314-12-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670235367970100003 Content-Type: text/plain; charset="utf-8" From: Stefan Hajnoczi Signed-off-by: Stefan Hajnoczi --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 02998662dd..1c24435536 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -7.1.92 +7.1.93 --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670234348; cv=none; d=zohomail.com; s=zohoarc; b=OyD5qULo9xUuCN7LPSXM3/HjwCbonZv05J5vCjMl8BrLqShMUgHg3AC/hKUvSaQmSCvAIHO4XC2tLHDQobPJXdeersamCBahSh/T/nt/i2e3JCcdoGucoy/r4tnGCPBIR8i2pbxlHVMVRRjSe4S/tZW1xr0wevVrep77E17M1+I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670234348; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=JzR6LoP80zahpbmKbQVOVIoUoQ6EpDTG7DyoVVDdz14=; b=cGJSwnjpOgc2OMBQC3zr+eQ8RGrBrJr14vn9Y5OoVuTDcb6Fo4r8c2mKHWkjSJWOhEjudGZJAURjFxqF9gJiBbhPb5DNn23F9KcrVVqIoVQxT0DMdpUmgrdPwdMhCuC84XaG+/sowIw9CQNAEsFvTmOLlJzEAm1yJP0UOVQHFMg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670234348440926.4310953615492; Mon, 5 Dec 2022 01:59:08 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28B9-0001hZ-IH; Mon, 05 Dec 2022 04:54:27 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28B5-0001be-8w for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:54:24 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28B3-0006ga-Ob for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:54:23 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-648-V-jSwxfUPjSLf24igefaqw-1; Mon, 05 Dec 2022 04:54:15 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id CBA01101A54E; Mon, 5 Dec 2022 09:54:14 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id A245F2166B29; Mon, 5 Dec 2022 09:54:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234061; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JzR6LoP80zahpbmKbQVOVIoUoQ6EpDTG7DyoVVDdz14=; b=bEjnPzKfJlIs3/gwzjcfRzawCwEirnI2v6v8hxfj6ge9EVNXY9gqlwlMjJgGy/C8hjU9nG UItlqBwNdmMHu45oMINSq2EaUZ8tIqT3uLE7Ijjvf84Hl+lPbkijpmnSD2A4C/d1X6QL2Q fHn6n2xCSrvqXaiZ+x2Od86PAFPRVqU= X-MC-Unique: V-jSwxfUPjSLf24igefaqw-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz Subject: [PATCH v2 12/51] tests/qtests: override "force-legacy" for gpio virtio-mmio tests Date: Mon, 5 Dec 2022 10:51:49 +0100 Message-Id: <20221205095228.1314-13-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670234350809100001 From: Alex Benn=C3=A9e The GPIO device is a VIRTIO_F_VERSION_1 devices but running with a legacy MMIO interface we miss out that feature bit causing confusion. For the GPIO test force the mmio bus to support non-legacy so we can properly test it. Signed-off-by: Alex Benn=C3=A9e Reviewed-by: Michael S. Tsirkin Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1333 Message-Id: <20221130112439.2527228-2-alex.bennee@linaro.org> Acked-by: Thomas Huth Signed-off-by: Michael S. Tsirkin --- tests/qtest/libqos/virtio-gpio.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/qtest/libqos/virtio-gpio.c b/tests/qtest/libqos/virtio-g= pio.c index 762aa6695b..f22d7b5eb5 100644 --- a/tests/qtest/libqos/virtio-gpio.c +++ b/tests/qtest/libqos/virtio-gpio.c @@ -154,7 +154,8 @@ static void virtio_gpio_register_nodes(void) QOSGraphEdgeOptions edge_opts =3D { }; =20 /* vhost-user-gpio-device */ - edge_opts.extra_device_opts =3D "id=3Dgpio0,chardev=3Dchr-vhost-user-t= est"; + edge_opts.extra_device_opts =3D "id=3Dgpio0,chardev=3Dchr-vhost-user-t= est " + "-global virtio-mmio.force-legacy=3Dfalse"; qos_node_create_driver("vhost-user-gpio-device", virtio_gpio_device_create); qos_node_consumes("vhost-user-gpio-device", "virtio-bus", &edge_opts); --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670234919; cv=none; d=zohomail.com; s=zohoarc; b=NCnSkolchHSztv7rPWj+PCKcFWfgGg1vNItbj/zaP7ilBXZHPmvqThqljD4HsTSkz4NKmsEQrul8ERXd7HJ2IYjW7xDFctcyVZSO+gXQiTbaU+Eyx0cDNAbB4eeku50PeTmoZwnwSHiae+DghRfYTSvugTqHK4lbTzJIvepK3vY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670234919; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=xTlOQWChXM/c2jwVa3bhyJTvFhh8SezMfH/mGOf+EIs=; b=b/RnxxZvbECRCPu3VjdIPMTR1FGuRN8bDGkXqZdiCdi9gzfJv5EeV9y1O5mRJk6sZv65DWgjjtyK4GQE+hiIqzOb0nNhlMhg08DqkgsnvP2jR7vYTIFWjJ84BO0JTIepbImOErdPWrcjyuviYKPM2ya6bIS66S6ty8hf3n2L/Uw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670234919496929.4922318357089; Mon, 5 Dec 2022 02:08:39 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Bb-00025p-Lo; Mon, 05 Dec 2022 04:54:55 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28BK-0001sP-2k for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:54:41 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28BB-0006oF-PA for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:54:37 -0500 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-146-L7n5AMHkNJOVyYVdch-olQ-1; Mon, 05 Dec 2022 04:54:24 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id C21C41C00149; Mon, 5 Dec 2022 09:54:22 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 28DCB2166B29; Mon, 5 Dec 2022 09:54:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234068; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=xTlOQWChXM/c2jwVa3bhyJTvFhh8SezMfH/mGOf+EIs=; b=IoSqDu194lzSr8cakQIqxse4xHdRIBSjeAN5k0eOFfv/l760Rn/uwJvn+wPzmRFlxu8IVS J3uyIhou5Y6iP7+LLUio8EGa9lgl3H3OyJHl6DhZT0XqBGh/INxmsVxTIc+qYbU2C84+f1 HAiedPqzleJyVUhaSTKgFB3T6s58CTc= X-MC-Unique: L7n5AMHkNJOVyYVdch-olQ-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Stefano Garzarella , German Maglione Subject: [PATCH v2 13/51] vhost: enable vrings in vhost_dev_start() for vhost-user devices Date: Mon, 5 Dec 2022 10:51:50 +0100 Message-Id: <20221205095228.1314-14-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670234921482100003 From: Stefano Garzarella Commit 02b61f38d3 ("hw/virtio: incorporate backend features in features") properly negotiates VHOST_USER_F_PROTOCOL_FEATURES with the vhost-user backend, but we forgot to enable vrings as specified in docs/interop/vhost-user.rst: If ``VHOST_USER_F_PROTOCOL_FEATURES`` has not been negotiated, the ring starts directly in the enabled state. If ``VHOST_USER_F_PROTOCOL_FEATURES`` has been negotiated, the ring is initialized in a disabled state and is enabled by ``VHOST_USER_SET_VRING_ENABLE`` with parameter 1. Some vhost-user front-ends already did this by calling vhost_ops.vhost_set_vring_enable() directly: - backends/cryptodev-vhost.c - hw/net/virtio-net.c - hw/virtio/vhost-user-gpio.c But most didn't do that, so we would leave the vrings disabled and some backends would not work. We observed this issue with the rust version of virtiofsd [1], which uses the event loop [2] provided by the vhost-user-backend crate where requests are not processed if vring is not enabled. Let's fix this issue by enabling the vrings in vhost_dev_start() for vhost-user front-ends that don't already do this directly. Same thing also in vhost_dev_stop() where we disable vrings. [1] https://gitlab.com/virtio-fs/virtiofsd [2] https://github.com/rust-vmm/vhost/blob/240fc2966/crates/vhost-user-back= end/src/event_loop.rs#L217 Fixes: 02b61f38d3 ("hw/virtio: incorporate backend features in features") Reported-by: German Maglione Tested-by: German Maglione Signed-off-by: Stefano Garzarella Acked-by: Raphael Norwitz Message-Id: <20221123131630.52020-1-sgarzare@redhat.com> Signed-off-by: Alex Benn=C3=A9e Reviewed-by: Michael S. Tsirkin Message-Id: <20221130112439.2527228-3-alex.bennee@linaro.org> Signed-off-by: Michael S. Tsirkin --- include/hw/virtio/vhost.h | 6 +++-- backends/cryptodev-vhost.c | 4 ++-- backends/vhost-user.c | 4 ++-- hw/block/vhost-user-blk.c | 4 ++-- hw/net/vhost_net.c | 8 +++---- hw/scsi/vhost-scsi-common.c | 4 ++-- hw/virtio/vhost-user-fs.c | 4 ++-- hw/virtio/vhost-user-gpio.c | 4 ++-- hw/virtio/vhost-user-i2c.c | 4 ++-- hw/virtio/vhost-user-rng.c | 4 ++-- hw/virtio/vhost-vsock-common.c | 4 ++-- hw/virtio/vhost.c | 44 ++++++++++++++++++++++++++++++---- hw/virtio/trace-events | 4 ++-- 13 files changed, 67 insertions(+), 31 deletions(-) diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h index 353252ac3e..67a6807fac 100644 --- a/include/hw/virtio/vhost.h +++ b/include/hw/virtio/vhost.h @@ -184,24 +184,26 @@ static inline bool vhost_dev_is_started(struct vhost_= dev *hdev) * vhost_dev_start() - start the vhost device * @hdev: common vhost_dev structure * @vdev: the VirtIODevice structure + * @vrings: true to have vrings enabled in this call * * Starts the vhost device. From this point VirtIO feature negotiation * can start and the device can start processing VirtIO transactions. * * Return: 0 on success, < 0 on error. */ -int vhost_dev_start(struct vhost_dev *hdev, VirtIODevice *vdev); +int vhost_dev_start(struct vhost_dev *hdev, VirtIODevice *vdev, bool vring= s); =20 /** * vhost_dev_stop() - stop the vhost device * @hdev: common vhost_dev structure * @vdev: the VirtIODevice structure + * @vrings: true to have vrings disabled in this call * * Stop the vhost device. After the device is stopped the notifiers * can be disabled (@vhost_dev_disable_notifiers) and the device can * be torn down (@vhost_dev_cleanup). */ -void vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev); +void vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev, bool vring= s); =20 /** * DOC: vhost device configuration handling diff --git a/backends/cryptodev-vhost.c b/backends/cryptodev-vhost.c index bc13e466b4..572f87b3be 100644 --- a/backends/cryptodev-vhost.c +++ b/backends/cryptodev-vhost.c @@ -94,7 +94,7 @@ cryptodev_vhost_start_one(CryptoDevBackendVhost *crypto, goto fail_notifiers; } =20 - r =3D vhost_dev_start(&crypto->dev, dev); + r =3D vhost_dev_start(&crypto->dev, dev, false); if (r < 0) { goto fail_start; } @@ -111,7 +111,7 @@ static void cryptodev_vhost_stop_one(CryptoDevBackendVhost *crypto, VirtIODevice *dev) { - vhost_dev_stop(&crypto->dev, dev); + vhost_dev_stop(&crypto->dev, dev, false); vhost_dev_disable_notifiers(&crypto->dev, dev); } =20 diff --git a/backends/vhost-user.c b/backends/vhost-user.c index 5dedb2d987..7bfcaef976 100644 --- a/backends/vhost-user.c +++ b/backends/vhost-user.c @@ -85,7 +85,7 @@ vhost_user_backend_start(VhostUserBackend *b) } =20 b->dev.acked_features =3D b->vdev->guest_features; - ret =3D vhost_dev_start(&b->dev, b->vdev); + ret =3D vhost_dev_start(&b->dev, b->vdev, true); if (ret < 0) { error_report("Error start vhost dev"); goto err_guest_notifiers; @@ -120,7 +120,7 @@ vhost_user_backend_stop(VhostUserBackend *b) return; } =20 - vhost_dev_stop(&b->dev, b->vdev); + vhost_dev_stop(&b->dev, b->vdev, true); =20 if (k->set_guest_notifiers) { ret =3D k->set_guest_notifiers(qbus->parent, diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c index 0d5190accf..1177064631 100644 --- a/hw/block/vhost-user-blk.c +++ b/hw/block/vhost-user-blk.c @@ -178,7 +178,7 @@ static int vhost_user_blk_start(VirtIODevice *vdev, Err= or **errp) } =20 s->dev.vq_index_end =3D s->dev.nvqs; - ret =3D vhost_dev_start(&s->dev, vdev); + ret =3D vhost_dev_start(&s->dev, vdev, true); if (ret < 0) { error_setg_errno(errp, -ret, "Error starting vhost"); goto err_guest_notifiers; @@ -213,7 +213,7 @@ static void vhost_user_blk_stop(VirtIODevice *vdev) return; } =20 - vhost_dev_stop(&s->dev, vdev); + vhost_dev_stop(&s->dev, vdev, true); =20 ret =3D k->set_guest_notifiers(qbus->parent, s->dev.nvqs, false); if (ret < 0) { diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c index 26e4930676..043058ff43 100644 --- a/hw/net/vhost_net.c +++ b/hw/net/vhost_net.c @@ -259,7 +259,7 @@ static int vhost_net_start_one(struct vhost_net *net, goto fail_notifiers; } =20 - r =3D vhost_dev_start(&net->dev, dev); + r =3D vhost_dev_start(&net->dev, dev, false); if (r < 0) { goto fail_start; } @@ -308,7 +308,7 @@ fail: if (net->nc->info->poll) { net->nc->info->poll(net->nc, true); } - vhost_dev_stop(&net->dev, dev); + vhost_dev_stop(&net->dev, dev, false); fail_start: vhost_dev_disable_notifiers(&net->dev, dev); fail_notifiers: @@ -329,7 +329,7 @@ static void vhost_net_stop_one(struct vhost_net *net, if (net->nc->info->poll) { net->nc->info->poll(net->nc, true); } - vhost_dev_stop(&net->dev, dev); + vhost_dev_stop(&net->dev, dev, false); if (net->nc->info->stop) { net->nc->info->stop(net->nc); } @@ -606,7 +606,7 @@ err_start: assert(r >=3D 0); } =20 - vhost_dev_stop(&net->dev, vdev); + vhost_dev_stop(&net->dev, vdev, false); =20 return r; } diff --git a/hw/scsi/vhost-scsi-common.c b/hw/scsi/vhost-scsi-common.c index 767f827e55..18ea5dcfa1 100644 --- a/hw/scsi/vhost-scsi-common.c +++ b/hw/scsi/vhost-scsi-common.c @@ -68,7 +68,7 @@ int vhost_scsi_common_start(VHostSCSICommon *vsc) goto err_guest_notifiers; } =20 - ret =3D vhost_dev_start(&vsc->dev, vdev); + ret =3D vhost_dev_start(&vsc->dev, vdev, true); if (ret < 0) { error_report("Error start vhost dev"); goto err_guest_notifiers; @@ -101,7 +101,7 @@ void vhost_scsi_common_stop(VHostSCSICommon *vsc) VirtioBusClass *k =3D VIRTIO_BUS_GET_CLASS(qbus); int ret =3D 0; =20 - vhost_dev_stop(&vsc->dev, vdev); + vhost_dev_stop(&vsc->dev, vdev, true); =20 if (k->set_guest_notifiers) { ret =3D k->set_guest_notifiers(qbus->parent, vsc->dev.nvqs, false); diff --git a/hw/virtio/vhost-user-fs.c b/hw/virtio/vhost-user-fs.c index dc4014cdef..d97b179e6f 100644 --- a/hw/virtio/vhost-user-fs.c +++ b/hw/virtio/vhost-user-fs.c @@ -76,7 +76,7 @@ static void vuf_start(VirtIODevice *vdev) } =20 fs->vhost_dev.acked_features =3D vdev->guest_features; - ret =3D vhost_dev_start(&fs->vhost_dev, vdev); + ret =3D vhost_dev_start(&fs->vhost_dev, vdev, true); if (ret < 0) { error_report("Error starting vhost: %d", -ret); goto err_guest_notifiers; @@ -110,7 +110,7 @@ static void vuf_stop(VirtIODevice *vdev) return; } =20 - vhost_dev_stop(&fs->vhost_dev, vdev); + vhost_dev_stop(&fs->vhost_dev, vdev, true); =20 ret =3D k->set_guest_notifiers(qbus->parent, fs->vhost_dev.nvqs, false= ); if (ret < 0) { diff --git a/hw/virtio/vhost-user-gpio.c b/hw/virtio/vhost-user-gpio.c index 5851cb3bc9..0b40ebd15a 100644 --- a/hw/virtio/vhost-user-gpio.c +++ b/hw/virtio/vhost-user-gpio.c @@ -81,7 +81,7 @@ static int vu_gpio_start(VirtIODevice *vdev) */ vhost_ack_features(&gpio->vhost_dev, feature_bits, vdev->guest_feature= s); =20 - ret =3D vhost_dev_start(&gpio->vhost_dev, vdev); + ret =3D vhost_dev_start(&gpio->vhost_dev, vdev, false); if (ret < 0) { error_report("Error starting vhost-user-gpio: %d", ret); goto err_guest_notifiers; @@ -139,7 +139,7 @@ static void vu_gpio_stop(VirtIODevice *vdev) return; } =20 - vhost_dev_stop(vhost_dev, vdev); + vhost_dev_stop(vhost_dev, vdev, false); =20 ret =3D k->set_guest_notifiers(qbus->parent, vhost_dev->nvqs, false); if (ret < 0) { diff --git a/hw/virtio/vhost-user-i2c.c b/hw/virtio/vhost-user-i2c.c index 1c9f3d20dc..dc5c828ba6 100644 --- a/hw/virtio/vhost-user-i2c.c +++ b/hw/virtio/vhost-user-i2c.c @@ -46,7 +46,7 @@ static void vu_i2c_start(VirtIODevice *vdev) =20 i2c->vhost_dev.acked_features =3D vdev->guest_features; =20 - ret =3D vhost_dev_start(&i2c->vhost_dev, vdev); + ret =3D vhost_dev_start(&i2c->vhost_dev, vdev, true); if (ret < 0) { error_report("Error starting vhost-user-i2c: %d", -ret); goto err_guest_notifiers; @@ -80,7 +80,7 @@ static void vu_i2c_stop(VirtIODevice *vdev) return; } =20 - vhost_dev_stop(&i2c->vhost_dev, vdev); + vhost_dev_stop(&i2c->vhost_dev, vdev, true); =20 ret =3D k->set_guest_notifiers(qbus->parent, i2c->vhost_dev.nvqs, fals= e); if (ret < 0) { diff --git a/hw/virtio/vhost-user-rng.c b/hw/virtio/vhost-user-rng.c index f9084cde58..201a39e220 100644 --- a/hw/virtio/vhost-user-rng.c +++ b/hw/virtio/vhost-user-rng.c @@ -47,7 +47,7 @@ static void vu_rng_start(VirtIODevice *vdev) } =20 rng->vhost_dev.acked_features =3D vdev->guest_features; - ret =3D vhost_dev_start(&rng->vhost_dev, vdev); + ret =3D vhost_dev_start(&rng->vhost_dev, vdev, true); if (ret < 0) { error_report("Error starting vhost-user-rng: %d", -ret); goto err_guest_notifiers; @@ -81,7 +81,7 @@ static void vu_rng_stop(VirtIODevice *vdev) return; } =20 - vhost_dev_stop(&rng->vhost_dev, vdev); + vhost_dev_stop(&rng->vhost_dev, vdev, true); =20 ret =3D k->set_guest_notifiers(qbus->parent, rng->vhost_dev.nvqs, fals= e); if (ret < 0) { diff --git a/hw/virtio/vhost-vsock-common.c b/hw/virtio/vhost-vsock-common.c index a67a275de2..d21c72b401 100644 --- a/hw/virtio/vhost-vsock-common.c +++ b/hw/virtio/vhost-vsock-common.c @@ -70,7 +70,7 @@ int vhost_vsock_common_start(VirtIODevice *vdev) } =20 vvc->vhost_dev.acked_features =3D vdev->guest_features; - ret =3D vhost_dev_start(&vvc->vhost_dev, vdev); + ret =3D vhost_dev_start(&vvc->vhost_dev, vdev, true); if (ret < 0) { error_report("Error starting vhost: %d", -ret); goto err_guest_notifiers; @@ -105,7 +105,7 @@ void vhost_vsock_common_stop(VirtIODevice *vdev) return; } =20 - vhost_dev_stop(&vvc->vhost_dev, vdev); + vhost_dev_stop(&vvc->vhost_dev, vdev, true); =20 ret =3D k->set_guest_notifiers(qbus->parent, vvc->vhost_dev.nvqs, fals= e); if (ret < 0) { diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index d1c4c20b8c..7fb008bc9e 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -1777,15 +1777,36 @@ int vhost_dev_get_inflight(struct vhost_dev *dev, u= int16_t queue_size, return 0; } =20 +static int vhost_dev_set_vring_enable(struct vhost_dev *hdev, int enable) +{ + if (!hdev->vhost_ops->vhost_set_vring_enable) { + return 0; + } + + /* + * For vhost-user devices, if VHOST_USER_F_PROTOCOL_FEATURES has not + * been negotiated, the rings start directly in the enabled state, and + * .vhost_set_vring_enable callback will fail since + * VHOST_USER_SET_VRING_ENABLE is not supported. + */ + if (hdev->vhost_ops->backend_type =3D=3D VHOST_BACKEND_TYPE_USER && + !virtio_has_feature(hdev->backend_features, + VHOST_USER_F_PROTOCOL_FEATURES)) { + return 0; + } + + return hdev->vhost_ops->vhost_set_vring_enable(hdev, enable); +} + /* Host notifiers must be enabled at this point. */ -int vhost_dev_start(struct vhost_dev *hdev, VirtIODevice *vdev) +int vhost_dev_start(struct vhost_dev *hdev, VirtIODevice *vdev, bool vring= s) { int i, r; =20 /* should only be called after backend is connected */ assert(hdev->vhost_ops); =20 - trace_vhost_dev_start(hdev, vdev->name); + trace_vhost_dev_start(hdev, vdev->name, vrings); =20 vdev->vhost_started =3D true; hdev->started =3D true; @@ -1830,10 +1851,16 @@ int vhost_dev_start(struct vhost_dev *hdev, VirtIOD= evice *vdev) goto fail_log; } } + if (vrings) { + r =3D vhost_dev_set_vring_enable(hdev, true); + if (r) { + goto fail_log; + } + } if (hdev->vhost_ops->vhost_dev_start) { r =3D hdev->vhost_ops->vhost_dev_start(hdev, true); if (r) { - goto fail_log; + goto fail_start; } } if (vhost_dev_has_iommu(hdev) && @@ -1848,6 +1875,10 @@ int vhost_dev_start(struct vhost_dev *hdev, VirtIODe= vice *vdev) } } return 0; +fail_start: + if (vrings) { + vhost_dev_set_vring_enable(hdev, false); + } fail_log: vhost_log_put(hdev, false); fail_vq: @@ -1866,18 +1897,21 @@ fail_features: } =20 /* Host notifiers must be enabled at this point. */ -void vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev) +void vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev, bool vring= s) { int i; =20 /* should only be called after backend is connected */ assert(hdev->vhost_ops); =20 - trace_vhost_dev_stop(hdev, vdev->name); + trace_vhost_dev_stop(hdev, vdev->name, vrings); =20 if (hdev->vhost_ops->vhost_dev_start) { hdev->vhost_ops->vhost_dev_start(hdev, false); } + if (vrings) { + vhost_dev_set_vring_enable(hdev, false); + } for (i =3D 0; i < hdev->nvqs; ++i) { vhost_virtqueue_stop(hdev, vdev, diff --git a/hw/virtio/trace-events b/hw/virtio/trace-events index 820dadc26c..14fc5b9bb2 100644 --- a/hw/virtio/trace-events +++ b/hw/virtio/trace-events @@ -9,8 +9,8 @@ vhost_section(const char *name) "%s" vhost_reject_section(const char *name, int d) "%s:%d" vhost_iotlb_miss(void *dev, int step) "%p step %d" vhost_dev_cleanup(void *dev) "%p" -vhost_dev_start(void *dev, const char *name) "%p:%s" -vhost_dev_stop(void *dev, const char *name) "%p:%s" +vhost_dev_start(void *dev, const char *name, bool vrings) "%p:%s vrings:%d" +vhost_dev_stop(void *dev, const char *name, bool vrings) "%p:%s vrings:%d" =20 =20 # vhost-user.c --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670234995; cv=none; d=zohomail.com; s=zohoarc; b=ncXreFOFYUe+KO7v7sNObRYuSGYHkr4ebi5S25LEvxkN+6xsH+yah6Ms6nWNICz9ZFGAX319/5R+Y3P5vTDlJUH3X3GHVth1zQmHd7f05ARd7fqp4JCjZYXWqN7JwY5o9Na4ZmVsUb3EIbRjvzSkb6XrpnrLLoofdcI3mF/Ukio= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670234995; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=VpGPqFxym62K9GH7MKfAV+SJq1q0meLvnvyfpQU3Eqk=; b=RcjnKr1H79cugOcW1TzSuKCJeyHznwdKyC1Bzu82W3F1NuZ3EkTIpV97r8zDWKqy1n11Sm962aEAZG9V9A+o4kEP+UY/K5sAlFr6SHIvadbCEOXriz0BZj76OKimZ5fw1eMUV/TVEx7uzfFrWcxlwr6xxZ2RcxEZbsW4rEkKUtM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670234995746990.728588895147; Mon, 5 Dec 2022 02:09:55 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Bb-000252-Dm; Mon, 05 Dec 2022 04:54:55 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28BN-0001sn-Es for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:54:48 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28BJ-0006sS-3a for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:54:41 -0500 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-263-AUpsFNRrNQKqMyJYVcGvEQ-1; Mon, 05 Dec 2022 04:54:31 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 5E9A6299E755; Mon, 5 Dec 2022 09:54:30 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 32C382166B29; Mon, 5 Dec 2022 09:54:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234076; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=VpGPqFxym62K9GH7MKfAV+SJq1q0meLvnvyfpQU3Eqk=; b=PN9alLA+pQ55KGC0k9EGbY9UKHN9bkdEuvM3CiHPMFSPdxf0Gu+4iru0HNq0OwuSC7i0tV FMy1i3vN+orK3zAtFFQcfW8TAuZep1Lwmgv25dANBK/8dlpZEJxvECf5SpHhrWpMM6spTE 9eJaDSqUrxqTLS+hvMJiS+yEcOX7nTA= X-MC-Unique: AUpsFNRrNQKqMyJYVcGvEQ-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz Subject: [PATCH v2 14/51] hw/virtio: add started_vu status field to vhost-user-gpio Date: Mon, 5 Dec 2022 10:51:51 +0100 Message-Id: <20221205095228.1314-15-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670234996610100005 From: Alex Benn=C3=A9e As per the fix to vhost-user-blk in f5b22d06fb (vhost: recheck dev state in the vhost_migration_log routine) we really should track the connection and starting separately. Signed-off-by: Alex Benn=C3=A9e Reviewed-by: Michael S. Tsirkin Message-Id: <20221130112439.2527228-4-alex.bennee@linaro.org> Signed-off-by: Michael S. Tsirkin --- include/hw/virtio/vhost-user-gpio.h | 10 ++++++++++ hw/virtio/vhost-user-gpio.c | 11 ++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/include/hw/virtio/vhost-user-gpio.h b/include/hw/virtio/vhost-= user-gpio.h index 4fe9aeecc0..a9305c5e6c 100644 --- a/include/hw/virtio/vhost-user-gpio.h +++ b/include/hw/virtio/vhost-user-gpio.h @@ -28,7 +28,17 @@ struct VHostUserGPIO { VhostUserState vhost_user; VirtQueue *command_vq; VirtQueue *interrupt_vq; + /** + * There are at least two steps of initialization of the + * vhost-user device. The first is a "connect" step and + * second is a "start" step. Make a separation between + * those initialization phases by using two fields. + * + * @connected: see vu_gpio_connect()/vu_gpio_disconnect() + * @started_vu: see vu_gpio_start()/vu_gpio_stop() + */ bool connected; + bool started_vu; /*< public >*/ }; =20 diff --git a/hw/virtio/vhost-user-gpio.c b/hw/virtio/vhost-user-gpio.c index 0b40ebd15a..be9be08b4c 100644 --- a/hw/virtio/vhost-user-gpio.c +++ b/hw/virtio/vhost-user-gpio.c @@ -86,6 +86,7 @@ static int vu_gpio_start(VirtIODevice *vdev) error_report("Error starting vhost-user-gpio: %d", ret); goto err_guest_notifiers; } + gpio->started_vu =3D true; =20 /* * guest_notifier_mask/pending not used yet, so just unmask @@ -126,16 +127,12 @@ static void vu_gpio_stop(VirtIODevice *vdev) struct vhost_dev *vhost_dev =3D &gpio->vhost_dev; int ret; =20 - if (!k->set_guest_notifiers) { + if (!gpio->started_vu) { return; } + gpio->started_vu =3D false; =20 - /* - * We can call vu_gpio_stop multiple times, for example from - * vm_state_notify and the final object finalisation. Check we - * aren't already stopped before doing so. - */ - if (!vhost_dev_is_started(vhost_dev)) { + if (!k->set_guest_notifiers) { return; } =20 --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670235111; cv=none; d=zohomail.com; s=zohoarc; b=hXAxXWbpWMWKwtkgeu8JErn3VkngLihVtkrelfoWw5EXIMRTX4Bq1mnjd7GqOms6X4qjCcxTTegmzNrfDQbNN1tNAqhVVQyNiFaOYBUd01Ti2cI7joF72uR2T9NFkeDpYsND+R9ajGz6X+F+4R0JUp/Xk/uQ3GF6wfBohHEifIQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670235111; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=wv3mQ50z7ELRb+0PxbMX5qClEbrZYnNWGDwG8BSgdlg=; b=Yb/dyDFOLfJhZbkKFlEL2zAu6OIjbzLReo/CUgj6eCytYFguXEnPK1BGwOdrk562j7ROzL1hRAAnZ4ghAnhh/jHLTFtThQMcfqhX+MLCRq8BFOhPe20YBFDojXqYt+URoQ8bP49yEs+QFZOUHM6t41FKYSHsisYE2DXiUlFbws0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670235111201477.01564959893267; Mon, 5 Dec 2022 02:11:51 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Bf-0002G0-As; Mon, 05 Dec 2022 04:54:59 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28BT-0001xx-9s for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:54:48 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28BP-0006wx-SL for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:54:46 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-47-SDGhJug8OKyBI7Not_p4Fg-1; Mon, 05 Dec 2022 04:54:39 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id DD957101A52A; Mon, 5 Dec 2022 09:54:37 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id AE8AE2166B30; Mon, 5 Dec 2022 09:54:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234083; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wv3mQ50z7ELRb+0PxbMX5qClEbrZYnNWGDwG8BSgdlg=; b=OEeKb8NlIf+HwalK72K5FStBYR0UwDUb0NOL8qCxadf+miCWeuBX9/DNV5qfgTTb0TGr/S W+Ix9t0EiWndbNLQ9QTFVam4CdpN+Xwpa2/ZEKr6sI1ehv+6WmSuzTTH6T7eQXRIH4tHMC sLdPq2EhQJckNbVGVOj9CmDtlVQOAXw= X-MC-Unique: SDGhJug8OKyBI7Not_p4Fg-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz Subject: [PATCH v2 15/51] hw/virtio: generalise CHR_EVENT_CLOSED handling Date: Mon, 5 Dec 2022 10:51:52 +0100 Message-Id: <20221205095228.1314-16-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670235112811100003 From: Alex Benn=C3=A9e ..and use for both virtio-user-blk and virtio-user-gpio. This avoids the circular close by deferring shutdown due to disconnection until a later point. virtio-user-blk already had this mechanism in place so generalise it as a vhost-user helper function and use for both blk and gpio devices. While we are at it we also fix up vhost-user-gpio to re-establish the event handler after close down so we can reconnect later. Signed-off-by: Alex Benn=C3=A9e Reviewed-by: Michael S. Tsirkin Reviewed-by: Raphael Norwitz Message-Id: <20221130112439.2527228-5-alex.bennee@linaro.org> Signed-off-by: Michael S. Tsirkin --- include/hw/virtio/vhost-user.h | 18 +++++++++ hw/block/vhost-user-blk.c | 41 +++----------------- hw/virtio/vhost-user-gpio.c | 11 +++++- hw/virtio/vhost-user.c | 71 ++++++++++++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 37 deletions(-) diff --git a/include/hw/virtio/vhost-user.h b/include/hw/virtio/vhost-user.h index c6e693cd3f..191216a74f 100644 --- a/include/hw/virtio/vhost-user.h +++ b/include/hw/virtio/vhost-user.h @@ -68,4 +68,22 @@ bool vhost_user_init(VhostUserState *user, CharBackend *= chr, Error **errp); */ void vhost_user_cleanup(VhostUserState *user); =20 +/** + * vhost_user_async_close() - cleanup vhost-user post connection drop + * @d: DeviceState for the associated device (passed to callback) + * @chardev: the CharBackend associated with the connection + * @vhost: the common vhost device + * @cb: the user callback function to complete the clean-up + * + * This function is used to handle the shutdown of a vhost-user + * connection to a backend. We handle this centrally to make sure we + * do all the steps and handle potential races due to VM shutdowns. + * Once the connection is disabled we call a backhalf to ensure + */ +typedef void (*vu_async_close_fn)(DeviceState *cb); + +void vhost_user_async_close(DeviceState *d, + CharBackend *chardev, struct vhost_dev *vhost, + vu_async_close_fn cb); + #endif diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c index 1177064631..aff4d2b8cb 100644 --- a/hw/block/vhost-user-blk.c +++ b/hw/block/vhost-user-blk.c @@ -369,17 +369,10 @@ static void vhost_user_blk_disconnect(DeviceState *de= v) vhost_user_blk_stop(vdev); =20 vhost_dev_cleanup(&s->dev); -} =20 -static void vhost_user_blk_chr_closed_bh(void *opaque) -{ - DeviceState *dev =3D opaque; - VirtIODevice *vdev =3D VIRTIO_DEVICE(dev); - VHostUserBlk *s =3D VHOST_USER_BLK(vdev); - - vhost_user_blk_disconnect(dev); + /* Re-instate the event handler for new connections */ qemu_chr_fe_set_handlers(&s->chardev, NULL, NULL, vhost_user_blk_event, - NULL, opaque, NULL, true); + NULL, dev, NULL, true); } =20 static void vhost_user_blk_event(void *opaque, QEMUChrEvent event) @@ -398,33 +391,9 @@ static void vhost_user_blk_event(void *opaque, QEMUChr= Event event) } break; case CHR_EVENT_CLOSED: - if (!runstate_check(RUN_STATE_SHUTDOWN)) { - /* - * A close event may happen during a read/write, but vhost - * code assumes the vhost_dev remains setup, so delay the - * stop & clear. - */ - AioContext *ctx =3D qemu_get_current_aio_context(); - - qemu_chr_fe_set_handlers(&s->chardev, NULL, NULL, NULL, NULL, - NULL, NULL, false); - aio_bh_schedule_oneshot(ctx, vhost_user_blk_chr_closed_bh, opa= que); - - /* - * Move vhost device to the stopped state. The vhost-user devi= ce - * will be clean up and disconnected in BH. This can be useful= in - * the vhost migration code. If disconnect was caught there is= an - * option for the general vhost code to get the dev state with= out - * knowing its type (in this case vhost-user). - * - * FIXME: this is sketchy to be reaching into vhost_dev - * now because we are forcing something that implies we - * have executed vhost_dev_stop() but that won't happen - * until vhost_user_blk_stop() gets called from the bh. - * Really this state check should be tracked locally. - */ - s->dev.started =3D false; - } + /* defer close until later to avoid circular close */ + vhost_user_async_close(dev, &s->chardev, &s->dev, + vhost_user_blk_disconnect); break; case CHR_EVENT_BREAK: case CHR_EVENT_MUX_IN: diff --git a/hw/virtio/vhost-user-gpio.c b/hw/virtio/vhost-user-gpio.c index be9be08b4c..b7b82a1099 100644 --- a/hw/virtio/vhost-user-gpio.c +++ b/hw/virtio/vhost-user-gpio.c @@ -233,6 +233,8 @@ static int vu_gpio_connect(DeviceState *dev, Error **er= rp) return 0; } =20 +static void vu_gpio_event(void *opaque, QEMUChrEvent event); + static void vu_gpio_disconnect(DeviceState *dev) { VirtIODevice *vdev =3D VIRTIO_DEVICE(dev); @@ -245,6 +247,11 @@ static void vu_gpio_disconnect(DeviceState *dev) =20 vu_gpio_stop(vdev); vhost_dev_cleanup(&gpio->vhost_dev); + + /* Re-instate the event handler for new connections */ + qemu_chr_fe_set_handlers(&gpio->chardev, + NULL, NULL, vu_gpio_event, + NULL, dev, NULL, true); } =20 static void vu_gpio_event(void *opaque, QEMUChrEvent event) @@ -262,7 +269,9 @@ static void vu_gpio_event(void *opaque, QEMUChrEvent ev= ent) } break; case CHR_EVENT_CLOSED: - vu_gpio_disconnect(dev); + /* defer close until later to avoid circular close */ + vhost_user_async_close(dev, &gpio->chardev, &gpio->vhost_dev, + vu_gpio_disconnect); break; case CHR_EVENT_BREAK: case CHR_EVENT_MUX_IN: diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c index abe23d4ebe..8f635844af 100644 --- a/hw/virtio/vhost-user.c +++ b/hw/virtio/vhost-user.c @@ -21,6 +21,7 @@ #include "qemu/error-report.h" #include "qemu/main-loop.h" #include "qemu/sockets.h" +#include "sysemu/runstate.h" #include "sysemu/cryptodev.h" #include "migration/migration.h" #include "migration/postcopy-ram.h" @@ -2670,6 +2671,76 @@ void vhost_user_cleanup(VhostUserState *user) user->chr =3D NULL; } =20 + +typedef struct { + vu_async_close_fn cb; + DeviceState *dev; + CharBackend *cd; + struct vhost_dev *vhost; +} VhostAsyncCallback; + +static void vhost_user_async_close_bh(void *opaque) +{ + VhostAsyncCallback *data =3D opaque; + struct vhost_dev *vhost =3D data->vhost; + + /* + * If the vhost_dev has been cleared in the meantime there is + * nothing left to do as some other path has completed the + * cleanup. + */ + if (vhost->vdev) { + data->cb(data->dev); + } + + g_free(data); +} + +/* + * We only schedule the work if the machine is running. If suspended + * we want to keep all the in-flight data as is for migration + * purposes. + */ +void vhost_user_async_close(DeviceState *d, + CharBackend *chardev, struct vhost_dev *vhost, + vu_async_close_fn cb) +{ + if (!runstate_check(RUN_STATE_SHUTDOWN)) { + /* + * A close event may happen during a read/write, but vhost + * code assumes the vhost_dev remains setup, so delay the + * stop & clear. + */ + AioContext *ctx =3D qemu_get_current_aio_context(); + VhostAsyncCallback *data =3D g_new0(VhostAsyncCallback, 1); + + /* Save data for the callback */ + data->cb =3D cb; + data->dev =3D d; + data->cd =3D chardev; + data->vhost =3D vhost; + + /* Disable any further notifications on the chardev */ + qemu_chr_fe_set_handlers(chardev, + NULL, NULL, NULL, NULL, NULL, NULL, + false); + + aio_bh_schedule_oneshot(ctx, vhost_user_async_close_bh, data); + + /* + * Move vhost device to the stopped state. The vhost-user device + * will be clean up and disconnected in BH. This can be useful in + * the vhost migration code. If disconnect was caught there is an + * option for the general vhost code to get the dev state without + * knowing its type (in this case vhost-user). + * + * Note if the vhost device is fully cleared by the time we + * execute the bottom half we won't continue with the cleanup. + */ + vhost->started =3D false; + } +} + static int vhost_user_dev_start(struct vhost_dev *dev, bool started) { if (!virtio_has_feature(dev->protocol_features, --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670234408; cv=none; d=zohomail.com; s=zohoarc; b=KVN2YE/5P51LSPLWXNGKIyZMZ+BLJRjL3ryEV+t751mcRf1HQwPbPz/7P8DNIUcjkb+fBcf0wVUxobFuNQF/QdCkh4kG3teaT3PMB5BhI5iJCxf/dcGql5T0JJyZHPSnQ2nKkTNjQCR2iyfKiB9cYfb1uAoYDFnwfadiNqFVLfY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670234408; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=No1rFWDOGgcpCRxA+eKIpRsQyOQa34f3lMNtg8s8nvw=; b=Pk+QiMPNPSBCBB2IeclHLT2BEOnTp1VQcnmO8pqCKVC6qzaO6KVoj2EIADuklFG0RFPKHPTIIm4aaEwiv2yKwBxmfmnSbL6FepfZBeuAMfJGD5kRocNIvFmUULym7PbPTp+UwKStvkkbyPvt2rTTlvZA2k6azh103H54B6w1nwU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670234408286752.5915794338504; Mon, 5 Dec 2022 02:00:08 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Bg-0002IJ-BW; Mon, 05 Dec 2022 04:55:00 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28BX-000228-7L for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:54:52 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28BV-0006xs-MU for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:54:50 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-361-LvnWEbokMBiiSiQFcldH3Q-1; Mon, 05 Dec 2022 04:54:46 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 64306101A56C; Mon, 5 Dec 2022 09:54:45 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3CCD52166B29; Mon, 5 Dec 2022 09:54:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234089; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=No1rFWDOGgcpCRxA+eKIpRsQyOQa34f3lMNtg8s8nvw=; b=KNalBSSEcivUUWmLJwjieYOoUjAVRSoK8iMh4IuW1zO+iHle/hZZDnWlKppuNxSjOQllxW KkrL4E7Jvui14J7IXCTWnGgIXKM2IbNaZnIDou8Muhbf3dHWp6kr9wniPNJuQMDC5iRT+W aOB33nZB+rdi6+ZdswJAqJe/KXTCgQw= X-MC-Unique: LvnWEbokMBiiSiQFcldH3Q-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz Subject: [PATCH v2 16/51] include/hw: VM state takes precedence in virtio_device_should_start Date: Mon, 5 Dec 2022 10:51:53 +0100 Message-Id: <20221205095228.1314-17-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670234409460100001 From: Alex Benn=C3=A9e The VM status should always preempt the device status for these checks. This ensures the device is in the correct state when we suspend the VM prior to migrations. This restores the checks to the order they where in before the refactoring moved things around. While we are at it lets improve our documentation of the various fields involved and document the two functions. Fixes: 9f6bcfd99f (hw/virtio: move vm_running check to virtio_device_starte= d) Fixes: 259d69c00b (hw/virtio: introduce virtio_device_should_start) Signed-off-by: Alex Benn=C3=A9e Tested-by: Christian Borntraeger Reviewed-by: Michael S. Tsirkin Message-Id: <20221130112439.2527228-6-alex.bennee@linaro.org> Signed-off-by: Michael S. Tsirkin --- include/hw/virtio/virtio.h | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h index a973811cbf..acfd4df125 100644 --- a/include/hw/virtio/virtio.h +++ b/include/hw/virtio/virtio.h @@ -116,6 +116,13 @@ struct VirtIODevice bool broken; /* device in invalid state, needs reset */ bool use_disabled_flag; /* allow use of 'disable' flag when needed */ bool disabled; /* device in temporarily disabled state */ + /** + * @use_started: true if the @started flag should be used to check the + * current state of the VirtIO device. Otherwise status bits + * should be checked for a current status of the device. + * @use_started is only set via QMP and defaults to true for all + * modern machines (since 4.1). + */ bool use_started; bool started; bool start_on_kick; /* when virtio 1.0 feature has not been negotiated= */ @@ -391,6 +398,16 @@ static inline bool virtio_is_big_endian(VirtIODevice *= vdev) return false; } =20 +/** + * virtio_device_started() - check if device started + * @vdev - the VirtIO device + * @status - the devices status bits + * + * Check if the device is started. For most modern machines this is + * tracked via the @vdev->started field (to support migration), + * otherwise we check for the final negotiated status bit that + * indicates everything is ready. + */ static inline bool virtio_device_started(VirtIODevice *vdev, uint8_t statu= s) { if (vdev->use_started) { @@ -411,15 +428,11 @@ static inline bool virtio_device_started(VirtIODevice= *vdev, uint8_t status) */ static inline bool virtio_device_should_start(VirtIODevice *vdev, uint8_t = status) { - if (vdev->use_started) { - return vdev->started; - } - if (!vdev->vm_running) { return false; } =20 - return status & VIRTIO_CONFIG_S_DRIVER_OK; + return virtio_device_started(vdev, status); } =20 static inline void virtio_set_started(VirtIODevice *vdev, bool started) --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670235274; cv=none; d=zohomail.com; s=zohoarc; b=SlXLiMy3Qv2Q9GF6xhky+cQ60s++lygpBaTEUCINxkBCVjwXEEn5Xz6s4Q1PUbBEwsDVksCxldB7ZK/beiCm9Nch4QIbo18Xc+KiCqzctsEccNW8ejBnBkjK2iUY0UQs5Nrw8PnRgDfAPjd3rvx4U3AbDjr6gURgm8No9QJ972c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670235274; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=YV1dL1MmO+zuZsRAQOi5egpSmb0nyqOB4Pp4gBeiMus=; b=i4xJVO7GB8wXeYE4JOlsjkC/c5n9UMR4mL8vNV3mKjNFy4qrFmvisK5UAyikN+g5Wz08T1bdGAaOnjp2rNinkOZ1Hx4TjB7fNH2Z6lOj3kimNOTh6OrSlm6Z8xC+wLY+QivXiQP6sSoGlYms/YhY+frYgmV1YK7GGLTOYEmIfJg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670235274093171.13580088120204; Mon, 5 Dec 2022 02:14:34 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Bk-0002Pv-48; Mon, 05 Dec 2022 04:55:04 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Bh-0002KM-Fc for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:55:01 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Bf-000700-7v for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:55:01 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-193-6zXA80sVOp2p6re-Bfm4uA-1; Mon, 05 Dec 2022 04:54:54 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 343A986EB61; Mon, 5 Dec 2022 09:54:53 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id B1C4E2166B29; Mon, 5 Dec 2022 09:54:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234098; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=YV1dL1MmO+zuZsRAQOi5egpSmb0nyqOB4Pp4gBeiMus=; b=QAsFMAvWM3fusuRjtn/s6dR6ebPEyJDJIIwxFc2yPfptpFsfVzl08PrdqugTRqitYnuPjX XAQ1ugzq20ROhxIx+oGRv3opEbWsvn1wvLE3XcrQGU/pawD1A5PLhrb4cepsl1RLVjbhyN 9ZQsIhEoAUFRkZtzEn9Y+k2tp9yyZiI= X-MC-Unique: 6zXA80sVOp2p6re-Bfm4uA-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Klaus Jensen , Jonathan Derrick Subject: [PATCH v2 17/51] hw/nvme: fix aio cancel in format Date: Mon, 5 Dec 2022 10:51:54 +0100 Message-Id: <20221205095228.1314-18-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670235275705100003 Content-Type: text/plain; charset="utf-8" From: Klaus Jensen There are several bugs in the async cancel code for the Format command. Firstly, cancelling a format operation neglects to set iocb->ret as well as clearing the iocb->aiocb after cancelling the underlying aiocb which causes the aio callback to ignore the cancellation. Trivial fix. Secondly, and worse, because the request is queued up for posting to the CQ in a bottom half, if the cancellation is due to the submission queue being deleted (which calls blk_aio_cancel), the req structure is deallocated in nvme_del_sq prior to the bottom half being schedulued. Fix this by simply removing the bottom half, there is no reason to defer it anyway. Fixes: 3bcf26d3d619 ("hw/nvme: reimplement format nvm to allow cancellation= ") Reported-by: Jonathan Derrick Reviewed-by: Keith Busch Signed-off-by: Klaus Jensen --- hw/nvme/ctrl.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index ac3885ce50..9bc56075f6 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -5741,7 +5741,6 @@ static uint16_t nvme_ns_attachment(NvmeCtrl *n, NvmeR= equest *req) typedef struct NvmeFormatAIOCB { BlockAIOCB common; BlockAIOCB *aiocb; - QEMUBH *bh; NvmeRequest *req; int ret; =20 @@ -5756,14 +5755,15 @@ typedef struct NvmeFormatAIOCB { uint8_t pil; } NvmeFormatAIOCB; =20 -static void nvme_format_bh(void *opaque); - static void nvme_format_cancel(BlockAIOCB *aiocb) { NvmeFormatAIOCB *iocb =3D container_of(aiocb, NvmeFormatAIOCB, common); =20 + iocb->ret =3D -ECANCELED; + if (iocb->aiocb) { blk_aio_cancel_async(iocb->aiocb); + iocb->aiocb =3D NULL; } } =20 @@ -5787,13 +5787,17 @@ static void nvme_format_set(NvmeNamespace *ns, uint= 8_t lbaf, uint8_t mset, nvme_ns_init_format(ns); } =20 +static void nvme_do_format(NvmeFormatAIOCB *iocb); + static void nvme_format_ns_cb(void *opaque, int ret) { NvmeFormatAIOCB *iocb =3D opaque; NvmeNamespace *ns =3D iocb->ns; int bytes; =20 - if (ret < 0) { + if (iocb->ret < 0) { + goto done; + } else if (ret < 0) { iocb->ret =3D ret; goto done; } @@ -5817,8 +5821,7 @@ static void nvme_format_ns_cb(void *opaque, int ret) iocb->offset =3D 0; =20 done: - iocb->aiocb =3D NULL; - qemu_bh_schedule(iocb->bh); + nvme_do_format(iocb); } =20 static uint16_t nvme_format_check(NvmeNamespace *ns, uint8_t lbaf, uint8_t= pi) @@ -5842,9 +5845,8 @@ static uint16_t nvme_format_check(NvmeNamespace *ns, = uint8_t lbaf, uint8_t pi) return NVME_SUCCESS; } =20 -static void nvme_format_bh(void *opaque) +static void nvme_do_format(NvmeFormatAIOCB *iocb) { - NvmeFormatAIOCB *iocb =3D opaque; NvmeRequest *req =3D iocb->req; NvmeCtrl *n =3D nvme_ctrl(req); uint32_t dw10 =3D le32_to_cpu(req->cmd.cdw10); @@ -5882,11 +5884,7 @@ static void nvme_format_bh(void *opaque) return; =20 done: - qemu_bh_delete(iocb->bh); - iocb->bh =3D NULL; - iocb->common.cb(iocb->common.opaque, iocb->ret); - qemu_aio_unref(iocb); } =20 @@ -5905,7 +5903,6 @@ static uint16_t nvme_format(NvmeCtrl *n, NvmeRequest = *req) iocb =3D qemu_aio_get(&nvme_format_aiocb_info, NULL, nvme_misc_cb, req= ); =20 iocb->req =3D req; - iocb->bh =3D qemu_bh_new(nvme_format_bh, iocb); iocb->ret =3D 0; iocb->ns =3D NULL; iocb->nsid =3D 0; @@ -5934,14 +5931,13 @@ static uint16_t nvme_format(NvmeCtrl *n, NvmeReques= t *req) } =20 req->aiocb =3D &iocb->common; - qemu_bh_schedule(iocb->bh); + nvme_do_format(iocb); =20 return NVME_NO_COMPLETE; =20 out: - qemu_bh_delete(iocb->bh); - iocb->bh =3D NULL; qemu_aio_unref(iocb); + return status; } =20 --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670234870; cv=none; d=zohomail.com; s=zohoarc; b=Need52823NkCFsn1goJ2o2LPzbsynstYzvj1qrPGcidyoleuNfqvMmGeY1YViKDW2LfHqT4kwJccByCfpM5dE6f7OKT133SGX43MoIFrqMMvF3srk1eiYrqXOSfdoyF2uOkDx7mkOiMIY1Cp9sYqRj2eWUNvfshgrbWpwA5nj7U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670234870; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=JPkwFkSSfq3t5RKWyqYzwK48WCnzhdeFXKl8nUjSzoI=; b=Z5aYdIKARDtVUMPMqXRCQJk9O4frLKXYNP1MysxYbU04Txgc9rSRzrDKKucgKCjRcefP42jR7rxsLfiR4SuFVwDZ/jFN9+drZHJSk8fJSR0tgUjrq0td1BqkbDle2cnS6qZf3E/6tWDx/jel4Yk9VPimX+JztgcdQrgX/3sJuYM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670234870791465.59988239750135; Mon, 5 Dec 2022 02:07:50 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Bp-0002am-KQ; Mon, 05 Dec 2022 04:55:09 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Bn-0002Vz-Jv for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:55:07 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Bl-00075M-Sv for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:55:07 -0500 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-581-E6DdkZKJPsuP8izcGK-kCA-1; Mon, 05 Dec 2022 04:55:02 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id E02493C0F663; Mon, 5 Dec 2022 09:55:00 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 820FC2166B29; Mon, 5 Dec 2022 09:54:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234105; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JPkwFkSSfq3t5RKWyqYzwK48WCnzhdeFXKl8nUjSzoI=; b=UdECobnge++f1hcFTaD2d03PHzViLpH6m7Q69ShfwC9flrjXE6PjTHhjZyAekGBo0SDjz/ pP+QOrSLO4xGW3aawYJ1fRu1zi/vOsQlgTHh9S/Od2O5+BlCHkHSYRPlSDWJ3CGVX0ZIwT /fYUe96iuiNV6p1A9A1VZrLqNwIOQkw= X-MC-Unique: E6DdkZKJPsuP8izcGK-kCA-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Klaus Jensen Subject: [PATCH v2 18/51] hw/nvme: fix aio cancel in flush Date: Mon, 5 Dec 2022 10:51:55 +0100 Message-Id: <20221205095228.1314-19-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670234871260100002 Content-Type: text/plain; charset="utf-8" From: Klaus Jensen Make sure that iocb->aiocb is NULL'ed when cancelling. Fix a potential use-after-free by removing the bottom half and enqueuing the completion directly. Fixes: 38f4ac65ac88 ("hw/nvme: reimplement flush to allow cancellation") Reviewed-by: Keith Busch Signed-off-by: Klaus Jensen --- hw/nvme/ctrl.c | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index 9bc56075f6..fede5af6af 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -3160,7 +3160,6 @@ typedef struct NvmeFlushAIOCB { BlockAIOCB common; BlockAIOCB *aiocb; NvmeRequest *req; - QEMUBH *bh; int ret; =20 NvmeNamespace *ns; @@ -3176,6 +3175,7 @@ static void nvme_flush_cancel(BlockAIOCB *acb) =20 if (iocb->aiocb) { blk_aio_cancel_async(iocb->aiocb); + iocb->aiocb =3D NULL; } } =20 @@ -3185,6 +3185,8 @@ static const AIOCBInfo nvme_flush_aiocb_info =3D { .get_aio_context =3D nvme_get_aio_context, }; =20 +static void nvme_do_flush(NvmeFlushAIOCB *iocb); + static void nvme_flush_ns_cb(void *opaque, int ret) { NvmeFlushAIOCB *iocb =3D opaque; @@ -3206,13 +3208,11 @@ static void nvme_flush_ns_cb(void *opaque, int ret) } =20 out: - iocb->aiocb =3D NULL; - qemu_bh_schedule(iocb->bh); + nvme_do_flush(iocb); } =20 -static void nvme_flush_bh(void *opaque) +static void nvme_do_flush(NvmeFlushAIOCB *iocb) { - NvmeFlushAIOCB *iocb =3D opaque; NvmeRequest *req =3D iocb->req; NvmeCtrl *n =3D nvme_ctrl(req); int i; @@ -3239,14 +3239,8 @@ static void nvme_flush_bh(void *opaque) return; =20 done: - qemu_bh_delete(iocb->bh); - iocb->bh =3D NULL; - iocb->common.cb(iocb->common.opaque, iocb->ret); - qemu_aio_unref(iocb); - - return; } =20 static uint16_t nvme_flush(NvmeCtrl *n, NvmeRequest *req) @@ -3258,7 +3252,6 @@ static uint16_t nvme_flush(NvmeCtrl *n, NvmeRequest *= req) iocb =3D qemu_aio_get(&nvme_flush_aiocb_info, NULL, nvme_misc_cb, req); =20 iocb->req =3D req; - iocb->bh =3D qemu_bh_new(nvme_flush_bh, iocb); iocb->ret =3D 0; iocb->ns =3D NULL; iocb->nsid =3D 0; @@ -3280,13 +3273,11 @@ static uint16_t nvme_flush(NvmeCtrl *n, NvmeRequest= *req) } =20 req->aiocb =3D &iocb->common; - qemu_bh_schedule(iocb->bh); + nvme_do_flush(iocb); =20 return NVME_NO_COMPLETE; =20 out: - qemu_bh_delete(iocb->bh); - iocb->bh =3D NULL; qemu_aio_unref(iocb); =20 return status; --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670235425; cv=none; d=zohomail.com; s=zohoarc; b=OMVtxIEypR090UebIS4OEPSA1v9e+SAZ/mZfe4EF3vjB8pGl+9uO1LhvmtAamyiXMHWQZuf4Z7HcYO1sFHkqyQ5e+57CMvdZ2jwhDuLcrTseiZ9u4VCL6stqsuyIzlzTpRg0+N4qDxh32QX4CnWwzxGFVu3BSnRAL6x0iNY/FA4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670235425; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=NlagijAifTdV86tivIA25I3dGfVhQXxNyB5r7aWw5KE=; b=Wex58+XBG4vClVqtxTdTMCLJChz81ia5HexjTO0Mzlk13zPD6rW2yZYv0+3TnjHZvYwnuSdG7AVESL7BB6Db/BHEVQgeXwElVxb/BAEZ26B7hOpeol2Nm4z8A43FMirpITJ8S+oSNgEWw/b0gnTG7s2Yas7t913dXB2FDHOi8Qw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670235425207825.660840915755; Mon, 5 Dec 2022 02:17:05 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28C0-0002ta-7L; Mon, 05 Dec 2022 04:55:21 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Bw-0002my-GP for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:55:17 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Bu-0007Go-0S for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:55:16 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-607-3HH99AajNVmMvwQ0_5_3JA-1; Mon, 05 Dec 2022 04:55:10 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 8CA10101A52A; Mon, 5 Dec 2022 09:55:08 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 388902166B29; Mon, 5 Dec 2022 09:55:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234112; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=NlagijAifTdV86tivIA25I3dGfVhQXxNyB5r7aWw5KE=; b=b5sLcT3dNrE7jpu+hluQrST/5/9nFsgJJTZCfJjBNTfWxk+P6F7a7fWlZHolZEx/eSub0A tY5YbDUkpZ5qfk6z7fDftz0nw+Y+dtWdfSiAC3j04Y9eVJr1uOT6J5yy5wW3lxI3dlcPrL vU36mbQplgmtrVVuPou7C9NxDEkBKIk= X-MC-Unique: 3HH99AajNVmMvwQ0_5_3JA-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Klaus Jensen Subject: [PATCH v2 19/51] hw/nvme: fix aio cancel in zone reset Date: Mon, 5 Dec 2022 10:51:56 +0100 Message-Id: <20221205095228.1314-20-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670235426290100001 Content-Type: text/plain; charset="utf-8" From: Klaus Jensen If the zone reset operation is cancelled but the block unmap operation completes normally, the callback will continue resetting the next zone since it neglects to check iocb->ret which will have been set to -ECANCELED. Make sure that this is checked and bail out if an error is present. Secondly, fix a potential use-after-free by removing the bottom half and enqueuing the completion directly. Fixes: 63d96e4ffd71 ("hw/nvme: reimplement zone reset to allow cancellation= ") Reviewed-by: Keith Busch Signed-off-by: Klaus Jensen --- hw/nvme/ctrl.c | 36 +++++++++++------------------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index fede5af6af..bf4abf73f7 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -3712,7 +3712,6 @@ typedef struct NvmeZoneResetAIOCB { BlockAIOCB common; BlockAIOCB *aiocb; NvmeRequest *req; - QEMUBH *bh; int ret; =20 bool all; @@ -3741,17 +3740,6 @@ static const AIOCBInfo nvme_zone_reset_aiocb_info = =3D { .cancel_async =3D nvme_zone_reset_cancel, }; =20 -static void nvme_zone_reset_bh(void *opaque) -{ - NvmeZoneResetAIOCB *iocb =3D opaque; - - iocb->common.cb(iocb->common.opaque, iocb->ret); - - qemu_bh_delete(iocb->bh); - iocb->bh =3D NULL; - qemu_aio_unref(iocb); -} - static void nvme_zone_reset_cb(void *opaque, int ret); =20 static void nvme_zone_reset_epilogue_cb(void *opaque, int ret) @@ -3762,14 +3750,8 @@ static void nvme_zone_reset_epilogue_cb(void *opaque= , int ret) int64_t moff; int count; =20 - if (ret < 0) { - nvme_zone_reset_cb(iocb, ret); - return; - } - - if (!ns->lbaf.ms) { - nvme_zone_reset_cb(iocb, 0); - return; + if (ret < 0 || iocb->ret < 0 || !ns->lbaf.ms) { + goto out; } =20 moff =3D nvme_moff(ns, iocb->zone->d.zslba); @@ -3779,6 +3761,9 @@ static void nvme_zone_reset_epilogue_cb(void *opaque,= int ret) BDRV_REQ_MAY_UNMAP, nvme_zone_reset_cb, iocb); return; + +out: + nvme_zone_reset_cb(iocb, ret); } =20 static void nvme_zone_reset_cb(void *opaque, int ret) @@ -3787,7 +3772,9 @@ static void nvme_zone_reset_cb(void *opaque, int ret) NvmeRequest *req =3D iocb->req; NvmeNamespace *ns =3D req->ns; =20 - if (ret < 0) { + if (iocb->ret < 0) { + goto done; + } else if (ret < 0) { iocb->ret =3D ret; goto done; } @@ -3835,9 +3822,9 @@ static void nvme_zone_reset_cb(void *opaque, int ret) =20 done: iocb->aiocb =3D NULL; - if (iocb->bh) { - qemu_bh_schedule(iocb->bh); - } + + iocb->common.cb(iocb->common.opaque, iocb->ret); + qemu_aio_unref(iocb); } =20 static uint16_t nvme_zone_mgmt_send_zrwa_flush(NvmeCtrl *n, NvmeZone *zone, @@ -3942,7 +3929,6 @@ static uint16_t nvme_zone_mgmt_send(NvmeCtrl *n, Nvme= Request *req) nvme_misc_cb, req); =20 iocb->req =3D req; - iocb->bh =3D qemu_bh_new(nvme_zone_reset_bh, iocb); iocb->ret =3D 0; iocb->all =3D all; iocb->idx =3D zone_idx; --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670234498; cv=none; d=zohomail.com; s=zohoarc; b=hdgVM/hejxRj271lehA14BCozla6Ion4QGe3LzooQvTE9zf3ZAIcJJrKG5vOmI20FB96WbuqMFzxlbuF78gMnFQ15HnUuMNWvKjUboblODaavT/L45b8grQl2cQouwf/6cejBIWgneiN6ONSQI9GnIxxoVeVvvpKL4Jozr/yPMU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670234498; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=e3XgTZKxlY8kzFFBQsUmpC/wSN3ufoA5pXR8Z5sxu4s=; b=LReXZ2xv4AC+AjOC1zY0j16f7jq/1JuK8dqpYfMHYmnFJtykwV9Jh8W0p2Egk6NCmVwj4OAloMNst+LtZcjXTWzN43Jy/3kwIEh/TEEnRJtC7dm50u98mTD6M8RN6dXNOzxsm8P090DFhIxw2xOEgnbL0xhSaPCOIUA1st/Fc3I= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670234498752147.71772253007475; Mon, 5 Dec 2022 02:01:38 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28C4-0002vS-88; Mon, 05 Dec 2022 04:55:24 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28C0-0002u2-Ua for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:55:21 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Bz-0007I8-5t for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:55:20 -0500 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-263-EvfnM0ieOlWUXJVVxy2KuA-1; Mon, 05 Dec 2022 04:55:17 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 56D7E1C0014B; Mon, 5 Dec 2022 09:55:16 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id D99072166B29; Mon, 5 Dec 2022 09:55:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234118; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=e3XgTZKxlY8kzFFBQsUmpC/wSN3ufoA5pXR8Z5sxu4s=; b=AQpBSVMPcOBmAfQMz13c+/I3n8bKi1ANNLCKrOiRbJBqNrOBHWEcBGiBZxXu5/KySLI8kb lAxF96dr15z9jjfVeBz3YHQTNmBTtK1TEyWHwXX2fzq9ReByeUbOj2u9QJ2GG1DL/nkCqz 7zYZ/Fls0CZ1aS9dkjFHH7uxWuOy//k= X-MC-Unique: EvfnM0ieOlWUXJVVxy2KuA-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Klaus Jensen Subject: [PATCH v2 20/51] hw/nvme: fix aio cancel in dsm Date: Mon, 5 Dec 2022 10:51:57 +0100 Message-Id: <20221205095228.1314-21-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670234499715100001 Content-Type: text/plain; charset="utf-8" From: Klaus Jensen When the DSM operation is cancelled asynchronously, we set iocb->ret to -ECANCELED. However, the callback function only checks the return value of the completed aio, which may have completed succesfully prior to the cancellation and thus the callback ends up continuing the dsm operation instead of bailing out. Fix this. Secondly, fix a potential use-after-free by removing the bottom half and enqueuing the completion directly. Fixes: d7d1474fd85d ("hw/nvme: reimplement dsm to allow cancellation") Reviewed-by: Keith Busch Signed-off-by: Klaus Jensen --- hw/nvme/ctrl.c | 34 ++++++++-------------------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index bf4abf73f7..e847b89461 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -2329,7 +2329,6 @@ typedef struct NvmeDSMAIOCB { BlockAIOCB common; BlockAIOCB *aiocb; NvmeRequest *req; - QEMUBH *bh; int ret; =20 NvmeDsmRange *range; @@ -2351,7 +2350,7 @@ static void nvme_dsm_cancel(BlockAIOCB *aiocb) } else { /* * We only reach this if nvme_dsm_cancel() has already been called= or - * the command ran to completion and nvme_dsm_bh is scheduled to r= un. + * the command ran to completion. */ assert(iocb->idx =3D=3D iocb->nr); } @@ -2362,17 +2361,6 @@ static const AIOCBInfo nvme_dsm_aiocb_info =3D { .cancel_async =3D nvme_dsm_cancel, }; =20 -static void nvme_dsm_bh(void *opaque) -{ - NvmeDSMAIOCB *iocb =3D opaque; - - iocb->common.cb(iocb->common.opaque, iocb->ret); - - qemu_bh_delete(iocb->bh); - iocb->bh =3D NULL; - qemu_aio_unref(iocb); -} - static void nvme_dsm_cb(void *opaque, int ret); =20 static void nvme_dsm_md_cb(void *opaque, int ret) @@ -2384,16 +2372,10 @@ static void nvme_dsm_md_cb(void *opaque, int ret) uint64_t slba; uint32_t nlb; =20 - if (ret < 0) { - iocb->ret =3D ret; + if (ret < 0 || iocb->ret < 0 || !ns->lbaf.ms) { goto done; } =20 - if (!ns->lbaf.ms) { - nvme_dsm_cb(iocb, 0); - return; - } - range =3D &iocb->range[iocb->idx - 1]; slba =3D le64_to_cpu(range->slba); nlb =3D le32_to_cpu(range->nlb); @@ -2406,7 +2388,6 @@ static void nvme_dsm_md_cb(void *opaque, int ret) ret =3D nvme_block_status_all(ns, slba, nlb, BDRV_BLOCK_ZERO); if (ret) { if (ret < 0) { - iocb->ret =3D ret; goto done; } =20 @@ -2420,8 +2401,7 @@ static void nvme_dsm_md_cb(void *opaque, int ret) return; =20 done: - iocb->aiocb =3D NULL; - qemu_bh_schedule(iocb->bh); + nvme_dsm_cb(iocb, ret); } =20 static void nvme_dsm_cb(void *opaque, int ret) @@ -2434,7 +2414,9 @@ static void nvme_dsm_cb(void *opaque, int ret) uint64_t slba; uint32_t nlb; =20 - if (ret < 0) { + if (iocb->ret < 0) { + goto done; + } else if (ret < 0) { iocb->ret =3D ret; goto done; } @@ -2468,7 +2450,8 @@ next: =20 done: iocb->aiocb =3D NULL; - qemu_bh_schedule(iocb->bh); + iocb->common.cb(iocb->common.opaque, iocb->ret); + qemu_aio_unref(iocb); } =20 static uint16_t nvme_dsm(NvmeCtrl *n, NvmeRequest *req) @@ -2486,7 +2469,6 @@ static uint16_t nvme_dsm(NvmeCtrl *n, NvmeRequest *re= q) nvme_misc_cb, req); =20 iocb->req =3D req; - iocb->bh =3D qemu_bh_new(nvme_dsm_bh, iocb); iocb->ret =3D 0; iocb->range =3D g_new(NvmeDsmRange, nr); iocb->nr =3D nr; --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670234871; cv=none; d=zohomail.com; s=zohoarc; b=C+3JazQNUcRuS8jefKF8RCQYJO3RUuHIEiR0hyqBHWGqQ5gz4kVJXDZbca2setjEMILw74lP+V90uZqo6uVYJ91kgVENcgMeAT9gHp9Z9etR/3Mh6ZS3waTf3PVGUUW2u/Fj5w6/s8v20U9Kjo4Ln7uxupyMMeaWC4JzDbzrcvg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670234871; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=EFic7YT524egGmw/B509nqdEJnuGBPLVOsqSxAeUT6k=; b=D/Glv1sX/0Hx4wDyQ9ENza0YPJkyS8/lPujbWyr47LOZNE8u1hH30aPZXY2FcJfVnIhr68b3Iv6LOiu9WE4aAzLsrtYqqCrDMoZ7ktrGxXCZF1LHU+shVa6D4kOS6rRYHv0Wu/OPDOeEQP8EiYXlQhblEjEtzZEGqo90HCXxI+c= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670234871029474.2931183171481; Mon, 5 Dec 2022 02:07:51 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Cc-0003GI-6l; Mon, 05 Dec 2022 04:55:58 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28CL-00033F-HM for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:55:43 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28C9-0007Ob-Fm for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:55:41 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-331-WfdBrC-2PRCRTxiVkN3Gxg-1; Mon, 05 Dec 2022 04:55:25 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 1731E86F12A; Mon, 5 Dec 2022 09:55:24 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id AB3D32166B29; Mon, 5 Dec 2022 09:55:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234128; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=EFic7YT524egGmw/B509nqdEJnuGBPLVOsqSxAeUT6k=; b=jRIxuHC1KZ1l1GPR6jKrb+Z4uOyIa07SO+7QFF9L7FIE60afWAdzknYv3kW4l3HtFTW1fo pmvmsFPluuJXKflreUZXqfXOdStkcFO20q6Ow7VlHM76iVeaNZozSS9LmxyH+8+UuJ8sty Xk+HQ3SHLDnYH9YiAS+6G9oBTXKlmck= X-MC-Unique: WfdBrC-2PRCRTxiVkN3Gxg-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Klaus Jensen Subject: [PATCH v2 21/51] hw/nvme: remove copy bh scheduling Date: Mon, 5 Dec 2022 10:51:58 +0100 Message-Id: <20221205095228.1314-22-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670234871254100001 Content-Type: text/plain; charset="utf-8" From: Klaus Jensen Fix a potential use-after-free by removing the bottom half and enqueuing the completion directly. Fixes: 796d20681d9b ("hw/nvme: reimplement the copy command to allow aio ca= ncellation") Reviewed-by: Keith Busch Signed-off-by: Klaus Jensen --- hw/nvme/ctrl.c | 63 +++++++++++--------------------------------------- 1 file changed, 14 insertions(+), 49 deletions(-) diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index e847b89461..e54276dc1d 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -2552,7 +2552,6 @@ typedef struct NvmeCopyAIOCB { BlockAIOCB common; BlockAIOCB *aiocb; NvmeRequest *req; - QEMUBH *bh; int ret; =20 void *ranges; @@ -2590,9 +2589,8 @@ static const AIOCBInfo nvme_copy_aiocb_info =3D { .cancel_async =3D nvme_copy_cancel, }; =20 -static void nvme_copy_bh(void *opaque) +static void nvme_copy_done(NvmeCopyAIOCB *iocb) { - NvmeCopyAIOCB *iocb =3D opaque; NvmeRequest *req =3D iocb->req; NvmeNamespace *ns =3D req->ns; BlockAcctStats *stats =3D blk_get_stats(ns->blkconf.blk); @@ -2604,9 +2602,6 @@ static void nvme_copy_bh(void *opaque) qemu_iovec_destroy(&iocb->iov); g_free(iocb->bounce); =20 - qemu_bh_delete(iocb->bh); - iocb->bh =3D NULL; - if (iocb->ret < 0) { block_acct_failed(stats, &iocb->acct.read); block_acct_failed(stats, &iocb->acct.write); @@ -2619,7 +2614,7 @@ static void nvme_copy_bh(void *opaque) qemu_aio_unref(iocb); } =20 -static void nvme_copy_cb(void *opaque, int ret); +static void nvme_do_copy(NvmeCopyAIOCB *iocb); =20 static void nvme_copy_source_range_parse_format0(void *ranges, int idx, uint64_t *slba, uint32_t = *nlb, @@ -2731,7 +2726,7 @@ static void nvme_copy_out_completed_cb(void *opaque, = int ret) iocb->idx++; iocb->slba +=3D nlb; out: - nvme_copy_cb(iocb, iocb->ret); + nvme_do_copy(iocb); } =20 static void nvme_copy_out_cb(void *opaque, int ret) @@ -2743,16 +2738,8 @@ static void nvme_copy_out_cb(void *opaque, int ret) size_t mlen; uint8_t *mbounce; =20 - if (ret < 0) { - iocb->ret =3D ret; + if (ret < 0 || iocb->ret < 0 || !ns->lbaf.ms) { goto out; - } else if (iocb->ret < 0) { - goto out; - } - - if (!ns->lbaf.ms) { - nvme_copy_out_completed_cb(iocb, 0); - return; } =20 nvme_copy_source_range_parse(iocb->ranges, iocb->idx, iocb->format, NU= LL, @@ -2771,7 +2758,7 @@ static void nvme_copy_out_cb(void *opaque, int ret) return; =20 out: - nvme_copy_cb(iocb, ret); + nvme_copy_out_completed_cb(iocb, ret); } =20 static void nvme_copy_in_completed_cb(void *opaque, int ret) @@ -2865,15 +2852,9 @@ static void nvme_copy_in_completed_cb(void *opaque, = int ret) =20 invalid: req->status =3D status; - iocb->aiocb =3D NULL; - if (iocb->bh) { - qemu_bh_schedule(iocb->bh); - } - - return; - + iocb->ret =3D -1; out: - nvme_copy_cb(iocb, ret); + nvme_do_copy(iocb); } =20 static void nvme_copy_in_cb(void *opaque, int ret) @@ -2884,16 +2865,8 @@ static void nvme_copy_in_cb(void *opaque, int ret) uint64_t slba; uint32_t nlb; =20 - if (ret < 0) { - iocb->ret =3D ret; + if (ret < 0 || iocb->ret < 0 || !ns->lbaf.ms) { goto out; - } else if (iocb->ret < 0) { - goto out; - } - - if (!ns->lbaf.ms) { - nvme_copy_in_completed_cb(iocb, 0); - return; } =20 nvme_copy_source_range_parse(iocb->ranges, iocb->idx, iocb->format, &s= lba, @@ -2909,12 +2882,11 @@ static void nvme_copy_in_cb(void *opaque, int ret) return; =20 out: - nvme_copy_cb(iocb, iocb->ret); + nvme_copy_in_completed_cb(iocb, ret); } =20 -static void nvme_copy_cb(void *opaque, int ret) +static void nvme_do_copy(NvmeCopyAIOCB *iocb) { - NvmeCopyAIOCB *iocb =3D opaque; NvmeRequest *req =3D iocb->req; NvmeNamespace *ns =3D req->ns; uint64_t slba; @@ -2922,10 +2894,7 @@ static void nvme_copy_cb(void *opaque, int ret) size_t len; uint16_t status; =20 - if (ret < 0) { - iocb->ret =3D ret; - goto done; - } else if (iocb->ret < 0) { + if (iocb->ret < 0) { goto done; } =20 @@ -2972,14 +2941,11 @@ static void nvme_copy_cb(void *opaque, int ret) =20 invalid: req->status =3D status; + iocb->ret =3D -1; done: - iocb->aiocb =3D NULL; - if (iocb->bh) { - qemu_bh_schedule(iocb->bh); - } + nvme_copy_done(iocb); } =20 - static uint16_t nvme_copy(NvmeCtrl *n, NvmeRequest *req) { NvmeNamespace *ns =3D req->ns; @@ -3049,7 +3015,6 @@ static uint16_t nvme_copy(NvmeCtrl *n, NvmeRequest *r= eq) } =20 iocb->req =3D req; - iocb->bh =3D qemu_bh_new(nvme_copy_bh, iocb); iocb->ret =3D 0; iocb->nr =3D nr; iocb->idx =3D 0; @@ -3066,7 +3031,7 @@ static uint16_t nvme_copy(NvmeCtrl *n, NvmeRequest *r= eq) BLOCK_ACCT_WRITE); =20 req->aiocb =3D &iocb->common; - nvme_copy_cb(iocb, 0); + nvme_do_copy(iocb); =20 return NVME_NO_COMPLETE; =20 --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670235445; cv=none; d=zohomail.com; s=zohoarc; b=hW4hyLSUOpmHRWr2Z0vPINA7fuVwkzrJpOeShF2vjIFBukyD5HgSv1W3bduep/bxbfITcZ3kjO7qQrWoXblzMAxfuCMwUToVzRbael/af1UWdgfIubnr87Ij1oNrmVwdd2c/SCVDcE0NFjR2DrPL27Y2hgOkx04VyajR3C9Oy30= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670235445; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=aiobRrH5ClQFSfmidcrKrBSPHcQQg1qrQq8dbdWq9lo=; b=KCkPrGyAZrxw9vlbhXHsBY+JuinWoFZTY5aOrPXE9zEDoAvp5RA9v48MmUh9IlDozz705d+5kiJ0itdrGBgHd2Dsjj22KWHWV+AgjLqhTJQUvjsj3UjsJgDxm2eH64T6ng3YSoSaGAWzeusuQB2/pvMbKsHkdK6D+DCQrGLBxq8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 16702354454011014.2837791595501; Mon, 5 Dec 2022 02:17:25 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Ce-0003Ky-EI; Mon, 05 Dec 2022 04:56:00 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28CQ-00033z-UT for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:55:50 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28CH-0007Pp-Aa for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:55:46 -0500 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-423-kTo15hjpPJme7FVTO3yDcQ-1; Mon, 05 Dec 2022 04:55:33 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id A589C3C0F66F; Mon, 5 Dec 2022 09:55:31 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 632442166B2A; Mon, 5 Dec 2022 09:55:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234136; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=aiobRrH5ClQFSfmidcrKrBSPHcQQg1qrQq8dbdWq9lo=; b=PIbHABTOXsALpiDEyf/GdSIrOBv875Sk72467+A+DqZzsijTI75ucLgrRSS5xoc+OjXgFd Ul5AtNelNCVTsRLkLbwJetfe0u/fhBeeepU+YnX8Pb4gaRrtQ+blLZVl0wujQRMKBqOvVb DnRfZxuEdi7oTUy0HhKjLXbBnpKxqXI= X-MC-Unique: kTo15hjpPJme7FVTO3yDcQ-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz Subject: [PATCH v2 22/51] target/i386: allow MMX instructions with CR4.OSFXSR=0 Date: Mon, 5 Dec 2022 10:51:59 +0100 Message-Id: <20221205095228.1314-23-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670235446335100001 Content-Type: text/plain; charset="utf-8" From: Paolo Bonzini MMX state is saved/restored by FSAVE/FRSTOR so the instructions are not illegal opcodes even if CR4.OSFXSR=3D0. Make sure that validate_vex takes into account the prefix and only checks HF_OSFXSR_MASK in the presence of an SSE instruction. Fixes: 20581aadec5e ("target/i386: validate VEX prefixes via the instructio= ns' exception classes", 2022-10-18) Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1350 Reported-by: Helge Konetzka (@hejko on gitlab.com) Reviewed-by: Richard Henderson Signed-off-by: Paolo Bonzini --- target/i386/tcg/decode-new.c.inc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.= c.inc index e4878b967f..80c579164f 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -1488,7 +1488,8 @@ static bool validate_vex(DisasContext *s, X86DecodedI= nsn *decode) if (!(s->flags & HF_AVX_EN_MASK)) { goto illegal; } - } else { + } else if (e->special !=3D X86_SPECIAL_MMX || + (s->prefix & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA)= )) { if (!(s->flags & HF_OSFXSR_MASK)) { goto illegal; } --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670235525; cv=none; d=zohomail.com; s=zohoarc; b=SNlCxLeB7T9QQHRMGALbS3zBTDFabAV71IELGJTiDV7oU1vd6zVi27ZVxrJQszxtdbAWHcmuyIzXbBvt0xaAkBOsasQQ/VSjjSdNGDiadPMckyNepg9UNXFFWGRNh+wmBSwe3k/6tBIuK0Odz4sobPLs4JAzXcji7yW6fbyKgr0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670235525; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=dnkYOrTgO+HGLMQelFOS97QjJMRgo81PYH7NJKA+HKk=; b=jOPUE0pZEW1+T5CVLzADmXbiInBU8sQwCGy/m/bU7H6hICm/dXDiFSYilyXB9NCN/ZLgAwBpWw/hZjmQGOr5WqlO/zhKhcXZ3cxwIzdKcaoPPRhMUrRCOYCjbKHvUU7u7od7YX7BZEoGzIathTkI3DrhhQxSMIlP77ADiW9uHYc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670235525934207.85224472055984; Mon, 5 Dec 2022 02:18:45 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Cg-0003QP-J9; Mon, 05 Dec 2022 04:56:02 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28CS-00034Q-Ff for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:55:51 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28CN-0007QX-DS for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:55:48 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-5-8t4q3dc7PkiPR_2Ty-aeZg-1; Mon, 05 Dec 2022 04:55:40 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 5829B185A794; Mon, 5 Dec 2022 09:55:39 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id F35CF2166B29; Mon, 5 Dec 2022 09:55:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234142; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=dnkYOrTgO+HGLMQelFOS97QjJMRgo81PYH7NJKA+HKk=; b=R1oPZn5waUm1MpNohvAiQEYBFMFNVxuLCpleOEKpiZK8z57kPlUmIXcZRmsk4rjItsqeQ5 da8TbB5/1l8zb132/Gdm5XTge+UqlLFi6rD/IYQp9fs0t/WSgxT6eTiqMiOzjRrUwMIsUu bzjHqI//SsF4wOFcMgyimQS2g5b3yo8= X-MC-Unique: 8t4q3dc7PkiPR_2Ty-aeZg-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Daniel Hoffman Subject: [PATCH v2 23/51] target/i386: Always completely initialize TranslateFault Date: Mon, 5 Dec 2022 10:52:00 +0100 Message-Id: <20221205095228.1314-24-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670235526536100001 Content-Type: text/plain; charset="utf-8" From: Richard Henderson In get_physical_address, the canonical address check failed to set TranslateFault.stage2, which resulted in an uninitialized read from the struct when reporting the fault in x86_cpu_tlb_fill. Adjust all error paths to use structure assignment so that the entire struct is always initialized. Reported-by: Daniel Hoffman Fixes: 9bbcf372193a ("target/i386: Reorg GET_HPHYS") Signed-off-by: Richard Henderson Message-Id: <20221201074522.178498-1-richard.henderson@linaro.org> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1324 Signed-off-by: Paolo Bonzini --- target/i386/tcg/sysemu/excp_helper.c | 34 ++++++++++++++++------------ 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/target/i386/tcg/sysemu/excp_helper.c b/target/i386/tcg/sysemu/= excp_helper.c index 405a5d414a..55bd1194d3 100644 --- a/target/i386/tcg/sysemu/excp_helper.c +++ b/target/i386/tcg/sysemu/excp_helper.c @@ -71,10 +71,11 @@ static bool ptw_translate(PTETranslate *inout, hwaddr a= ddr) TranslateFault *err =3D inout->err; =20 assert(inout->ptw_idx =3D=3D MMU_NESTED_IDX); - err->exception_index =3D 0; /* unused */ - err->error_code =3D inout->env->error_code; - err->cr2 =3D addr; - err->stage2 =3D S2_GPT; + *err =3D (TranslateFault){ + .error_code =3D inout->env->error_code, + .cr2 =3D addr, + .stage2 =3D S2_GPT, + }; return false; } return true; @@ -431,10 +432,11 @@ do_check_protect_pse36: MMU_NESTED_IDX, true, &pte_trans.haddr, &full, 0); if (unlikely(flags & TLB_INVALID_MASK)) { - err->exception_index =3D 0; /* unused */ - err->error_code =3D env->error_code; - err->cr2 =3D paddr; - err->stage2 =3D S2_GPA; + *err =3D (TranslateFault){ + .error_code =3D env->error_code, + .cr2 =3D paddr, + .stage2 =3D S2_GPA, + }; return false; } =20 @@ -494,10 +496,11 @@ do_check_protect_pse36: } break; } - err->exception_index =3D EXCP0E_PAGE; - err->error_code =3D error_code; - err->cr2 =3D addr; - err->stage2 =3D S2_NONE; + *err =3D (TranslateFault){ + .exception_index =3D EXCP0E_PAGE, + .error_code =3D error_code, + .cr2 =3D addr, + }; return false; } =20 @@ -564,9 +567,10 @@ static bool get_physical_address(CPUX86State *env, vad= dr addr, int shift =3D in.pg_mode & PG_MODE_LA57 ? 56 : 47; int64_t sext =3D (int64_t)addr >> shift; if (sext !=3D 0 && sext !=3D -1) { - err->exception_index =3D EXCP0D_GPF; - err->error_code =3D 0; - err->cr2 =3D addr; + *err =3D (TranslateFault){ + .exception_index =3D EXCP0D_GPF, + .cr2 =3D addr, + }; return false; } } --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670235306; cv=none; d=zohomail.com; s=zohoarc; b=W7hDQXFLbS6wCa0rpzaBHLJe4OWfyCnwP5s6hQbyOA+Dv4pV6L54Kv1lkduosUgrK4+VR5rZhwlCH8vihlEC04JbbGmh/DXJX5CW52rg/k6Fqg1gNF1h3JkvoJf/daoTmLXDPC33QvH4l7mqM5ns4GrlommUCugshT5PkcalQGU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670235306; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=e0E6XFOGPzqvm62vJ/QfqSQvA8SKYQxBhXRiPgztEbo=; b=ZH7WGDY0lS0en6XRWD0P+rM542vay5t5zWyKjzJ2VjQYBorOPOsAe9BnshLpAApXPscrYmUDribStEiJDKDvaOvI/iOEYc54YfKSfIJlCpp5xaQoiZkVVKwMMEfIx2pazEb63DyOYteptV/vaLGSZfemnLNGNv6SAYqm+AJN+MY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670235306419904.3060252895422; Mon, 5 Dec 2022 02:15:06 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Cg-0003P2-90; Mon, 05 Dec 2022 04:56:02 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Ca-0003D9-57 for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:55:57 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28CY-0007Tc-7r for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:55:55 -0500 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-573-iz8BsuEyPEa7DhCV5tr_cA-1; Mon, 05 Dec 2022 04:55:48 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 4B8F63813F20; Mon, 5 Dec 2022 09:55:47 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id AE3AC2166B29; Mon, 5 Dec 2022 09:55:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234153; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=e0E6XFOGPzqvm62vJ/QfqSQvA8SKYQxBhXRiPgztEbo=; b=H+EjjQB969KfIz8FeoKHM52DkrGmHcwUFBvg7X0+2kcxcnnLljNtRIAksA6YbqET4qh/Cq ApkxhD7GrIOFRy8WADxzKI3sEtkhm34B9mSTwRU6HKjbBdUYalVSHI+nFwxX6ptkvwQJbb +EJreYoaGDI+iBRJ/AXjCIREFzQtgC8= X-MC-Unique: iz8BsuEyPEa7DhCV5tr_cA-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v2 24/51] hw/loongarch/virt: Add cfi01 pflash device Date: Mon, 5 Dec 2022 10:52:01 +0100 Message-Id: <20221205095228.1314-25-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670235307958100001 From: Xiaojuan Yang Add cfi01 pflash device for LoongArch virt machine Signed-off-by: Xiaojuan Yang Reviewed-by: Philippe Mathieu-Daud=C3=A9 Message-Id: <20221130100647.398565-1-yangxiaojuan@loongson.cn> Signed-off-by: Song Gao --- include/hw/loongarch/virt.h | 5 +++ hw/loongarch/acpi-build.c | 18 +++++++++++ hw/loongarch/virt.c | 62 +++++++++++++++++++++++++++++++++++++ hw/loongarch/Kconfig | 1 + 4 files changed, 86 insertions(+) diff --git a/include/hw/loongarch/virt.h b/include/hw/loongarch/virt.h index 45c383f5a7..f5f818894e 100644 --- a/include/hw/loongarch/virt.h +++ b/include/hw/loongarch/virt.h @@ -12,6 +12,7 @@ #include "hw/boards.h" #include "qemu/queue.h" #include "hw/intc/loongarch_ipi.h" +#include "hw/block/flash.h" =20 #define LOONGARCH_MAX_VCPUS 4 =20 @@ -20,6 +21,9 @@ #define VIRT_FWCFG_BASE 0x1e020000UL #define VIRT_BIOS_BASE 0x1c000000UL #define VIRT_BIOS_SIZE (4 * MiB) +#define VIRT_FLASH_SECTOR_SIZE (128 * KiB) +#define VIRT_FLASH_BASE 0x1d000000UL +#define VIRT_FLASH_SIZE (16 * MiB) =20 #define VIRT_LOWMEM_BASE 0 #define VIRT_LOWMEM_SIZE 0x10000000 @@ -48,6 +52,7 @@ struct LoongArchMachineState { int fdt_size; DeviceState *platform_bus_dev; PCIBus *pci_bus; + PFlashCFI01 *flash; }; =20 #define TYPE_LOONGARCH_MACHINE MACHINE_TYPE_NAME("virt") diff --git a/hw/loongarch/acpi-build.c b/hw/loongarch/acpi-build.c index 7d5f5a757d..c2b237736d 100644 --- a/hw/loongarch/acpi-build.c +++ b/hw/loongarch/acpi-build.c @@ -279,6 +279,23 @@ static void build_pci_device_aml(Aml *scope, LoongArch= MachineState *lams) acpi_dsdt_add_gpex(scope, &cfg); } =20 +static void build_flash_aml(Aml *scope, LoongArchMachineState *lams) +{ + Aml *dev, *crs; + + hwaddr flash_base =3D VIRT_FLASH_BASE; + hwaddr flash_size =3D VIRT_FLASH_SIZE; + + dev =3D aml_device("FLS0"); + aml_append(dev, aml_name_decl("_HID", aml_string("LNRO0015"))); + aml_append(dev, aml_name_decl("_UID", aml_int(0))); + + crs =3D aml_resource_template(); + aml_append(crs, aml_memory32_fixed(flash_base, flash_size, AML_READ_WR= ITE)); + aml_append(dev, aml_name_decl("_CRS", crs)); + aml_append(scope, dev); +} + #ifdef CONFIG_TPM static void acpi_dsdt_add_tpm(Aml *scope, LoongArchMachineState *vms) { @@ -328,6 +345,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, Mach= ineState *machine) build_uart_device_aml(dsdt); build_pci_device_aml(dsdt, lams); build_la_ged_aml(dsdt, machine); + build_flash_aml(dsdt, lams); #ifdef CONFIG_TPM acpi_dsdt_add_tpm(dsdt, lams); #endif diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c index 958be74fa1..c8a495ea30 100644 --- a/hw/loongarch/virt.c +++ b/hw/loongarch/virt.c @@ -42,6 +42,63 @@ #include "hw/display/ramfb.h" #include "hw/mem/pc-dimm.h" #include "sysemu/tpm.h" +#include "sysemu/block-backend.h" +#include "hw/block/flash.h" + +static void virt_flash_create(LoongArchMachineState *lams) +{ + DeviceState *dev =3D qdev_new(TYPE_PFLASH_CFI01); + + qdev_prop_set_uint64(dev, "sector-length", VIRT_FLASH_SECTOR_SIZE); + qdev_prop_set_uint8(dev, "width", 4); + qdev_prop_set_uint8(dev, "device-width", 2); + qdev_prop_set_bit(dev, "big-endian", false); + qdev_prop_set_uint16(dev, "id0", 0x89); + qdev_prop_set_uint16(dev, "id1", 0x18); + qdev_prop_set_uint16(dev, "id2", 0x00); + qdev_prop_set_uint16(dev, "id3", 0x00); + qdev_prop_set_string(dev, "name", "virt.flash"); + object_property_add_child(OBJECT(lams), "virt.flash", OBJECT(dev)); + object_property_add_alias(OBJECT(lams), "pflash", + OBJECT(dev), "drive"); + + lams->flash =3D PFLASH_CFI01(dev); +} + +static void virt_flash_map(LoongArchMachineState *lams, + MemoryRegion *sysmem) +{ + PFlashCFI01 *flash =3D lams->flash; + DeviceState *dev =3D DEVICE(flash); + hwaddr base =3D VIRT_FLASH_BASE; + hwaddr size =3D VIRT_FLASH_SIZE; + + assert(QEMU_IS_ALIGNED(size, VIRT_FLASH_SECTOR_SIZE)); + assert(size / VIRT_FLASH_SECTOR_SIZE <=3D UINT32_MAX); + + qdev_prop_set_uint32(dev, "num-blocks", size / VIRT_FLASH_SECTOR_SIZE); + sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); + memory_region_add_subregion(sysmem, base, + sysbus_mmio_get_region(SYS_BUS_DEVICE(dev)= , 0)); + +} + +static void fdt_add_flash_node(LoongArchMachineState *lams) +{ + MachineState *ms =3D MACHINE(lams); + char *nodename; + + hwaddr flash_base =3D VIRT_FLASH_BASE; + hwaddr flash_size =3D VIRT_FLASH_SIZE; + + nodename =3D g_strdup_printf("/flash@%" PRIx64, flash_base); + qemu_fdt_add_subnode(ms->fdt, nodename); + qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", "cfi-flash"); + qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", + 2, flash_base, 2, flash_size); + qemu_fdt_setprop_cell(ms->fdt, nodename, "bank-width", 4); + g_free(nodename); +} =20 static void fdt_add_rtc_node(LoongArchMachineState *lams) { @@ -596,6 +653,9 @@ static void loongarch_firmware_init(LoongArchMachineSta= te *lams) int bios_size; =20 lams->bios_loaded =3D false; + + virt_flash_map(lams, get_system_memory()); + if (filename) { bios_name =3D qemu_find_file(QEMU_FILE_TYPE_BIOS, filename); if (!bios_name) { @@ -779,6 +839,7 @@ static void loongarch_init(MachineState *machine) loongarch_direct_kernel_boot(lams); } } + fdt_add_flash_node(lams); /* register reset function */ for (i =3D 0; i < machine->smp.cpus; i++) { lacpu =3D LOONGARCH_CPU(qemu_get_cpu(i)); @@ -838,6 +899,7 @@ static void loongarch_machine_initfn(Object *obj) lams->acpi =3D ON_OFF_AUTO_AUTO; lams->oem_id =3D g_strndup(ACPI_BUILD_APPNAME6, 6); lams->oem_table_id =3D g_strndup(ACPI_BUILD_APPNAME8, 8); + virt_flash_create(lams); } =20 static bool memhp_type_supported(DeviceState *dev) diff --git a/hw/loongarch/Kconfig b/hw/loongarch/Kconfig index 17d15b6c90..eb112af990 100644 --- a/hw/loongarch/Kconfig +++ b/hw/loongarch/Kconfig @@ -20,3 +20,4 @@ config LOONGARCH_VIRT select ACPI_HW_REDUCED select FW_CFG_DMA select DIMM + select PFLASH_CFI01 --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670235479; cv=none; d=zohomail.com; s=zohoarc; b=m1pBqOPZR27zIfzSFHa2URQNg9CzFSP/QVGvd+nKmvwF0ecuNMDzdueW2NjSAiDsv7riy+MjcZ8BBsiEZdOLPwz/5qH7paLmOyQOFYqnICZO/rW9SGU7fT9vr2c8pxiOEgNk3mCuBtfCqnrOCFDUfXTaG+wYIRr4nUeZAxTf3qI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670235479; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=9oxN9dTnRZHuYgKUJ7HxItN5TO/8EAdFWU0o+By2T4Y=; b=MEElwutMDGuBtT2CsbD03Xqjus0dANChPc044g3/NjVWU1mAtT+4fzwg46TZVYJRo8MrhDCMHoHRW+x8PO1k93409ty5VumEftbqWDvC9xsS6atNQble6PTDkaB2oJL1gfm3PNRBB9PjdInHJRMoIz3ehEvdxr5rZm9Me6+PNtY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670235479289341.28058101153135; Mon, 5 Dec 2022 02:17:59 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Ck-0003YB-6d; Mon, 05 Dec 2022 04:56:06 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Ci-0003VJ-R8 for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:56:04 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Cg-0007Yt-W9 for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:56:04 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-37-lXKRaxyeNXqve1TTpz4ZMw-1; Mon, 05 Dec 2022 04:55:57 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 8D9D8185A7A9; Mon, 5 Dec 2022 09:55:55 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id A0C2B2166B2A; Mon, 5 Dec 2022 09:55:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234162; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=9oxN9dTnRZHuYgKUJ7HxItN5TO/8EAdFWU0o+By2T4Y=; b=PIdQck6w+HMm0k7+VjELh+Qr4GsyYCRyCeYO0rw2cIDHkKhHaAXPTkZ3LSZuaLgMVpd0xj LVdXw77NZ6OVutjjtmHFxq/KbV61JvosCEopzY4famyJ+kRfQl8QwJ/j7j/hyAezOSbHu0 J2YgNojKF+2uNp/MlVlKrf4qajSO5gE= X-MC-Unique: lXKRaxyeNXqve1TTpz4ZMw-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Bin Meng , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= Subject: [PATCH v2 25/51] tests/qtest/migration-test: Fix unlink error and memory leaks Date: Mon, 5 Dec 2022 10:52:02 +0100 Message-Id: <20221205095228.1314-26-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670235480612100003 From: Thomas Huth When running the migration test compiled with Clang from Fedora 37 and sanitizers enabled, there is an error complaining about unlink(): ../tests/qtest/migration-test.c:1072:12: runtime error: null pointer passed as argument 1, which is declared to never be null /usr/include/unistd.h:858:48: note: nonnull attribute specified here SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior ../tests/qtest/migration-test.c:1072:12 in (test program exited with status code 1) TAP parsing error: Too few tests run (expected 33, got 20) The data->clientcert and data->clientkey pointers can indeed be unset in some tests, so we have to check them before calling unlink() with those. While we're at it, I also noticed that the code is only freeing some but not all of the allocated strings in this function, and indeed, valgrind is also complaining about memory leaks here. So let's call g_free() on all allocated strings to avoid leaking memory here. Message-Id: <20221125083054.117504-1-thuth@redhat.com> Tested-by: Bin Meng Reviewed-by: Daniel P. Berrang=C3=A9 Reviewed-by: Juan Quintela Signed-off-by: Thomas Huth --- tests/qtest/migration-test.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/tests/qtest/migration-test.c b/tests/qtest/migration-test.c index 442998d9eb..dbde726adf 100644 --- a/tests/qtest/migration-test.c +++ b/tests/qtest/migration-test.c @@ -1066,15 +1066,27 @@ test_migrate_tls_x509_finish(QTestState *from, TestMigrateTLSX509Data *data =3D opaque; =20 test_tls_cleanup(data->keyfile); + g_free(data->keyfile); + unlink(data->cacert); + g_free(data->cacert); unlink(data->servercert); + g_free(data->servercert); unlink(data->serverkey); - unlink(data->clientcert); - unlink(data->clientkey); + g_free(data->serverkey); + + if (data->clientcert) { + unlink(data->clientcert); + g_free(data->clientcert); + } + if (data->clientkey) { + unlink(data->clientkey); + g_free(data->clientkey); + } + rmdir(data->workdir); - g_free(data->workdir); - g_free(data->keyfile); + g_free(data); } #endif /* CONFIG_TASN1 */ --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670235034; cv=none; d=zohomail.com; s=zohoarc; b=emiWxxxWED98tUiv2lmSX91MIs9RWEH7QgRiKJZsFL8nfar2ezSsgFc+2oVA++B0Qq+bmNw6TVmyaVnGwJ2tu/V2+kLqQLVBsejsgqrFVQ5qiODLwvbnV7dPFEc9zL3fwusxWjDmvcbXpbBtOa8xwHyLWTVqFTTUgx1mgI+KLg0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670235034; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Hw3P8H5TEBArqeghTjjseYw/s4nFSWWkJ9rmhoVRUno=; b=GnInjbjXaePsjwmW8raqqMyWL8Lby++Oxx/E7XNlyFWJd2ZxM5EE5UsSildrHdKQAeFKPo5iwFYLbBz9gtr29JupRcLGaRqJhHzwq16dAMZTCU1LDCfzdzb80EZIokjXE6kQS5jVI1yFlPYhzOuWKaV9DI6X2hDixdO3btaPytw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670235034883625.3835514670484; Mon, 5 Dec 2022 02:10:34 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Ct-0003kn-2W; Mon, 05 Dec 2022 04:56:15 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Cp-0003hu-2j for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:56:11 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Cm-0007Zo-2h for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:56:10 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-86-kb_4S__COQ6ApFpRLzKmiA-1; Mon, 05 Dec 2022 04:56:04 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 3B3B9185A7A3; Mon, 5 Dec 2022 09:56:03 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id DCE292166B2E; Mon, 5 Dec 2022 09:55:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234167; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Hw3P8H5TEBArqeghTjjseYw/s4nFSWWkJ9rmhoVRUno=; b=ThItRtsGxSqrT4amTe7Ud1D9e+ZoH28P6RlxJvgQefspWgsK6LBSQUhZTSLzaq/ystgHS7 NlAtlPtGmwypmoJ2Z0AUy73EWtyBQfWZ/nrGrLUT8+AySCdrhGg+m5IX1JQ8AjH2wUgNyC vBsWMQqqfUyqGIQulxowinXQ0SPx8jA= X-MC-Unique: kb_4S__COQ6ApFpRLzKmiA-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz Subject: [PATCH v2 26/51] target/s390x/tcg: Fix and improve the SACF instruction Date: Mon, 5 Dec 2022 10:52:03 +0100 Message-Id: <20221205095228.1314-27-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670235036906100003 Content-Type: text/plain; charset="utf-8" From: Thomas Huth The SET ADDRESS SPACE CONTROL FAST instruction is not privileged, it can be used from problem space, too. Just the switching to the home address space is privileged and should still generate a privilege exception. This bug is e.g. causing programs like Java that use the "getcpu" vdso kernel function to crash (see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=3D990417#26= ). While we're at it, also check if DAT is not enabled. In that case the instruction is supposed to generate a special operation exception. Resolves: https://gitlab.com/qemu-project/qemu/-/issues/655 Message-Id: <20221201184443.136355-1-thuth@redhat.com> Reviewed-by: Ilya Leoshkevich Reviewed-by: David Hildenbrand Reviewed-by: Richard Henderson Signed-off-by: Thomas Huth --- target/s390x/tcg/insn-data.h.inc | 2 +- target/s390x/tcg/cc_helper.c | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/target/s390x/tcg/insn-data.h.inc b/target/s390x/tcg/insn-data.= h.inc index 7e952bdfc8..54d4250c9f 100644 --- a/target/s390x/tcg/insn-data.h.inc +++ b/target/s390x/tcg/insn-data.h.inc @@ -1365,7 +1365,7 @@ /* SERVICE CALL LOGICAL PROCESSOR (PV hypercall) */ F(0xb220, SERVC, RRE, Z, r1_o, r2_o, 0, 0, servc, 0, IF_PRIV | I= F_IO) /* SET ADDRESS SPACE CONTROL FAST */ - F(0xb279, SACF, S, Z, 0, a2, 0, 0, sacf, 0, IF_PRIV) + C(0xb279, SACF, S, Z, 0, a2, 0, 0, sacf, 0) /* SET CLOCK */ F(0xb204, SCK, S, Z, 0, m2_64a, 0, 0, sck, 0, IF_PRIV | IF_I= O) /* SET CLOCK COMPARATOR */ diff --git a/target/s390x/tcg/cc_helper.c b/target/s390x/tcg/cc_helper.c index b2e8d3d9f5..b36f8cdc8b 100644 --- a/target/s390x/tcg/cc_helper.c +++ b/target/s390x/tcg/cc_helper.c @@ -487,6 +487,10 @@ void HELPER(sacf)(CPUS390XState *env, uint64_t a1) { HELPER_LOG("%s: %16" PRIx64 "\n", __func__, a1); =20 + if (!(env->psw.mask & PSW_MASK_DAT)) { + tcg_s390_program_interrupt(env, PGM_SPECIAL_OP, GETPC()); + } + switch (a1 & 0xf00) { case 0x000: env->psw.mask &=3D ~PSW_MASK_ASC; @@ -497,6 +501,9 @@ void HELPER(sacf)(CPUS390XState *env, uint64_t a1) env->psw.mask |=3D PSW_ASC_SECONDARY; break; case 0x300: + if ((env->psw.mask & PSW_MASK_PSTATE) !=3D 0) { + tcg_s390_program_interrupt(env, PGM_PRIVILEGED, GETPC()); + } env->psw.mask &=3D ~PSW_MASK_ASC; env->psw.mask |=3D PSW_ASC_HOME; break; --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670235718; cv=none; d=zohomail.com; s=zohoarc; b=RDJuCuedsNy3mTnZXBrrcpMAD8K4oHLS8SFl7tMBqamTZOWxCXF1oP0de8BSloqWUP8QNZAI0tJLTI4K4ehaB55WUrDU+SPsi07G/oIpawyJU/nCZlNXG5ibTc5yTrTJ0FSTRlvqsF65oHIpuQvCkFa87o6dYk1n99vLwdmEkyE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670235718; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=XBQnhZpZ71SlO6xn4rjOE8oPXgCnfntRGbd+BOiogGQ=; b=nDIiWUreTDh8TnMAdSdG60xy+Q9+eB90z9irUU7R40/eYuKYd9E6Gs4MK+5IF67nqOauwN1Bdn9sXVrFWaXZW16JMR8mxoJt7p4dHqtpPRyDlGxwgXV1ieLtxyNDvLH2tvEOW9kRJAanRyLlHEdIeW03jsSYbcDPiOAdNFgVYoo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670235718441909.7903618016045; Mon, 5 Dec 2022 02:21:58 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Cz-0003u9-HP; Mon, 05 Dec 2022 04:56:21 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Cx-0003s4-7B for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:56:20 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Cv-0007bB-OK for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:56:18 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-235-BSMwrv3aN9mwK21WovcvUg-1; Mon, 05 Dec 2022 04:56:12 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 38893101A528; Mon, 5 Dec 2022 09:56:11 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8C38D2166B29; Mon, 5 Dec 2022 09:56:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234177; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XBQnhZpZ71SlO6xn4rjOE8oPXgCnfntRGbd+BOiogGQ=; b=D+cTu0T6yM5MYdJ2ma1UCte4SFrOI6utytmtMYIq34SXueWKdh+HS8nr5mjcXoePT1Hhm6 VwFM0wS2EQqxsvkC9LoZpfJJj9hR6UZ31m6fmJlxLPEiidwWJQUaczNePIbL4bjk3kr/hf 7xBbiQpC8b1iKlP8fOtVl+BuoDUxE5I= X-MC-Unique: BSMwrv3aN9mwK21WovcvUg-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Evgeny Ermakov , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v2 27/51] hw/display/next-fb: Fix comment typo Date: Mon, 5 Dec 2022 10:52:04 +0100 Message-Id: <20221205095228.1314-28-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670235719491100001 From: Evgeny Ermakov Signed-off-by: Evgeny Ermakov Message-Id: <20221125160849.23711-1-evgeny.v.ermakov@gmail.com> Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Peter Maydell Signed-off-by: Thomas Huth --- hw/display/next-fb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/display/next-fb.c b/hw/display/next-fb.c index dd6a1aa8ae..8446ff3c00 100644 --- a/hw/display/next-fb.c +++ b/hw/display/next-fb.c @@ -126,7 +126,7 @@ static void nextfb_class_init(ObjectClass *oc, void *da= ta) set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories); dc->realize =3D nextfb_realize; =20 - /* Note: This device does not any state that we have to reset or migra= te */ + /* Note: This device does not have any state that we have to reset or = migrate */ } =20 static const TypeInfo nextfb_info =3D { --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670235956064535.0262971479334; Mon, 5 Dec 2022 02:25:56 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28DD-00044S-9m; Mon, 05 Dec 2022 04:56:37 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28D4-0003zt-Sv for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:56:27 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28D3-0007e4-1c for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:56:26 -0500 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-380-MA_bZf-JMraWsKJtq-b-Pg-1; Mon, 05 Dec 2022 04:56:20 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 27CCD3814583; Mon, 5 Dec 2022 09:56:19 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8DE932166B29; Mon, 5 Dec 2022 09:56:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234184; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=UZm70PSygUPn7UXNAT5LnhWWt6V/uNbWzHaNnNPhKro=; b=OTEqMIqfFHsBgJW5GTJul2GHuPfsABy4kvD8se/XMS5zXWcny45nbcnfZO0zUfKsOUi5r8 +uTFSYQ4JZPOrvzYZozKPWcHomjQhpGbnnzD8ZMNRnYY24FjuEBj6qGmgFkD3CQe1eM4Yi DdbF814uqiJ2ajRmfyvd4XjwOW2E73E= X-MC-Unique: MA_bZf-JMraWsKJtq-b-Pg-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Leonardo Bras Subject: [PATCH v2 28/51] multifd: Create page_size fields into both MultiFD{Recv, Send}Params Date: Mon, 5 Dec 2022 10:52:05 +0100 Message-Id: <20221205095228.1314-29-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1670235957055100001 Content-Type: text/plain; charset="utf-8" We were calling qemu_target_page_size() left and right. Signed-off-by: Juan Quintela Reviewed-by: Leonardo Bras --- migration/multifd.h | 4 ++++ migration/multifd-zlib.c | 14 ++++++-------- migration/multifd-zstd.c | 12 +++++------- migration/multifd.c | 18 ++++++++---------- 4 files changed, 23 insertions(+), 25 deletions(-) diff --git a/migration/multifd.h b/migration/multifd.h index 519f498643..86fb9982b3 100644 --- a/migration/multifd.h +++ b/migration/multifd.h @@ -80,6 +80,8 @@ typedef struct { bool registered_yank; /* packet allocated len */ uint32_t packet_len; + /* guest page size */ + uint32_t page_size; /* multifd flags for sending ram */ int write_flags; =20 @@ -143,6 +145,8 @@ typedef struct { QIOChannel *c; /* packet allocated len */ uint32_t packet_len; + /* guest page size */ + uint32_t page_size; =20 /* syncs main thread and channels */ QemuSemaphore sem_sync; diff --git a/migration/multifd-zlib.c b/migration/multifd-zlib.c index 18213a9513..37770248e1 100644 --- a/migration/multifd-zlib.c +++ b/migration/multifd-zlib.c @@ -116,7 +116,6 @@ static void zlib_send_cleanup(MultiFDSendParams *p, Err= or **errp) static int zlib_send_prepare(MultiFDSendParams *p, Error **errp) { struct zlib_data *z =3D p->data; - size_t page_size =3D qemu_target_page_size(); z_stream *zs =3D &z->zs; uint32_t out_size =3D 0; int ret; @@ -135,8 +134,8 @@ static int zlib_send_prepare(MultiFDSendParams *p, Erro= r **errp) * with compression. zlib does not guarantee that this is safe, * therefore copy the page before calling deflate(). */ - memcpy(z->buf, p->pages->block->host + p->normal[i], page_size); - zs->avail_in =3D page_size; + memcpy(z->buf, p->pages->block->host + p->normal[i], p->page_size); + zs->avail_in =3D p->page_size; zs->next_in =3D z->buf; =20 zs->avail_out =3D available; @@ -242,12 +241,11 @@ static void zlib_recv_cleanup(MultiFDRecvParams *p) static int zlib_recv_pages(MultiFDRecvParams *p, Error **errp) { struct zlib_data *z =3D p->data; - size_t page_size =3D qemu_target_page_size(); z_stream *zs =3D &z->zs; uint32_t in_size =3D p->next_packet_size; /* we measure the change of total_out */ uint32_t out_size =3D zs->total_out; - uint32_t expected_size =3D p->normal_num * page_size; + uint32_t expected_size =3D p->normal_num * p->page_size; uint32_t flags =3D p->flags & MULTIFD_FLAG_COMPRESSION_MASK; int ret; int i; @@ -274,7 +272,7 @@ static int zlib_recv_pages(MultiFDRecvParams *p, Error = **errp) flush =3D Z_SYNC_FLUSH; } =20 - zs->avail_out =3D page_size; + zs->avail_out =3D p->page_size; zs->next_out =3D p->host + p->normal[i]; =20 /* @@ -288,8 +286,8 @@ static int zlib_recv_pages(MultiFDRecvParams *p, Error = **errp) do { ret =3D inflate(zs, flush); } while (ret =3D=3D Z_OK && zs->avail_in - && (zs->total_out - start) < page_size); - if (ret =3D=3D Z_OK && (zs->total_out - start) < page_size) { + && (zs->total_out - start) < p->page_size); + if (ret =3D=3D Z_OK && (zs->total_out - start) < p->page_size) { error_setg(errp, "multifd %u: inflate generated too few output= ", p->id); return -1; diff --git a/migration/multifd-zstd.c b/migration/multifd-zstd.c index d788d309f2..f4a8e1ed1f 100644 --- a/migration/multifd-zstd.c +++ b/migration/multifd-zstd.c @@ -113,7 +113,6 @@ static void zstd_send_cleanup(MultiFDSendParams *p, Err= or **errp) static int zstd_send_prepare(MultiFDSendParams *p, Error **errp) { struct zstd_data *z =3D p->data; - size_t page_size =3D qemu_target_page_size(); int ret; uint32_t i; =20 @@ -128,7 +127,7 @@ static int zstd_send_prepare(MultiFDSendParams *p, Erro= r **errp) flush =3D ZSTD_e_flush; } z->in.src =3D p->pages->block->host + p->normal[i]; - z->in.size =3D page_size; + z->in.size =3D p->page_size; z->in.pos =3D 0; =20 /* @@ -241,8 +240,7 @@ static int zstd_recv_pages(MultiFDRecvParams *p, Error = **errp) { uint32_t in_size =3D p->next_packet_size; uint32_t out_size =3D 0; - size_t page_size =3D qemu_target_page_size(); - uint32_t expected_size =3D p->normal_num * page_size; + uint32_t expected_size =3D p->normal_num * p->page_size; uint32_t flags =3D p->flags & MULTIFD_FLAG_COMPRESSION_MASK; struct zstd_data *z =3D p->data; int ret; @@ -265,7 +263,7 @@ static int zstd_recv_pages(MultiFDRecvParams *p, Error = **errp) =20 for (i =3D 0; i < p->normal_num; i++) { z->out.dst =3D p->host + p->normal[i]; - z->out.size =3D page_size; + z->out.size =3D p->page_size; z->out.pos =3D 0; =20 /* @@ -279,8 +277,8 @@ static int zstd_recv_pages(MultiFDRecvParams *p, Error = **errp) do { ret =3D ZSTD_decompressStream(z->zds, &z->out, &z->in); } while (ret > 0 && (z->in.size - z->in.pos > 0) - && (z->out.pos < page_size)); - if (ret > 0 && (z->out.pos < page_size)) { + && (z->out.pos < p->page_size)); + if (ret > 0 && (z->out.pos < p->page_size)) { error_setg(errp, "multifd %u: decompressStream buffer too smal= l", p->id); return -1; diff --git a/migration/multifd.c b/migration/multifd.c index 509bbbe3bf..efffa77a76 100644 --- a/migration/multifd.c +++ b/migration/multifd.c @@ -87,15 +87,14 @@ static void nocomp_send_cleanup(MultiFDSendParams *p, E= rror **errp) static int nocomp_send_prepare(MultiFDSendParams *p, Error **errp) { MultiFDPages_t *pages =3D p->pages; - size_t page_size =3D qemu_target_page_size(); =20 for (int i =3D 0; i < p->normal_num; i++) { p->iov[p->iovs_num].iov_base =3D pages->block->host + p->normal[i]; - p->iov[p->iovs_num].iov_len =3D page_size; + p->iov[p->iovs_num].iov_len =3D p->page_size; p->iovs_num++; } =20 - p->next_packet_size =3D p->normal_num * page_size; + p->next_packet_size =3D p->normal_num * p->page_size; p->flags |=3D MULTIFD_FLAG_NOCOMP; return 0; } @@ -139,7 +138,6 @@ static void nocomp_recv_cleanup(MultiFDRecvParams *p) static int nocomp_recv_pages(MultiFDRecvParams *p, Error **errp) { uint32_t flags =3D p->flags & MULTIFD_FLAG_COMPRESSION_MASK; - size_t page_size =3D qemu_target_page_size(); =20 if (flags !=3D MULTIFD_FLAG_NOCOMP) { error_setg(errp, "multifd %u: flags received %x flags expected %x", @@ -148,7 +146,7 @@ static int nocomp_recv_pages(MultiFDRecvParams *p, Erro= r **errp) } for (int i =3D 0; i < p->normal_num; i++) { p->iov[i].iov_base =3D p->host + p->normal[i]; - p->iov[i].iov_len =3D page_size; + p->iov[i].iov_len =3D p->page_size; } return qio_channel_readv_all(p->c, p->iov, p->normal_num, errp); } @@ -281,8 +279,7 @@ static void multifd_send_fill_packet(MultiFDSendParams = *p) static int multifd_recv_unfill_packet(MultiFDRecvParams *p, Error **errp) { MultiFDPacket_t *packet =3D p->packet; - size_t page_size =3D qemu_target_page_size(); - uint32_t page_count =3D MULTIFD_PACKET_SIZE / page_size; + uint32_t page_count =3D MULTIFD_PACKET_SIZE / p->page_size; RAMBlock *block; int i; =20 @@ -344,7 +341,7 @@ static int multifd_recv_unfill_packet(MultiFDRecvParams= *p, Error **errp) for (i =3D 0; i < p->normal_num; i++) { uint64_t offset =3D be64_to_cpu(packet->offset[i]); =20 - if (offset > (block->used_length - page_size)) { + if (offset > (block->used_length - p->page_size)) { error_setg(errp, "multifd: offset too long %" PRIu64 " (max " RAM_ADDR_FMT ")", offset, block->used_length); @@ -433,8 +430,7 @@ static int multifd_send_pages(QEMUFile *f) p->packet_num =3D multifd_send_state->packet_num++; multifd_send_state->pages =3D p->pages; p->pages =3D pages; - transferred =3D ((uint64_t) pages->num) * qemu_target_page_size() - + p->packet_len; + transferred =3D ((uint64_t) pages->num) * p->page_size + p->packet_len; qemu_file_acct_rate_limit(f, transferred); ram_counters.multifd_bytes +=3D transferred; ram_counters.transferred +=3D transferred; @@ -947,6 +943,7 @@ int multifd_save_setup(Error **errp) /* We need one extra place for the packet header */ p->iov =3D g_new0(struct iovec, page_count + 1); p->normal =3D g_new0(ram_addr_t, page_count); + p->page_size =3D qemu_target_page_size(); =20 if (migrate_use_zero_copy_send()) { p->write_flags =3D QIO_CHANNEL_WRITE_FLAG_ZERO_COPY; @@ -1194,6 +1191,7 @@ int multifd_load_setup(Error **errp) p->name =3D g_strdup_printf("multifdrecv_%d", i); p->iov =3D g_new0(struct iovec, page_count); p->normal =3D g_new0(ram_addr_t, page_count); + p->page_size =3D qemu_target_page_size(); } =20 for (i =3D 0; i < thread_count; i++) { --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 167023632478332.21315370966863; Mon, 5 Dec 2022 02:32:04 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28DN-0004C4-7v; Mon, 05 Dec 2022 04:56:45 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28DE-00045b-QC for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:56:39 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28DA-0007ji-W6 for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:56:36 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-428-QPlaoyc6PiKol5iUMkrnGg-1; Mon, 05 Dec 2022 04:56:28 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 3AD08858282; Mon, 5 Dec 2022 09:56:27 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7637C2166B29; Mon, 5 Dec 2022 09:56:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234192; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=9tm0aYZytXya9yAOHxEbm0Rd0xivxdFo7KkNO5L47xU=; b=a0wUH1LHSAxMfpnsFGe/RHa+XzfgMzwMUFAlHBruoGIjezcD4cstWUrn+busUs7uWTvb+p OWO6QDcqp7n/fBAqHRS2RQMi7ZEmwfauPXl6eWmDDeWjg+m/Z1QsTpP5BnUTZKLtjSzCnW AI5ZlAXRbee606mUjHuJnJUDzZt/GUE= X-MC-Unique: QPlaoyc6PiKol5iUMkrnGg-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Leonardo Bras Subject: [PATCH v2 29/51] multifd: Create page_count fields into both MultiFD{Recv, Send}Params Date: Mon, 5 Dec 2022 10:52:06 +0100 Message-Id: <20221205095228.1314-30-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1670236326651100003 Content-Type: text/plain; charset="utf-8" We were recalculating it left and right. We plan to change that values on next patches. Signed-off-by: Juan Quintela Reviewed-by: Leonardo Bras --- migration/multifd.h | 4 ++++ migration/multifd.c | 7 ++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/migration/multifd.h b/migration/multifd.h index 86fb9982b3..e2802a9ce2 100644 --- a/migration/multifd.h +++ b/migration/multifd.h @@ -82,6 +82,8 @@ typedef struct { uint32_t packet_len; /* guest page size */ uint32_t page_size; + /* number of pages in a full packet */ + uint32_t page_count; /* multifd flags for sending ram */ int write_flags; =20 @@ -147,6 +149,8 @@ typedef struct { uint32_t packet_len; /* guest page size */ uint32_t page_size; + /* number of pages in a full packet */ + uint32_t page_count; =20 /* syncs main thread and channels */ QemuSemaphore sem_sync; diff --git a/migration/multifd.c b/migration/multifd.c index efffa77a76..b8dc559d24 100644 --- a/migration/multifd.c +++ b/migration/multifd.c @@ -279,7 +279,6 @@ static void multifd_send_fill_packet(MultiFDSendParams = *p) static int multifd_recv_unfill_packet(MultiFDRecvParams *p, Error **errp) { MultiFDPacket_t *packet =3D p->packet; - uint32_t page_count =3D MULTIFD_PACKET_SIZE / p->page_size; RAMBlock *block; int i; =20 @@ -306,10 +305,10 @@ static int multifd_recv_unfill_packet(MultiFDRecvPara= ms *p, Error **errp) * If we received a packet that is 100 times bigger than expected * just stop migration. It is a magic number. */ - if (packet->pages_alloc > page_count) { + if (packet->pages_alloc > p->page_count) { error_setg(errp, "multifd: received packet " "with size %u and expected a size of %u", - packet->pages_alloc, page_count) ; + packet->pages_alloc, p->page_count) ; return -1; } =20 @@ -944,6 +943,7 @@ int multifd_save_setup(Error **errp) p->iov =3D g_new0(struct iovec, page_count + 1); p->normal =3D g_new0(ram_addr_t, page_count); p->page_size =3D qemu_target_page_size(); + p->page_count =3D page_count; =20 if (migrate_use_zero_copy_send()) { p->write_flags =3D QIO_CHANNEL_WRITE_FLAG_ZERO_COPY; @@ -1191,6 +1191,7 @@ int multifd_load_setup(Error **errp) p->name =3D g_strdup_printf("multifdrecv_%d", i); p->iov =3D g_new0(struct iovec, page_count); p->normal =3D g_new0(ram_addr_t, page_count); + p->page_count =3D page_count; p->page_size =3D qemu_target_page_size(); } =20 --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670235513; cv=none; d=zohomail.com; s=zohoarc; b=PKMMVYPjR9tvT+kyrxiqmw4sgXY68MifUFhV7Km0dVpNNeXZvblBRoSFR0Ea3BUWM+vSlSaya2Nqs8xZsGvRP6DlQPb7IHr+UttyRHAKPG3Bb9BJP7Maie9S+u+6JMHNWJHP1vQZN5gG8ZUL3yamBfAnEHzcCZ4Ncvw6n93tOHc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670235513; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=wht3cZbEag0AF4cSKduIqGDfC02z0cnt1HmfpmfZWO0=; b=ho2TvN9XICwnEpvOpdwMx79rX9DOPt4mPbmH+TPiyKKwzl5tML/orAH1yM/u0+3QXO5KLy7unZneZVxr7YDtmBzrMtsD9iLQU9iA476yyrQdF26f933IUrBKY5Cacr6RtCt8MO596OFsoOq8yyBW5n97TGace0T1gKm0jcg9MyE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670235513973847.6010571100819; Mon, 5 Dec 2022 02:18:33 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28DO-0004Eh-Fq; Mon, 05 Dec 2022 04:56:46 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28DM-0004BY-JM for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:56:44 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28DK-0007l6-Rv for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:56:44 -0500 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-589-nHYc-QPBO9eadOh-sy8XhA-1; Mon, 05 Dec 2022 04:56:38 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 43A3D1C07824; Mon, 5 Dec 2022 09:56:35 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 910B22166B2A; Mon, 5 Dec 2022 09:56:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234202; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wht3cZbEag0AF4cSKduIqGDfC02z0cnt1HmfpmfZWO0=; b=ByQJTkZ/QSQnl3M5w4Gs5W22CAf+jeUGNA74cBQ2Z7puqIA0rMQ9pMh4tNAIylF7cYIz4Y fH8dFsz0Z3HCBlyHCaj3Pa0ZpCDlhAlozLmT6ZAQom1cU+MhAcPHSn7+fQCcxg1bhJtGG2 bUrwGR8d3oTaRab2DbF4IFjsfRSUfe4= X-MC-Unique: nHYc-QPBO9eadOh-sy8XhA-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , David Edmondson , Leonardo Bras Subject: [PATCH v2 30/51] migration: Export ram_transferred_ram() Date: Mon, 5 Dec 2022 10:52:07 +0100 Message-Id: <20221205095228.1314-31-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670235514519100001 Content-Type: text/plain; charset="utf-8" Signed-off-by: Juan Quintela Reviewed-by: Dr. David Alan Gilbert Reviewed-by: David Edmondson Reviewed-by: Leonardo Bras --- migration/ram.h | 2 ++ migration/ram.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/migration/ram.h b/migration/ram.h index c7af65ac74..e844966f69 100644 --- a/migration/ram.h +++ b/migration/ram.h @@ -65,6 +65,8 @@ int ram_load_postcopy(QEMUFile *f, int channel); =20 void ram_handle_compressed(void *host, uint8_t ch, uint64_t size); =20 +void ram_transferred_add(uint64_t bytes); + int ramblock_recv_bitmap_test(RAMBlock *rb, void *host_addr); bool ramblock_recv_bitmap_test_byte_offset(RAMBlock *rb, uint64_t byte_off= set); void ramblock_recv_bitmap_set(RAMBlock *rb, void *host_addr); diff --git a/migration/ram.c b/migration/ram.c index 1338e47665..2cbe707bfc 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -422,7 +422,7 @@ uint64_t ram_bytes_remaining(void) =20 MigrationStats ram_counters; =20 -static void ram_transferred_add(uint64_t bytes) +void ram_transferred_add(uint64_t bytes) { if (runstate_is_running()) { ram_counters.precopy_bytes +=3D bytes; --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670234793; cv=none; d=zohomail.com; s=zohoarc; b=MvbrXvFBOz/+UhNuVjJ3QeOoKH2XaY1r7hYawgx37klUuiZZvdUu7eMyQbQLvxqh12kLyZqvA6FVHvqozYOdT9ZabWBg5Q1rHhMO5rn04bWUJZ/KbMCNEMwpmZRTt3CG3Zhe4BsPzmQn4rBjhnxTG8KDff66UXjGAvr+0Dflnnw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670234793; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=82n06ypGY49Plz4M2tcMx6flFk5mja5S3ptKNYMoHNk=; b=RwcHA4V5SxsJdHJ7ZzfiW2klvB+JeEKVxS3W2Fj/g4TI7DXKSzZILVIF0bNVo5fBGySYA3LgGnDLhRWprj/fBQLR2j4TS6PKfIja7nmNKaUWB24nDYSJCfDv14P6uL521tJkxTymzPKBVRyhJOG/YZ9zG7KloXZfzS9D6sDJs9w= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670234793510795.4449798545224; Mon, 5 Dec 2022 02:06:33 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28DS-0004Mp-TL; Mon, 05 Dec 2022 04:56:51 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28DR-0004Iz-HC for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:56:49 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28DP-0007mT-Rn for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:56:49 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-618-DYXS60Q6PNi4_cp8T_BTcA-1; Mon, 05 Dec 2022 04:56:44 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 0674085A59D; Mon, 5 Dec 2022 09:56:43 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9201A2166B29; Mon, 5 Dec 2022 09:56:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234207; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=82n06ypGY49Plz4M2tcMx6flFk5mja5S3ptKNYMoHNk=; b=cWldzDWuH+oDpUaAmYfE52/aDY+HC4c+AhCNexD84rFIQiZgEonOmXf9jUn6Gh40RTLAe9 3esx4lJinJ7i2XxAbp0frUasXmnF51FnqOKib5d+4cBdaC6/srvT2Py0Em0VZ08qCpZfJC 8uwwnsF1wlK89JQboLc65Ildiw/DxVE= X-MC-Unique: DYXS60Q6PNi4_cp8T_BTcA-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Leonardo Bras Subject: [PATCH v2 31/51] migration: Export ram_release_page() Date: Mon, 5 Dec 2022 10:52:08 +0100 Message-Id: <20221205095228.1314-32-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670234794905100001 Content-Type: text/plain; charset="utf-8" Signed-off-by: Juan Quintela Reviewed-by: Leonardo Bras --- migration/ram.h | 1 + migration/ram.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/migration/ram.h b/migration/ram.h index e844966f69..038d52f49f 100644 --- a/migration/ram.h +++ b/migration/ram.h @@ -66,6 +66,7 @@ int ram_load_postcopy(QEMUFile *f, int channel); void ram_handle_compressed(void *host, uint8_t ch, uint64_t size); =20 void ram_transferred_add(uint64_t bytes); +void ram_release_page(const char *rbname, uint64_t offset); =20 int ramblock_recv_bitmap_test(RAMBlock *rb, void *host_addr); bool ramblock_recv_bitmap_test_byte_offset(RAMBlock *rb, uint64_t byte_off= set); diff --git a/migration/ram.c b/migration/ram.c index 2cbe707bfc..8aad17c429 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -1234,7 +1234,7 @@ static void migration_bitmap_sync_precopy(RAMState *r= s) } } =20 -static void ram_release_page(const char *rbname, uint64_t offset) +void ram_release_page(const char *rbname, uint64_t offset) { if (!migrate_release_ram() || !migration_in_postcopy()) { return; --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670236323; cv=none; d=zohomail.com; s=zohoarc; b=jL0EK4fnz5vrNGUFXSqW2fnsQVWjCFnR/FHnlEHhT+k25rh9W9qHOJvCD0ChSKzZGi2nobCFFyI+M86gbs754tCoBIfeOq1ZLa5YQrm3WozLBPy+p7bdNW6Xn7wdMlAy2n1Z5XFVQPKzKpAWysOkYi7u5kBql23hlLiWuQZH2HY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670236323; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=mwG7VmeQ4OSrYdmnU8HIXq4U+zlJC1ZXAM3D1p/Nf8Q=; b=ciArrCgvi4IXyT87Zn+xupr/TaZBO5BWY96LqkpxEEFQMB61aFHp++V5EtehqsyTTuPidvSwx0XiSDl+vFowyUTRUMSkLKyFTUrOek8HY2ctp1toktXspDnALITQXL9cvaGIhUiX3QWH9dyC0A/2VBiu5XhD5GghlTA00cMuu1Y= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670236323955184.76554195134065; Mon, 5 Dec 2022 02:32:03 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Dn-0004lQ-LM; Mon, 05 Dec 2022 04:57:12 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Da-0004YA-43 for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:56:58 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28DY-0007oL-GD for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:56:57 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-351-tzRvit9cMNGxqrix2mSlvA-1; Mon, 05 Dec 2022 04:56:52 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id BD6F485A588; Mon, 5 Dec 2022 09:56:50 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5BDAF2166B2E; Mon, 5 Dec 2022 09:56:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234215; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=mwG7VmeQ4OSrYdmnU8HIXq4U+zlJC1ZXAM3D1p/Nf8Q=; b=SQKQEU2hKQpWgydArCIP3Ljb45jbaZTZlJm1AjR7AIKB+C6otYU/18P5wii7L/SNOY4Doz OhpmHUvYINVjqvLZWdCSjYjD0875oqYAAqWE0XWd5OpTfCNzd7K6cxVf1h4CeE4q8EDJpI xFsn9SEFbQl3isFrCLGwFjCefw+/CMY= X-MC-Unique: tzRvit9cMNGxqrix2mSlvA-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Peter Xu Subject: [PATCH v2 32/51] migration: Take bitmap mutex when completing ram migration Date: Mon, 5 Dec 2022 10:52:09 +0100 Message-Id: <20221205095228.1314-33-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670236325305100001 Content-Type: text/plain; charset="utf-8" From: Peter Xu Any call to ram_find_and_save_block() needs to take the bitmap mutex. We used to not take it for most of ram_save_complete() because we thought we're the only one left using the bitmap, but it's not true after the preempt full patchset applied, since the return path can be taking it too. Signed-off-by: Peter Xu Reviewed-by: Juan Quintela Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Juan Quintela --- migration/ram.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/migration/ram.c b/migration/ram.c index 8aad17c429..cc72c24c18 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -3406,6 +3406,7 @@ static int ram_save_complete(QEMUFile *f, void *opaqu= e) /* try transferring iterative blocks of memory */ =20 /* flush all remaining blocks regardless of rate limiting */ + qemu_mutex_lock(&rs->bitmap_mutex); while (true) { int pages; =20 @@ -3419,6 +3420,7 @@ static int ram_save_complete(QEMUFile *f, void *opaqu= e) break; } } + qemu_mutex_unlock(&rs->bitmap_mutex); =20 flush_compressed_data(rs); ram_control_after_iterate(f, RAM_CONTROL_FINISH); --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670234993; cv=none; d=zohomail.com; s=zohoarc; b=CsQIes6DTsz6IPyEWUL/1vS2K+4s5pmQvf/jMpnwknerl7QepAyTFzAVMWIFDDfXcYbv6sTFEhXQBw7M+GmoK53ioJy+VfE7z4dnuFfotbsZBwcKv3lpKirWEvNw7swvxSqfzADL55wcwW4eADJnt0E6ZwyQRbe1uWHcMUk33ic= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670234993; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Y2FikQbfX3Vpm8/roYrQu/IEscu7tBjOtyBOMBEKAZ8=; b=kTSIHqczeCRyUTXE0acRs30TglWf8kW6MsVL004piKDgGblpe1w62YQ9lIGL+5g4xtqApDrefe99CaN3PZUzgZCOp0a44UwJu4xUcN57GXPYG0vtmYiqSTErKQsd62bHnFlzHnyAaa7TsJmbmHcAqw+51C8bwziPyjnEvveaHFY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670234993034187.55440035371134; Mon, 5 Dec 2022 02:09:53 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Ds-0004sV-BM; Mon, 05 Dec 2022 04:57:16 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Dk-0004l8-Qr for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:57:09 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Dj-0007rQ-Bo for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:57:08 -0500 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-496-QIcmUqs4PX-zrDUeLndWtw-1; Mon, 05 Dec 2022 04:57:00 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 9478E3814946; Mon, 5 Dec 2022 09:56:58 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 174662166B29; Mon, 5 Dec 2022 09:56:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234225; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Y2FikQbfX3Vpm8/roYrQu/IEscu7tBjOtyBOMBEKAZ8=; b=JPdvq97EzA0bR4Uq18bBrAsuVOqmNoOFk8SJK3sPAw5Nl/JXbTI6P9J4GFktEXu2OsLVLK Zyf/3ws5cfQoVvu7wAvsvmfhTNeew1tZUhTa0JB28NT0zkW53Z4aBOlgSs25pEJ19mee5r Ne5PmkGfa7ngZpeZOiOePJYDA0LQ/HE= X-MC-Unique: QIcmUqs4PX-zrDUeLndWtw-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Peter Xu Subject: [PATCH v2 33/51] migration: Add postcopy_preempt_active() Date: Mon, 5 Dec 2022 10:52:10 +0100 Message-Id: <20221205095228.1314-34-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670234994573100003 Content-Type: text/plain; charset="utf-8" From: Peter Xu Add the helper to show that postcopy preempt enabled, meanwhile active. Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Peter Xu Reviewed-by: Juan Quintela Signed-off-by: Juan Quintela --- migration/ram.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index cc72c24c18..00a2e30322 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -162,6 +162,11 @@ out: return ret; } =20 +static bool postcopy_preempt_active(void) +{ + return migrate_postcopy_preempt() && migration_in_postcopy(); +} + bool ramblock_is_ignored(RAMBlock *block) { return !qemu_ram_is_migratable(block) || @@ -2433,7 +2438,7 @@ static void postcopy_preempt_choose_channel(RAMState = *rs, PageSearchStatus *pss) /* We need to make sure rs->f always points to the default channel elsewhe= re */ static void postcopy_preempt_reset_channel(RAMState *rs) { - if (migrate_postcopy_preempt() && migration_in_postcopy()) { + if (postcopy_preempt_active()) { rs->postcopy_channel =3D RAM_CHANNEL_PRECOPY; rs->f =3D migrate_get_current()->to_dst_file; trace_postcopy_preempt_reset_channel(); @@ -2471,7 +2476,7 @@ static int ram_save_host_page(RAMState *rs, PageSearc= hStatus *pss) return 0; } =20 - if (migrate_postcopy_preempt() && migration_in_postcopy()) { + if (postcopy_preempt_active()) { postcopy_preempt_choose_channel(rs, pss); } =20 --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670235138; cv=none; d=zohomail.com; s=zohoarc; b=OAAwWWzrkAuoyh8CANHMjilZ+4v466fQRUtbB/rLSmX91pOLE6brV4RtJSp38bW+81hDvfJsW13fO802JLkPjSdfpfR6VOfcIoKHyBw41K4QiZKHTgQgu4ZsafikmyfzzmBVlbAvBDwgqWyPrMdsvd8BHhzx2aU8lVxwNBeoUoY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670235138; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=8T5xObxYus8mUaDCig1/nmq01TyjcG4leYqxs3OOcvM=; b=JjIpBWQTG/S0W9CyY3/iXC8fHNa16vk5nV6QPBqCCXUjSSLiVXYVbKVbNE8PWJUwQw1uxwwttF7ru3w2w//Hy8IK/joVz4N3ucUN+ojSerHMDz3N6cQrCcWRfFgwf/SD/hlrUlJHIY8Ld82/7rysNo74OHgu1i7XE8RS18c+sYs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670235138269175.35477310057536; Mon, 5 Dec 2022 02:12:18 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Dx-0004uF-Uv; Mon, 05 Dec 2022 04:57:23 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Ds-0004sJ-52 for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:57:16 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Dp-0007t0-65 for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:57:14 -0500 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-470-6RQIp25AOr-MD9trX-mdGQ-1; Mon, 05 Dec 2022 04:57:07 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 71DE43814946; Mon, 5 Dec 2022 09:57:06 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id E28662166B29; Mon, 5 Dec 2022 09:56:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234232; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8T5xObxYus8mUaDCig1/nmq01TyjcG4leYqxs3OOcvM=; b=QvO+cxUdfUfmLst5TxTEOaq252d6kZH+9vwSPMXFJ4MqrK+l4GRf/+/fZDnqkQmKOTPwNp hzc9UzqN6ptqkCo7whkmDhgZx0UTxAc1WqUAEmut6kYVZgNYvg2pRCy2z1kTeR51KNYM/c r08SqQXd8hzZaPe7mgyGurfLbAoxgxU= X-MC-Unique: 6RQIp25AOr-MD9trX-mdGQ-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Peter Xu Subject: [PATCH v2 34/51] migration: Cleanup xbzrle zero page cache update logic Date: Mon, 5 Dec 2022 10:52:11 +0100 Message-Id: <20221205095228.1314-35-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670235138555100001 Content-Type: text/plain; charset="utf-8" From: Peter Xu The major change is to replace "!save_page_use_compression()" with "xbzrle_enabled" to make it clear. Reasonings: (1) When compression enabled, "!save_page_use_compression()" is exactly the same as checking "xbzrle_enabled". (2) When compression disabled, "!save_page_use_compression()" always return true. We used to try calling the xbzrle code, but after this change we won't, and we shouldn't need to. Since at it, drop the xbzrle_enabled check in xbzrle_cache_zero_page() because with this change it's not needed anymore. Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Peter Xu Reviewed-by: Juan Quintela Signed-off-by: Juan Quintela --- migration/ram.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index 00a2e30322..7124ff531c 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -741,10 +741,6 @@ void mig_throttle_counter_reset(void) */ static void xbzrle_cache_zero_page(RAMState *rs, ram_addr_t current_addr) { - if (!rs->xbzrle_enabled) { - return; - } - /* We don't care if this fails to allocate a new cache page * as long as it updated an old one */ cache_insert(XBZRLE.cache, current_addr, XBZRLE.zero_target_page, @@ -2301,7 +2297,7 @@ static int ram_save_target_page(RAMState *rs, PageSea= rchStatus *pss) /* Must let xbzrle know, otherwise a previous (now 0'd) cached * page would be stale */ - if (!save_page_use_compression(rs)) { + if (rs->xbzrle_enabled) { XBZRLE_cache_lock(); xbzrle_cache_zero_page(rs, block->offset + offset); XBZRLE_cache_unlock(); --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670235888; cv=none; d=zohomail.com; s=zohoarc; b=knBQP8Ec3Emh9BVZaOQ0YwTGnDPAV2zSjp8gGSBfvNyWu25Zd5L2ZP7FlVnFy/sLCiS6246cB523V6FtIaoKtY8gDN1h2zDBtTzMBUudA85dygXH2uUQTbL0Nfg/MhIL9CmkwoBOCcF3T137du5XvMBbyvQIP6fGs0jnVme/HYc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670235888; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=H71cToLy64HTbBPdrL5diYAVzVjBcZDaRr6Ge6ZYDPU=; b=gLxDpdJFMIT2u3Dgu38/8R170s9BGxyvS6jAe3iMpnrkNsV+wOgGoyC4L02222mZ6RH2HouCFoZ0XoLh74TdqZ3ymW0HgCNyPwUHDm15p0gy8B+9GlJAEz8s7XvS4LnrKqJH3VNziqawntrdt99AbDXgZb8pswZ3LwQq7UjUKmE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670235888966685.3744361074176; Mon, 5 Dec 2022 02:24:48 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28ET-0005B1-GW; Mon, 05 Dec 2022 04:57:53 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28E9-0004xV-NX for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:57:35 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28E3-0007uf-3K for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:57:31 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-657-d2NlJdFvOkaYSLTVrpInFQ-1; Mon, 05 Dec 2022 04:57:15 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 4037587B2A7; Mon, 5 Dec 2022 09:57:14 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id C7D6C2166B29; Mon, 5 Dec 2022 09:57:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234245; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=H71cToLy64HTbBPdrL5diYAVzVjBcZDaRr6Ge6ZYDPU=; b=gdX+hUglomZDGUXjftWVPon70AN/rPmlQihzoJHf7jKAk+7jVAlbAhArRGIRlwgf2BtBBX XPx7Ojt7+vQVD48JlWpUPBuGd6KAcn5EIAAlucywwHt7+lfRw2zkv+pjRdkwYLldI2rwFf mWaq/0Pd5FP4A7ti2g2LElDNf/wDtIk= X-MC-Unique: d2NlJdFvOkaYSLTVrpInFQ-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Peter Xu Subject: [PATCH v2 35/51] migration: Trivial cleanup save_page_header() on same block check Date: Mon, 5 Dec 2022 10:52:12 +0100 Message-Id: <20221205095228.1314-36-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, T_SPF_TEMPERROR=0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670235890253100003 Content-Type: text/plain; charset="utf-8" From: Peter Xu The 2nd check on RAM_SAVE_FLAG_CONTINUE is a bit redundant. Use a boolean to be clearer. Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Peter Xu Reviewed-by: Juan Quintela Signed-off-by: Juan Quintela --- migration/ram.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index 7124ff531c..41475431fc 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -661,14 +661,15 @@ static size_t save_page_header(RAMState *rs, QEMUFile= *f, RAMBlock *block, ram_addr_t offset) { size_t size, len; + bool same_block =3D (block =3D=3D rs->last_sent_block); =20 - if (block =3D=3D rs->last_sent_block) { + if (same_block) { offset |=3D RAM_SAVE_FLAG_CONTINUE; } qemu_put_be64(f, offset); size =3D 8; =20 - if (!(offset & RAM_SAVE_FLAG_CONTINUE)) { + if (!same_block) { len =3D strlen(block->idstr); qemu_put_byte(f, len); qemu_put_buffer(f, (uint8_t *)block->idstr, len); --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670235044; cv=none; d=zohomail.com; s=zohoarc; b=c3VKaDhUqwDtFT/tOzrZdpVi3dVUNXQ1bjzwKX12Bw1Rur3g17KBKlajvBYLSuctF6laqut03y2R2OkITxHD1hjkj1DfDz9I+AcaQtejILy2WiBeqEnXX2ijeFKQzP0Ot+ePbgc1JZT/JmMRzpVV6Nzt9cH79+qv80YJ5GqPCoA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670235044; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=MyOOzG/IByBPCSi/RuF6EO6mdBGoKRDsMNpVGRjYHyo=; b=GK4kaEDS84WG8ZYtAjp4BbXfaUJhccWrjcq0cdwRHFxgUcJVtTBHLdsCfKriwbZlVVnxA74KtNIZhM/ETOMgJhi5OL7GYkmDf2hDIIUTsUAFB9F9f1Aw95Qn5Wvf7l1RTgoSMd0Lkd38WMClDlBXPp8KpCry1mTMljHQqSK9M9s= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670235044499577.1497919794746; Mon, 5 Dec 2022 02:10:44 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28ES-00058s-4J; Mon, 05 Dec 2022 04:57:52 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28E9-0004xU-W3 for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:57:35 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28E4-0007v0-DV for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:57:33 -0500 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-454-mDjzPx4ePvSGdoy5QNK39A-1; Mon, 05 Dec 2022 04:57:23 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 11A17299E755; Mon, 5 Dec 2022 09:57:22 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8E45D2166B29; Mon, 5 Dec 2022 09:57:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234246; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=MyOOzG/IByBPCSi/RuF6EO6mdBGoKRDsMNpVGRjYHyo=; b=Cs+p304/d5+FpMKoVf3NuSFCwrAu3YS9HwhuQCvmQGPE4DvEkWOQFf3/C10TSvlQWUizym TzTiY36kAHTVzmEhd3cWvcdvDy/3DPZ8vjDj4xA4IgwS990eF6PFJIwF/21nMf2vIkh8M5 S7q2VsFtKaSWRYCOQiwqJbvYjiAICjM= X-MC-Unique: mDjzPx4ePvSGdoy5QNK39A-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Peter Xu Subject: [PATCH v2 36/51] migration: Remove RAMState.f references in compression code Date: Mon, 5 Dec 2022 10:52:13 +0100 Message-Id: <20221205095228.1314-37-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670235044856100001 Content-Type: text/plain; charset="utf-8" From: Peter Xu Removing referencing to RAMState.f in compress_page_with_multi_thread() and flush_compressed_data(). Compression code by default isn't compatible with having >1 channels (or it won't currently know which channel to flush the compressed data), so to make it simple we always flush on the default to_dst_file port until someone wants to add >1 ports support, as rs->f right now can really change (after postcopy preempt is introduced). There should be no functional change at all after patch applied, since as long as rs->f referenced in compression code, it must be to_dst_file. Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Peter Xu Signed-off-by: Juan Quintela --- migration/ram.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index 41475431fc..6e3dc845c5 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -1461,6 +1461,7 @@ static bool save_page_use_compression(RAMState *rs); =20 static void flush_compressed_data(RAMState *rs) { + MigrationState *ms =3D migrate_get_current(); int idx, len, thread_count; =20 if (!save_page_use_compression(rs)) { @@ -1479,7 +1480,7 @@ static void flush_compressed_data(RAMState *rs) for (idx =3D 0; idx < thread_count; idx++) { qemu_mutex_lock(&comp_param[idx].mutex); if (!comp_param[idx].quit) { - len =3D qemu_put_qemu_file(rs->f, comp_param[idx].file); + len =3D qemu_put_qemu_file(ms->to_dst_file, comp_param[idx].fi= le); /* * it's safe to fetch zero_page without holding comp_done_lock * as there is no further request submitted to the thread, @@ -1498,11 +1499,11 @@ static inline void set_compress_params(CompressPara= m *param, RAMBlock *block, param->offset =3D offset; } =20 -static int compress_page_with_multi_thread(RAMState *rs, RAMBlock *block, - ram_addr_t offset) +static int compress_page_with_multi_thread(RAMBlock *block, ram_addr_t off= set) { int idx, thread_count, bytes_xmit =3D -1, pages =3D -1; bool wait =3D migrate_compress_wait_thread(); + MigrationState *ms =3D migrate_get_current(); =20 thread_count =3D migrate_compress_threads(); qemu_mutex_lock(&comp_done_lock); @@ -1510,7 +1511,8 @@ retry: for (idx =3D 0; idx < thread_count; idx++) { if (comp_param[idx].done) { comp_param[idx].done =3D false; - bytes_xmit =3D qemu_put_qemu_file(rs->f, comp_param[idx].file); + bytes_xmit =3D qemu_put_qemu_file(ms->to_dst_file, + comp_param[idx].file); qemu_mutex_lock(&comp_param[idx].mutex); set_compress_params(&comp_param[idx], block, offset); qemu_cond_signal(&comp_param[idx].cond); @@ -2263,7 +2265,7 @@ static bool save_compress_page(RAMState *rs, RAMBlock= *block, ram_addr_t offset) return false; } =20 - if (compress_page_with_multi_thread(rs, block, offset) > 0) { + if (compress_page_with_multi_thread(block, offset) > 0) { return true; } =20 --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670234689; cv=none; d=zohomail.com; s=zohoarc; b=BmK+b4RrCg+VXeG6xn+RfWimDDutdy1LqCLrYApWYOYCwczTywKm1jGPu2z/LFBuZSsEJdKr8FMITGwhCtYGrY9NYO8rqecDx9Qv53VgpX3aOUM8FMs/tSVE9I3m0krkE5nFrcY1v2IOnn9P8i60Bg2KR+ky4ocyWfTABOUYom8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670234689; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=30+Kq9dPR7peGz5envehc+sa5UbYD15LI+w9Psis5To=; b=Cx0krpTGEaLohKy0gXPad7p2kIJrn7c79l46afiM+a+HsyR1w8s0XvPmXErE6cmTgXJw/OcYFN3dfgfl1xE1MoXg10rthhCsa+0/kYhzGAR53qbNZSbAhI0jPF75yIxsWnoJthcV6lIW2tw/Sv+nhrvM2m/+WJ7ouNH6kFoPJmk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670234689621398.8572019717824; Mon, 5 Dec 2022 02:04:49 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28ES-00059P-Fc; Mon, 05 Dec 2022 04:57:52 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28EH-00051h-D8 for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:57:43 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28EE-0007wn-GL for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:57:40 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-510-31Nfrau3OC2NYJZxgScheA-1; Mon, 05 Dec 2022 04:57:31 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id EBF4A87B2A1; Mon, 5 Dec 2022 09:57:29 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6700A2166B29; Mon, 5 Dec 2022 09:57:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234256; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=30+Kq9dPR7peGz5envehc+sa5UbYD15LI+w9Psis5To=; b=YX/4/NL1H166JhAOhrTvC62e1FuNY3SDJAcJ9A74Gunq1qRwaLTlQp3W+dEDctpAouENjJ HLENIRFVeBcXG/JvFyO5OT3PgZFTCXx5WzJjHpK5j8Tf7wlm5Nmz8A4BXo25AS1gHNVXV/ wm4ABlCihV8kvsjzy62lDOVu4QwKVxo= X-MC-Unique: 31Nfrau3OC2NYJZxgScheA-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Peter Xu Subject: [PATCH v2 37/51] migration: Yield bitmap_mutex properly when sending/sleeping Date: Mon, 5 Dec 2022 10:52:14 +0100 Message-Id: <20221205095228.1314-38-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670234690677100005 Content-Type: text/plain; charset="utf-8" From: Peter Xu Don't take the bitmap mutex when sending pages, or when being throttled by migration_rate_limit() (which is a bit tricky to call it here in ram code, but seems still helpful). It prepares for the possibility of concurrently sending pages in >1 threads using the function ram_save_host_page() because all threads may need the bitmap_mutex to operate on bitmaps, so that either sendmsg() or any kind of qemu_sem_wait() blocking for one thread will not block the other from progressing. Signed-off-by: Peter Xu Reviewed-by: Juan Quintela Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Juan Quintela --- migration/ram.c | 46 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index 6e3dc845c5..5379164749 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -2452,9 +2452,14 @@ static void postcopy_preempt_reset_channel(RAMState = *rs) * a host page in which case the remainder of the hostpage is sent. * Only dirty target pages are sent. Note that the host page size may * be a huge page for this block. + * * The saving stops at the boundary of the used_length of the block * if the RAMBlock isn't a multiple of the host page size. * + * The caller must be with ram_state.bitmap_mutex held to call this + * function. Note that this function can temporarily release the lock, but + * when the function is returned it'll make sure the lock is still held. + * * Returns the number of pages written or negative on error * * @rs: current RAM state @@ -2462,6 +2467,7 @@ static void postcopy_preempt_reset_channel(RAMState *= rs) */ static int ram_save_host_page(RAMState *rs, PageSearchStatus *pss) { + bool page_dirty, preempt_active =3D postcopy_preempt_active(); int tmppages, pages =3D 0; size_t pagesize_bits =3D qemu_ram_pagesize(pss->block) >> TARGET_PAGE_BITS; @@ -2485,22 +2491,40 @@ static int ram_save_host_page(RAMState *rs, PageSea= rchStatus *pss) break; } =20 + page_dirty =3D migration_bitmap_clear_dirty(rs, pss->block, pss->p= age); + /* Check the pages is dirty and if it is send it */ - if (migration_bitmap_clear_dirty(rs, pss->block, pss->page)) { + if (page_dirty) { + /* + * Properly yield the lock only in postcopy preempt mode + * because both migration thread and rp-return thread can + * operate on the bitmaps. + */ + if (preempt_active) { + qemu_mutex_unlock(&rs->bitmap_mutex); + } tmppages =3D ram_save_target_page(rs, pss); - if (tmppages < 0) { - return tmppages; + if (tmppages >=3D 0) { + pages +=3D tmppages; + /* + * Allow rate limiting to happen in the middle of huge pag= es if + * something is sent in the current iteration. + */ + if (pagesize_bits > 1 && tmppages > 0) { + migration_rate_limit(); + } } - - pages +=3D tmppages; - /* - * Allow rate limiting to happen in the middle of huge pages if - * something is sent in the current iteration. - */ - if (pagesize_bits > 1 && tmppages > 0) { - migration_rate_limit(); + if (preempt_active) { + qemu_mutex_lock(&rs->bitmap_mutex); } + } else { + tmppages =3D 0; + } + + if (tmppages < 0) { + return tmppages; } + pss->page =3D migration_bitmap_find_dirty(rs, pss->block, pss->pag= e); } while ((pss->page < hostpage_boundary) && offset_in_ramblock(pss->block, --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670235111; cv=none; d=zohomail.com; s=zohoarc; b=mECeiQ+Im7Vh/GSWMiK1+3inN8NrKuvceKirKWga93WdKGElMXCBAa8BkLp0xz3cYTn3ouEEyf5XMJhOZ+aiqnUQcp8gCdNBS4SYVPS/k1DYHT+vimLwgYLtOW7fmAmiJh+LWdqCMJuPyE2fuMkLlSYINLon9VeKW6UneG9wOYk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670235111; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=KjyAtJBI1Le1Avp7uOYNzGtZI6T2gunZpw5nO71qFnU=; b=NSFzZWf3WlyBnq+PwOa7DTCgcTJL4msgAUNqGvb/d0NR155sHK5RXHEsudkm5B5u8O53jspwdb5Fll3ScdJzocJ0RsHnYDpswth1DV7QKOPyf12ULjjkPTzcifhxDswJr/R1eLBl/T1CljebWtMPaZ9a66L5TXgbyaa+MVH+5AM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 167023511175529.243558544845087; Mon, 5 Dec 2022 02:11:51 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28EW-0005I1-Nh; Mon, 05 Dec 2022 04:57:56 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28EJ-00052L-Ch for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:57:45 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28EH-0007xL-27 for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:57:42 -0500 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-116-GfQNBbYVODK2www2Qg2zKg-1; Mon, 05 Dec 2022 04:57:38 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id BBE1E1C0897A; Mon, 5 Dec 2022 09:57:37 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4D8272166B29; Mon, 5 Dec 2022 09:57:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234260; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=KjyAtJBI1Le1Avp7uOYNzGtZI6T2gunZpw5nO71qFnU=; b=UfhhcuArgUwoSOgdDFgYSHPXGEaJNABi2JiNXqiSWRgV18FF38EGKCMDd50X1q3SLLG+XC N0LP6lkvmu53G8Mg0kcwdbjho0+72e9MjnPk1HaYUapFpBe8ARzEcA1k8ftF9s7tEUezlU +692VlP9KB+3Trs/WhI6X0Auu8s8Bg8= X-MC-Unique: GfQNBbYVODK2www2Qg2zKg-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Peter Xu Subject: [PATCH v2 38/51] migration: Use atomic ops properly for page accountings Date: Mon, 5 Dec 2022 10:52:15 +0100 Message-Id: <20221205095228.1314-39-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670235112822100004 Content-Type: text/plain; charset="utf-8" From: Peter Xu To prepare for thread-safety on page accountings, at least below counters need to be accessed only atomically, they are: ram_counters.transferred ram_counters.duplicate ram_counters.normal ram_counters.postcopy_bytes There are a lot of other counters but they won't be accessed outside migration thread, then they're still safe to be accessed without atomic ops. Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Peter Xu Reviewed-by: Juan Quintela Signed-off-by: Juan Quintela --- migration/ram.h | 20 ++++++++++++++++++++ migration/migration.c | 10 +++++----- migration/multifd.c | 4 ++-- migration/ram.c | 40 ++++++++++++++++++++++++---------------- 4 files changed, 51 insertions(+), 23 deletions(-) diff --git a/migration/ram.h b/migration/ram.h index 038d52f49f..81cbb0947c 100644 --- a/migration/ram.h +++ b/migration/ram.h @@ -32,7 +32,27 @@ #include "qapi/qapi-types-migration.h" #include "exec/cpu-common.h" #include "io/channel.h" +#include "qemu/stats64.h" =20 +/* + * These are the migration statistic counters that need to be updated using + * atomic ops (can be accessed by more than one thread). Here since we + * cannot modify MigrationStats directly to use Stat64 as it was defined in + * the QAPI scheme, we define an internal structure to hold them, and we + * propagate the real values when QMP queries happen. + * + * IOW, the corresponding fields within ram_counters on these specific + * fields will be always zero and not being used at all; they're just + * placeholders to make it QAPI-compatible. + */ +typedef struct { + Stat64 transferred; + Stat64 duplicate; + Stat64 normal; + Stat64 postcopy_bytes; +} MigrationAtomicStats; + +extern MigrationAtomicStats ram_atomic_counters; extern MigrationStats ram_counters; extern XBZRLECacheStats xbzrle_counters; extern CompressionStats compression_counters; diff --git a/migration/migration.c b/migration/migration.c index f485eea5fb..de83c50f51 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -1049,13 +1049,13 @@ static void populate_ram_info(MigrationInfo *info, = MigrationState *s) =20 info->has_ram =3D true; info->ram =3D g_malloc0(sizeof(*info->ram)); - info->ram->transferred =3D ram_counters.transferred; + info->ram->transferred =3D stat64_get(&ram_atomic_counters.transferred= ); info->ram->total =3D ram_bytes_total(); - info->ram->duplicate =3D ram_counters.duplicate; + info->ram->duplicate =3D stat64_get(&ram_atomic_counters.duplicate); /* legacy value. It is not used anymore */ info->ram->skipped =3D 0; - info->ram->normal =3D ram_counters.normal; - info->ram->normal_bytes =3D ram_counters.normal * page_size; + info->ram->normal =3D stat64_get(&ram_atomic_counters.normal); + info->ram->normal_bytes =3D info->ram->normal * page_size; info->ram->mbps =3D s->mbps; info->ram->dirty_sync_count =3D ram_counters.dirty_sync_count; info->ram->dirty_sync_missed_zero_copy =3D @@ -1066,7 +1066,7 @@ static void populate_ram_info(MigrationInfo *info, Mi= grationState *s) info->ram->pages_per_second =3D s->pages_per_second; info->ram->precopy_bytes =3D ram_counters.precopy_bytes; info->ram->downtime_bytes =3D ram_counters.downtime_bytes; - info->ram->postcopy_bytes =3D ram_counters.postcopy_bytes; + info->ram->postcopy_bytes =3D stat64_get(&ram_atomic_counters.postcopy= _bytes); =20 if (migrate_use_xbzrle()) { info->has_xbzrle_cache =3D true; diff --git a/migration/multifd.c b/migration/multifd.c index b8dc559d24..000ca4d4ec 100644 --- a/migration/multifd.c +++ b/migration/multifd.c @@ -432,7 +432,7 @@ static int multifd_send_pages(QEMUFile *f) transferred =3D ((uint64_t) pages->num) * p->page_size + p->packet_len; qemu_file_acct_rate_limit(f, transferred); ram_counters.multifd_bytes +=3D transferred; - ram_counters.transferred +=3D transferred; + stat64_add(&ram_atomic_counters.transferred, transferred); qemu_mutex_unlock(&p->mutex); qemu_sem_post(&p->sem); =20 @@ -624,7 +624,7 @@ int multifd_send_sync_main(QEMUFile *f) p->pending_job++; qemu_file_acct_rate_limit(f, p->packet_len); ram_counters.multifd_bytes +=3D p->packet_len; - ram_counters.transferred +=3D p->packet_len; + stat64_add(&ram_atomic_counters.transferred, p->packet_len); qemu_mutex_unlock(&p->mutex); qemu_sem_post(&p->sem); =20 diff --git a/migration/ram.c b/migration/ram.c index 5379164749..f4cd9038f4 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -425,18 +425,25 @@ uint64_t ram_bytes_remaining(void) 0; } =20 +/* + * NOTE: not all stats in ram_counters are used in reality. See comments + * for struct MigrationAtomicStats. The ultimate result of ram migration + * counters will be a merged version with both ram_counters and the atomic + * fields in ram_atomic_counters. + */ MigrationStats ram_counters; +MigrationAtomicStats ram_atomic_counters; =20 void ram_transferred_add(uint64_t bytes) { if (runstate_is_running()) { ram_counters.precopy_bytes +=3D bytes; } else if (migration_in_postcopy()) { - ram_counters.postcopy_bytes +=3D bytes; + stat64_add(&ram_atomic_counters.postcopy_bytes, bytes); } else { ram_counters.downtime_bytes +=3D bytes; } - ram_counters.transferred +=3D bytes; + stat64_add(&ram_atomic_counters.transferred, bytes); } =20 void dirty_sync_missed_zero_copy(void) @@ -725,7 +732,7 @@ void mig_throttle_counter_reset(void) =20 rs->time_last_bitmap_sync =3D qemu_clock_get_ms(QEMU_CLOCK_REALTIME); rs->num_dirty_pages_period =3D 0; - rs->bytes_xfer_prev =3D ram_counters.transferred; + rs->bytes_xfer_prev =3D stat64_get(&ram_atomic_counters.transferred); } =20 /** @@ -1085,8 +1092,9 @@ uint64_t ram_pagesize_summary(void) =20 uint64_t ram_get_total_transferred_pages(void) { - return ram_counters.normal + ram_counters.duplicate + - compression_counters.pages + xbzrle_counters.pages; + return stat64_get(&ram_atomic_counters.normal) + + stat64_get(&ram_atomic_counters.duplicate) + + compression_counters.pages + xbzrle_counters.pages; } =20 static void migration_update_rates(RAMState *rs, int64_t end_time) @@ -1145,8 +1153,8 @@ static void migration_trigger_throttle(RAMState *rs) { MigrationState *s =3D migrate_get_current(); uint64_t threshold =3D s->parameters.throttle_trigger_threshold; - - uint64_t bytes_xfer_period =3D ram_counters.transferred - rs->bytes_xf= er_prev; + uint64_t bytes_xfer_period =3D + stat64_get(&ram_atomic_counters.transferred) - rs->bytes_xfer_prev; uint64_t bytes_dirty_period =3D rs->num_dirty_pages_period * TARGET_PA= GE_SIZE; uint64_t bytes_dirty_threshold =3D bytes_xfer_period * threshold / 100; =20 @@ -1209,7 +1217,7 @@ static void migration_bitmap_sync(RAMState *rs) /* reset period counters */ rs->time_last_bitmap_sync =3D end_time; rs->num_dirty_pages_period =3D 0; - rs->bytes_xfer_prev =3D ram_counters.transferred; + rs->bytes_xfer_prev =3D stat64_get(&ram_atomic_counters.transferre= d); } if (migrate_use_events()) { qapi_event_send_migration_pass(ram_counters.dirty_sync_count); @@ -1285,7 +1293,7 @@ static int save_zero_page(RAMState *rs, RAMBlock *blo= ck, ram_addr_t offset) int len =3D save_zero_page_to_file(rs, rs->f, block, offset); =20 if (len) { - ram_counters.duplicate++; + stat64_add(&ram_atomic_counters.duplicate, 1); ram_transferred_add(len); return 1; } @@ -1322,9 +1330,9 @@ static bool control_save_page(RAMState *rs, RAMBlock = *block, ram_addr_t offset, } =20 if (bytes_xmit > 0) { - ram_counters.normal++; + stat64_add(&ram_atomic_counters.normal, 1); } else if (bytes_xmit =3D=3D 0) { - ram_counters.duplicate++; + stat64_add(&ram_atomic_counters.duplicate, 1); } =20 return true; @@ -1354,7 +1362,7 @@ static int save_normal_page(RAMState *rs, RAMBlock *b= lock, ram_addr_t offset, qemu_put_buffer(rs->f, buf, TARGET_PAGE_SIZE); } ram_transferred_add(TARGET_PAGE_SIZE); - ram_counters.normal++; + stat64_add(&ram_atomic_counters.normal, 1); return 1; } =20 @@ -1410,7 +1418,7 @@ static int ram_save_multifd_page(RAMState *rs, RAMBlo= ck *block, if (multifd_queue_page(rs->f, block, offset) < 0) { return -1; } - ram_counters.normal++; + stat64_add(&ram_atomic_counters.normal, 1); =20 return 1; } @@ -1448,7 +1456,7 @@ update_compress_thread_counts(const CompressParam *pa= ram, int bytes_xmit) ram_transferred_add(bytes_xmit); =20 if (param->zero_page) { - ram_counters.duplicate++; + stat64_add(&ram_atomic_counters.duplicate, 1); return; } =20 @@ -2623,9 +2631,9 @@ void acct_update_position(QEMUFile *f, size_t size, b= ool zero) uint64_t pages =3D size / TARGET_PAGE_SIZE; =20 if (zero) { - ram_counters.duplicate +=3D pages; + stat64_add(&ram_atomic_counters.duplicate, pages); } else { - ram_counters.normal +=3D pages; + stat64_add(&ram_atomic_counters.normal, pages); ram_transferred_add(size); qemu_file_credit_transfer(f, size); } --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670235161; cv=none; d=zohomail.com; s=zohoarc; b=ToqC86VzXx9N7357IN2PhzbNk9ppfjZtobsYiiKUkEHzNPzgvap9LjIWw3SX/Hv+oN9tHVnSJftV+k+2/BZl1H5D3r3g+UWl3cBB9bWEywyi6vghEQZMxWCRY3YQN2+jcqwFDEuP8E6ZNyLtLD1PhZ1qfSH7AYUFAh4ZnVMBrJ0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670235161; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=xvso+uqexrJS++o89EhHm9GXqK2SAyeGs3yfsu8kVfg=; b=W7lDKRSy3J0tLesDWw9dMEkSx7fw2ZeGiUs+d3Ajgp+/xu5cb0v5M9R3ieuKG6U75QOP6C15jO0jg5SF0akMRdlhh30i4pdOzbtLr7pLgCYPoRd/PsuS/uWbhKMzBfnHCBinQi59pxWBJ6Lmt65HS8AKyciSeUDgDsCsPEHUuNs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 167023516104869.41852526729315; Mon, 5 Dec 2022 02:12:41 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28EW-0005IQ-Uv; Mon, 05 Dec 2022 04:57:56 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28EU-0005EI-JT for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:57:54 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28ES-0007zV-Ma for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:57:54 -0500 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-500-g4fTxyjnMqmHLqFoaQ5NXA-1; Mon, 05 Dec 2022 04:57:46 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 86E373C10EC7; Mon, 5 Dec 2022 09:57:45 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1DBD82166B29; Mon, 5 Dec 2022 09:57:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234272; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=xvso+uqexrJS++o89EhHm9GXqK2SAyeGs3yfsu8kVfg=; b=EkQMnEPMERbIWZDlwlyylQOZ4LHYerJq9+RNpDzdBbgxzdKjiEf2vWBTIp03Rdg7Hu6uBa QimVNo9DlX8vfZ62r1x7byWFi+FlFDVT/AJHDjJK1tcfzQRH3sTWfloloaMkZMccc5tjq4 kyRraXA8louD+uABf5WEN5t+VUF7kms= X-MC-Unique: g4fTxyjnMqmHLqFoaQ5NXA-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Peter Xu Subject: [PATCH v2 39/51] migration: Teach PSS about host page Date: Mon, 5 Dec 2022 10:52:16 +0100 Message-Id: <20221205095228.1314-40-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670235162670100006 Content-Type: text/plain; charset="utf-8" From: Peter Xu Migration code has a lot to do with host pages. Teaching PSS core about the idea of host page helps a lot and makes the code clean. Meanwhile, this prepares for the future changes that can leverage the new PSS helpers that this patch introduces to send host page in another thread. Three more fields are introduced for this: (1) host_page_sending: this is set to true when QEMU is sending a host page, false otherwise. (2) host_page_{start|end}: these point to the start/end of host page we're sending, and it's only valid when host_page_sending=3D=3Dtrue. For example, when we look up the next dirty page on the ramblock, with host_page_sending=3D=3Dtrue, we'll not try to look for anything beyond the current host page boundary. This can be slightly efficient than current code because currently we'll set pss->page to next dirty bit (which can be over current host page boundary) and reset it to host page boundary if we found it goes beyond that. With above, we can easily make migration_bitmap_find_dirty() self contained by updating pss->page properly. rs* parameter is removed because it's not even used in old code. When sending a host page, we should use the pss helpers like this: - pss_host_page_prepare(pss): called before sending host page - pss_within_range(pss): whether we're still working on the cur host page? - pss_host_page_finish(pss): called after sending a host page Then we can use ram_save_target_page() to save one small page. Currently ram_save_host_page() is still the only user. If there'll be another function to send host page (e.g. in return path thread) in the future, it should follow the same style. Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Peter Xu Reviewed-by: Juan Quintela Signed-off-by: Juan Quintela --- migration/ram.c | 95 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 76 insertions(+), 19 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index f4cd9038f4..4d7b50ef79 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -481,6 +481,11 @@ struct PageSearchStatus { * postcopy pages via postcopy preempt channel. */ bool postcopy_target_channel; + /* Whether we're sending a host page */ + bool host_page_sending; + /* The start/end of current host page. Only valid if host_page_sendin= g=3D=3Dtrue */ + unsigned long host_page_start; + unsigned long host_page_end; }; typedef struct PageSearchStatus PageSearchStatus; =20 @@ -858,26 +863,38 @@ static int save_xbzrle_page(RAMState *rs, uint8_t **c= urrent_data, } =20 /** - * migration_bitmap_find_dirty: find the next dirty page from start + * pss_find_next_dirty: find the next dirty page of current ramblock * - * Returns the page offset within memory region of the start of a dirty pa= ge + * This function updates pss->page to point to the next dirty page index + * within the ramblock to migrate, or the end of ramblock when nothing + * found. Note that when pss->host_page_sending=3D=3Dtrue it means we're + * during sending a host page, so we won't look for dirty page that is + * outside the host page boundary. * - * @rs: current RAM state - * @rb: RAMBlock where to search for dirty pages - * @start: page where we start the search + * @pss: the current page search status */ -static inline -unsigned long migration_bitmap_find_dirty(RAMState *rs, RAMBlock *rb, - unsigned long start) +static void pss_find_next_dirty(PageSearchStatus *pss) { + RAMBlock *rb =3D pss->block; unsigned long size =3D rb->used_length >> TARGET_PAGE_BITS; unsigned long *bitmap =3D rb->bmap; =20 if (ramblock_is_ignored(rb)) { - return size; + /* Points directly to the end, so we know no dirty page */ + pss->page =3D size; + return; } =20 - return find_next_bit(bitmap, size, start); + /* + * If during sending a host page, only look for dirty pages within the + * current host page being send. + */ + if (pss->host_page_sending) { + assert(pss->host_page_end); + size =3D MIN(size, pss->host_page_end); + } + + pss->page =3D find_next_bit(bitmap, size, pss->page); } =20 static void migration_clear_memory_region_dirty_bitmap(RAMBlock *rb, @@ -1563,7 +1580,9 @@ static bool find_dirty_block(RAMState *rs, PageSearch= Status *pss, bool *again) pss->postcopy_requested =3D false; pss->postcopy_target_channel =3D RAM_CHANNEL_PRECOPY; =20 - pss->page =3D migration_bitmap_find_dirty(rs, pss->block, pss->page); + /* Update pss->page for the next dirty bit in ramblock */ + pss_find_next_dirty(pss); + if (pss->complete_round && pss->block =3D=3D rs->last_seen_block && pss->page >=3D rs->last_page) { /* @@ -2452,6 +2471,44 @@ static void postcopy_preempt_reset_channel(RAMState = *rs) } } =20 +/* Should be called before sending a host page */ +static void pss_host_page_prepare(PageSearchStatus *pss) +{ + /* How many guest pages are there in one host page? */ + size_t guest_pfns =3D qemu_ram_pagesize(pss->block) >> TARGET_PAGE_BIT= S; + + pss->host_page_sending =3D true; + pss->host_page_start =3D ROUND_DOWN(pss->page, guest_pfns); + pss->host_page_end =3D ROUND_UP(pss->page + 1, guest_pfns); +} + +/* + * Whether the page pointed by PSS is within the host page being sent. + * Must be called after a previous pss_host_page_prepare(). + */ +static bool pss_within_range(PageSearchStatus *pss) +{ + ram_addr_t ram_addr; + + assert(pss->host_page_sending); + + /* Over host-page boundary? */ + if (pss->page >=3D pss->host_page_end) { + return false; + } + + ram_addr =3D ((ram_addr_t)pss->page) << TARGET_PAGE_BITS; + + return offset_in_ramblock(pss->block, ram_addr); +} + +static void pss_host_page_finish(PageSearchStatus *pss) +{ + pss->host_page_sending =3D false; + /* This is not needed, but just to reset it */ + pss->host_page_start =3D pss->host_page_end =3D 0; +} + /** * ram_save_host_page: save a whole host page * @@ -2479,8 +2536,6 @@ static int ram_save_host_page(RAMState *rs, PageSearc= hStatus *pss) int tmppages, pages =3D 0; size_t pagesize_bits =3D qemu_ram_pagesize(pss->block) >> TARGET_PAGE_BITS; - unsigned long hostpage_boundary =3D - QEMU_ALIGN_UP(pss->page + 1, pagesize_bits); unsigned long start_page =3D pss->page; int res; =20 @@ -2493,6 +2548,9 @@ static int ram_save_host_page(RAMState *rs, PageSearc= hStatus *pss) postcopy_preempt_choose_channel(rs, pss); } =20 + /* Update host page boundary information */ + pss_host_page_prepare(pss); + do { if (postcopy_needs_preempt(rs, pss)) { postcopy_do_preempt(rs, pss); @@ -2530,15 +2588,14 @@ static int ram_save_host_page(RAMState *rs, PageSea= rchStatus *pss) } =20 if (tmppages < 0) { + pss_host_page_finish(pss); return tmppages; } =20 - pss->page =3D migration_bitmap_find_dirty(rs, pss->block, pss->pag= e); - } while ((pss->page < hostpage_boundary) && - offset_in_ramblock(pss->block, - ((ram_addr_t)pss->page) << TARGET_PAGE_BIT= S)); - /* The offset we leave with is the min boundary of host page and block= */ - pss->page =3D MIN(pss->page, hostpage_boundary); + pss_find_next_dirty(pss); + } while (pss_within_range(pss)); + + pss_host_page_finish(pss); =20 /* * When with postcopy preempt mode, flush the data as soon as possible= for --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670235465; cv=none; d=zohomail.com; s=zohoarc; b=lPsMV8+T8LJRdrdoirB5DX4SROdiaW/Dimw7lrcvLAq20puKllM7O6JSE2XPVrNubP0sul69l488XOqMGdX8Xt4SuC9+dKEzO8151e3krwRqz2/k4G+aROKKVEBWh6EbNp2w7TZ+yx0TpQKn5ZrZ5nFqEhk6inb3qraGUwbPl94= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670235465; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=KkPlQ4gEg9a7Yj+e7nBmIk5Ti/EnLgZT1bGXxBuSW7U=; b=QEoNkp8aKnxdpPnj69D0n+NlDjM394xmTTBkVfvx89PxEIapO86mOrM7YXele79JB2C9kh3qP8r693b1DQiTPqzONkmxfhYgixTYmRxFwsY3OJaGfR8DQq6+HdHFon5LrGTDiFgduaIsRvnfsqU9sk9t7DDrcypeHIpURbO07Y0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670235465213338.68894132206503; Mon, 5 Dec 2022 02:17:45 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Eg-0005aM-L8; Mon, 05 Dec 2022 04:58:06 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Ef-0005Xm-OF for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:58:05 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Ed-00081s-5p for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:58:05 -0500 Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-115-MyOiaqYXNuqyBrLjCF3Tdg-1; Mon, 05 Dec 2022 04:57:54 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 5DD943C10ECD; Mon, 5 Dec 2022 09:57:53 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id DD16B2166B29; Mon, 5 Dec 2022 09:57:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234282; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=KkPlQ4gEg9a7Yj+e7nBmIk5Ti/EnLgZT1bGXxBuSW7U=; b=b8wb8c/JKVOcsyUOyOVPAlciCE9EE7iyKnJXJyi8IPMxxE0LyxDycc25gm/G8CTJJmjTaB oRP//RaUoW1nx/wOzTrFKvRI8cvB+fV318hb/0DpPY2+XScCb4AT2cfTBQCrkhvVS3LALr 6FA4MoiO7puEGiM5rC8wVyNET9Q8AV4= X-MC-Unique: MyOiaqYXNuqyBrLjCF3Tdg-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Peter Xu Subject: [PATCH v2 40/51] migration: Introduce pss_channel Date: Mon, 5 Dec 2022 10:52:17 +0100 Message-Id: <20221205095228.1314-41-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670235466340100001 Content-Type: text/plain; charset="utf-8" From: Peter Xu Introduce pss_channel for PageSearchStatus, define it as "the migration channel to be used to transfer this host page". We used to have rs->f, which is a mirror to MigrationState.to_dst_file. After postcopy preempt initial version, rs->f can be dynamically changed depending on which channel we want to use. But that later work still doesn't grant full concurrency of sending pages in e.g. different threads, because rs->f can either be the PRECOPY channel or POSTCOPY channel. This needs to be per-thread too. PageSearchStatus is actually a good piece of struct which we can leverage if we want to have multiple threads sending pages. Sending a single guest page may not make sense, so we make the granule to be "host page", and in the PSS structure we allow specify a QEMUFile* to migrate a specific host page. Then we open the possibility to specify different channels in different threads with different PSS structures. The PSS prefix can be slightly misleading here because e.g. for the upcoming usage of postcopy channel/thread it's not "searching" (or, scanning) at all but sending the explicit page that was requested. However since PSS existed for some years keep it as-is until someone complains. This patch mostly (simply) replace rs->f with pss->pss_channel only. No functional change intended for this patch yet. But it does prepare to finally drop rs->f, and make ram_save_guest_page() thread safe. Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Peter Xu Reviewed-by: Juan Quintela Signed-off-by: Juan Quintela --- migration/ram.c | 70 +++++++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index 4d7b50ef79..571d780987 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -453,6 +453,8 @@ void dirty_sync_missed_zero_copy(void) =20 /* used by the search for pages to send */ struct PageSearchStatus { + /* The migration channel used for a specific host page */ + QEMUFile *pss_channel; /* Current block being searched */ RAMBlock *block; /* Current page to search from */ @@ -775,9 +777,9 @@ static void xbzrle_cache_zero_page(RAMState *rs, ram_ad= dr_t current_addr) * @block: block that contains the page we want to send * @offset: offset inside the block for the page */ -static int save_xbzrle_page(RAMState *rs, uint8_t **current_data, - ram_addr_t current_addr, RAMBlock *block, - ram_addr_t offset) +static int save_xbzrle_page(RAMState *rs, QEMUFile *file, + uint8_t **current_data, ram_addr_t current_add= r, + RAMBlock *block, ram_addr_t offset) { int encoded_len =3D 0, bytes_xbzrle; uint8_t *prev_cached_page; @@ -845,11 +847,11 @@ static int save_xbzrle_page(RAMState *rs, uint8_t **c= urrent_data, } =20 /* Send XBZRLE based compressed page */ - bytes_xbzrle =3D save_page_header(rs, rs->f, block, + bytes_xbzrle =3D save_page_header(rs, file, block, offset | RAM_SAVE_FLAG_XBZRLE); - qemu_put_byte(rs->f, ENCODING_FLAG_XBZRLE); - qemu_put_be16(rs->f, encoded_len); - qemu_put_buffer(rs->f, XBZRLE.encoded_buf, encoded_len); + qemu_put_byte(file, ENCODING_FLAG_XBZRLE); + qemu_put_be16(file, encoded_len); + qemu_put_buffer(file, XBZRLE.encoded_buf, encoded_len); bytes_xbzrle +=3D encoded_len + 1 + 2; /* * Like compressed_size (please see update_compress_thread_counts), @@ -1305,9 +1307,10 @@ static int save_zero_page_to_file(RAMState *rs, QEMU= File *file, * @block: block that contains the page we want to send * @offset: offset inside the block for the page */ -static int save_zero_page(RAMState *rs, RAMBlock *block, ram_addr_t offset) +static int save_zero_page(RAMState *rs, QEMUFile *file, RAMBlock *block, + ram_addr_t offset) { - int len =3D save_zero_page_to_file(rs, rs->f, block, offset); + int len =3D save_zero_page_to_file(rs, file, block, offset); =20 if (len) { stat64_add(&ram_atomic_counters.duplicate, 1); @@ -1324,15 +1327,15 @@ static int save_zero_page(RAMState *rs, RAMBlock *b= lock, ram_addr_t offset) * * Return true if the pages has been saved, otherwise false is returned. */ -static bool control_save_page(RAMState *rs, RAMBlock *block, ram_addr_t of= fset, - int *pages) +static bool control_save_page(PageSearchStatus *pss, RAMBlock *block, + ram_addr_t offset, int *pages) { uint64_t bytes_xmit =3D 0; int ret; =20 *pages =3D -1; - ret =3D ram_control_save_page(rs->f, block->offset, offset, TARGET_PAG= E_SIZE, - &bytes_xmit); + ret =3D ram_control_save_page(pss->pss_channel, block->offset, offset, + TARGET_PAGE_SIZE, &bytes_xmit); if (ret =3D=3D RAM_SAVE_CONTROL_NOT_SUPP) { return false; } @@ -1366,17 +1369,17 @@ static bool control_save_page(RAMState *rs, RAMBloc= k *block, ram_addr_t offset, * @buf: the page to be sent * @async: send to page asyncly */ -static int save_normal_page(RAMState *rs, RAMBlock *block, ram_addr_t offs= et, - uint8_t *buf, bool async) +static int save_normal_page(RAMState *rs, QEMUFile *file, RAMBlock *block, + ram_addr_t offset, uint8_t *buf, bool async) { - ram_transferred_add(save_page_header(rs, rs->f, block, + ram_transferred_add(save_page_header(rs, file, block, offset | RAM_SAVE_FLAG_PAGE)); if (async) { - qemu_put_buffer_async(rs->f, buf, TARGET_PAGE_SIZE, + qemu_put_buffer_async(file, buf, TARGET_PAGE_SIZE, migrate_release_ram() && migration_in_postcopy()); } else { - qemu_put_buffer(rs->f, buf, TARGET_PAGE_SIZE); + qemu_put_buffer(file, buf, TARGET_PAGE_SIZE); } ram_transferred_add(TARGET_PAGE_SIZE); stat64_add(&ram_atomic_counters.normal, 1); @@ -1409,8 +1412,8 @@ static int ram_save_page(RAMState *rs, PageSearchStat= us *pss) =20 XBZRLE_cache_lock(); if (rs->xbzrle_enabled && !migration_in_postcopy()) { - pages =3D save_xbzrle_page(rs, &p, current_addr, block, - offset); + pages =3D save_xbzrle_page(rs, pss->pss_channel, &p, current_addr, + block, offset); if (!rs->last_stage) { /* Can't send this cached data async, since the cache page * might get updated before it gets to the wire @@ -1421,7 +1424,8 @@ static int ram_save_page(RAMState *rs, PageSearchStat= us *pss) =20 /* XBZRLE overflow or normal page */ if (pages =3D=3D -1) { - pages =3D save_normal_page(rs, block, offset, p, send_async); + pages =3D save_normal_page(rs, pss->pss_channel, block, offset, + p, send_async); } =20 XBZRLE_cache_unlock(); @@ -1429,10 +1433,10 @@ static int ram_save_page(RAMState *rs, PageSearchSt= atus *pss) return pages; } =20 -static int ram_save_multifd_page(RAMState *rs, RAMBlock *block, +static int ram_save_multifd_page(QEMUFile *file, RAMBlock *block, ram_addr_t offset) { - if (multifd_queue_page(rs->f, block, offset) < 0) { + if (multifd_queue_page(file, block, offset) < 0) { return -1; } stat64_add(&ram_atomic_counters.normal, 1); @@ -1727,7 +1731,7 @@ static int ram_save_release_protection(RAMState *rs, = PageSearchStatus *pss, uint64_t run_length =3D (pss->page - start_page) << TARGET_PAGE_BI= TS; =20 /* Flush async buffers before un-protect. */ - qemu_fflush(rs->f); + qemu_fflush(pss->pss_channel); /* Un-protect memory range. */ res =3D uffd_change_protection(rs->uffdio_fd, page_address, run_le= ngth, false, false); @@ -2314,7 +2318,7 @@ static int ram_save_target_page(RAMState *rs, PageSea= rchStatus *pss) ram_addr_t offset =3D ((ram_addr_t)pss->page) << TARGET_PAGE_BITS; int res; =20 - if (control_save_page(rs, block, offset, &res)) { + if (control_save_page(pss, block, offset, &res)) { return res; } =20 @@ -2322,7 +2326,7 @@ static int ram_save_target_page(RAMState *rs, PageSea= rchStatus *pss) return 1; } =20 - res =3D save_zero_page(rs, block, offset); + res =3D save_zero_page(rs, pss->pss_channel, block, offset); if (res > 0) { /* Must let xbzrle know, otherwise a previous (now 0'd) cached * page would be stale @@ -2342,7 +2346,7 @@ static int ram_save_target_page(RAMState *rs, PageSea= rchStatus *pss) * still see partially copied pages which is data corruption. */ if (migrate_use_multifd() && !migration_in_postcopy()) { - return ram_save_multifd_page(rs, block, offset); + return ram_save_multifd_page(pss->pss_channel, block, offset); } =20 return ram_save_page(rs, pss); @@ -2544,10 +2548,6 @@ static int ram_save_host_page(RAMState *rs, PageSear= chStatus *pss) return 0; } =20 - if (postcopy_preempt_active()) { - postcopy_preempt_choose_channel(rs, pss); - } - /* Update host page boundary information */ pss_host_page_prepare(pss); =20 @@ -2607,7 +2607,7 @@ static int ram_save_host_page(RAMState *rs, PageSearc= hStatus *pss) * explicit flush or it won't flush until the buffer is full. */ if (migrate_postcopy_preempt() && pss->postcopy_requested) { - qemu_fflush(rs->f); + qemu_fflush(pss->pss_channel); } =20 res =3D ram_save_release_protection(rs, pss, start_page); @@ -2673,6 +2673,12 @@ static int ram_find_and_save_block(RAMState *rs) } =20 if (found) { + /* Update rs->f with correct channel */ + if (postcopy_preempt_active()) { + postcopy_preempt_choose_channel(rs, &pss); + } + /* Cache rs->f in pss_channel (TODO: remove rs->f) */ + pss.pss_channel =3D rs->f; pages =3D ram_save_host_page(rs, &pss); } } while (!pages && again); --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670235797; cv=none; d=zohomail.com; s=zohoarc; b=ZDZ9o0xydPYfcU7fMjLLPBoi0LbOLF52M7dw1bVPZ1PKND2ntZXoO1/Go0PPt74cdx3QfamNERFoIdETny60R/BuCiYS26G//cOR5qoDmZBSs28kqIjp6eA9wyy5MLa5z2GL5llfLTXiLQ0zhqoUYrlp56lKdsagvTnwZFGNjMw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670235797; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=8lyK5jWTjCJAgRQLnodHZvbuyoizfgIifPcdRmMqw2Q=; b=VvlBVJnDA05sfkR7kg5WXCIXl9i8+kNvuLZYCd8DIOh4aOIVRFiCCsWUy1x/7UNTK5API6eKpd5Idzn/tv01rpBWgm2sw61Wki1Bfxk/2eHQSSTEjWKHTN17dYQkCJrlL76R0ORiZp71LX+brQQKUl3EB2+aEW7KjrwyJn/zdVM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670235797309873.2720935762269; Mon, 5 Dec 2022 02:23:17 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Ek-0005h4-MA; Mon, 05 Dec 2022 04:58:10 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Ej-0005eL-6D for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:58:09 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Eg-00082c-BD for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:58:08 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-605-72UGLoTcPNiov9btYGUh6w-1; Mon, 05 Dec 2022 04:58:02 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 2AC55811E75; Mon, 5 Dec 2022 09:58:01 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id B3B4F2166B2A; Mon, 5 Dec 2022 09:57:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234285; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8lyK5jWTjCJAgRQLnodHZvbuyoizfgIifPcdRmMqw2Q=; b=gnki1rY47FiUxrrFnj9PpVWTnUNWvjAymjiWZWkILsK0MQbu1U7nEpIweYvr/0QCTTnJu6 rI8gAHfuJOR2o979O2WHgJAVmV1ZRtCG87vfT7Yxl+JxwA9Bdz4QO6B86kZO2MX1YpRO8n rh0HVNFrGNIL/KXby6KSRjDSdP31+lU= X-MC-Unique: 72UGLoTcPNiov9btYGUh6w-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Peter Xu Subject: [PATCH v2 41/51] migration: Add pss_init() Date: Mon, 5 Dec 2022 10:52:18 +0100 Message-Id: <20221205095228.1314-42-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670235797731100001 Content-Type: text/plain; charset="utf-8" From: Peter Xu Helper to init PSS structures. Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Peter Xu Reviewed-by: Juan Quintela Signed-off-by: Juan Quintela --- migration/ram.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index 571d780987..d81bf7b183 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -542,6 +542,14 @@ static bool do_compress_ram_page(QEMUFile *f, z_stream= *stream, RAMBlock *block, static void postcopy_preempt_restore(RAMState *rs, PageSearchStatus *pss, bool postcopy_requested); =20 +/* NOTE: page is the PFN not real ram_addr_t. */ +static void pss_init(PageSearchStatus *pss, RAMBlock *rb, ram_addr_t page) +{ + pss->block =3D rb; + pss->page =3D page; + pss->complete_round =3D false; +} + static void *do_data_compress(void *opaque) { CompressParam *param =3D opaque; @@ -2650,9 +2658,7 @@ static int ram_find_and_save_block(RAMState *rs) rs->last_page =3D 0; } =20 - pss.block =3D rs->last_seen_block; - pss.page =3D rs->last_page; - pss.complete_round =3D false; + pss_init(&pss, rs->last_seen_block, rs->last_page); =20 do { again =3D true; --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670235734; cv=none; d=zohomail.com; s=zohoarc; b=C/1e2Pvbvjwqi9W4XZE3CCQgohjLMsUyqatJuP6YHxBVwCOkDUO9UklmTUs4yyxlc7F1lTZMxTElbXoBxVyXi1hQUCxpAXYLn8Vt3IlL507spx5fOxY6jvssjN24gme1sjM4eWp7KcZ5H8wHW2ZokWTRUk+sYnGoq5hJIlniMEA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670235734; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=qYA73M7Ng+wC6nj7QttuHiv7/6zn1BOBSnRJfyDjZvE=; b=aO5iNyIefy2stz5Ted9WiEKahz9SAsBCpA9tWTZuz8ixDbwRhVkDJ8Tt+/O+1hfsF9FkeMnW+VPG0+O0XizXBtcHWpgovcNjZdHF/iZaINdfaI7kzOeqi7FL3M3o6nqbFSQm4z5y2bi425aLgzWeeAgTWPJ+w2at3VP7SUGmVSE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670235734511370.5241821854146; Mon, 5 Dec 2022 02:22:14 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28Et-0005xT-5I; Mon, 05 Dec 2022 04:58:19 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Eq-0005qK-Oz for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:58:16 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28En-00084j-TW for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:58:16 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-263-UIwTvrR0MmKZoY5UX9HDwA-1; Mon, 05 Dec 2022 04:58:10 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id E8C4F811E7A; Mon, 5 Dec 2022 09:58:08 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 78A952166B29; Mon, 5 Dec 2022 09:58:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234293; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=qYA73M7Ng+wC6nj7QttuHiv7/6zn1BOBSnRJfyDjZvE=; b=EXeHxi1heIPEsWXyhvjQyEouQt4jI7Csy58ZfvmhOtHgA1M3/9lITODkphYSe26TFKiy0I pZjF3nu+RjKg+6I99DBoo+1FmhZSVDAINN6IgikgwxIFF6SWuzxfEqoMZkylUd9pkBhtQm Ije1OAMTUIEBSgXdT9l/Z+PtyecxDwA= X-MC-Unique: UIwTvrR0MmKZoY5UX9HDwA-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Peter Xu Subject: [PATCH v2 42/51] migration: Make PageSearchStatus part of RAMState Date: Mon, 5 Dec 2022 10:52:19 +0100 Message-Id: <20221205095228.1314-43-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670235735599100001 Content-Type: text/plain; charset="utf-8" From: Peter Xu We used to allocate PSS structure on the stack for precopy when sending pages. Make it static, so as to describe per-channel ram migration status. Here we declared RAM_CHANNEL_MAX instances, preparing for postcopy to use it, even though this patch has not yet to start using the 2nd instance. This should not have any functional change per se, but it already starts to export PSS information via the RAMState, so that e.g. one PSS channel can start to reference the other PSS channel. Always protect PSS access using the same RAMState.bitmap_mutex. We already do so, so no code change needed, just some comment update. Maybe we should consider renaming bitmap_mutex some day as it's going to be a more commonly and big mutex we use for ram states, but just leave it for later. Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Peter Xu Reviewed-by: Juan Quintela Signed-off-by: Juan Quintela --- migration/ram.c | 112 ++++++++++++++++++++++++++---------------------- 1 file changed, 61 insertions(+), 51 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index d81bf7b183..3194997738 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -85,6 +85,46 @@ =20 XBZRLECacheStats xbzrle_counters; =20 +/* used by the search for pages to send */ +struct PageSearchStatus { + /* The migration channel used for a specific host page */ + QEMUFile *pss_channel; + /* Current block being searched */ + RAMBlock *block; + /* Current page to search from */ + unsigned long page; + /* Set once we wrap around */ + bool complete_round; + /* + * [POSTCOPY-ONLY] Whether current page is explicitly requested by + * postcopy. When set, the request is "urgent" because the dest QEMU + * threads are waiting for us. + */ + bool postcopy_requested; + /* + * [POSTCOPY-ONLY] The target channel to use to send current page. + * + * Note: This may _not_ match with the value in postcopy_requested + * above. Let's imagine the case where the postcopy request is exactly + * the page that we're sending in progress during precopy. In this case + * we'll have postcopy_requested set to true but the target channel + * will be the precopy channel (so that we don't split brain on that + * specific page since the precopy channel already contains partial of + * that page data). + * + * Besides that specific use case, postcopy_target_channel should + * always be equal to postcopy_requested, because by default we send + * postcopy pages via postcopy preempt channel. + */ + bool postcopy_target_channel; + /* Whether we're sending a host page */ + bool host_page_sending; + /* The start/end of current host page. Invalid if host_page_sending= =3D=3Dfalse */ + unsigned long host_page_start; + unsigned long host_page_end; +}; +typedef struct PageSearchStatus PageSearchStatus; + /* struct contains XBZRLE cache and a static page used by the compression */ static struct { @@ -319,6 +359,11 @@ typedef struct { struct RAMState { /* QEMUFile used for this migration */ QEMUFile *f; + /* + * PageSearchStatus structures for the channels when send pages. + * Protected by the bitmap_mutex. + */ + PageSearchStatus pss[RAM_CHANNEL_MAX]; /* UFFD file descriptor, used in 'write-tracking' migration */ int uffdio_fd; /* Last block that we have visited searching for dirty pages */ @@ -362,7 +407,12 @@ struct RAMState { uint64_t target_page_count; /* number of dirty bits in the bitmap */ uint64_t migration_dirty_pages; - /* Protects modification of the bitmap and migration dirty pages */ + /* + * Protects: + * - dirty/clear bitmap + * - migration_dirty_pages + * - pss structures + */ QemuMutex bitmap_mutex; /* The RAMBlock used in the last src_page_requests */ RAMBlock *last_req_rb; @@ -451,46 +501,6 @@ void dirty_sync_missed_zero_copy(void) ram_counters.dirty_sync_missed_zero_copy++; } =20 -/* used by the search for pages to send */ -struct PageSearchStatus { - /* The migration channel used for a specific host page */ - QEMUFile *pss_channel; - /* Current block being searched */ - RAMBlock *block; - /* Current page to search from */ - unsigned long page; - /* Set once we wrap around */ - bool complete_round; - /* - * [POSTCOPY-ONLY] Whether current page is explicitly requested by - * postcopy. When set, the request is "urgent" because the dest QEMU - * threads are waiting for us. - */ - bool postcopy_requested; - /* - * [POSTCOPY-ONLY] The target channel to use to send current page. - * - * Note: This may _not_ match with the value in postcopy_requested - * above. Let's imagine the case where the postcopy request is exactly - * the page that we're sending in progress during precopy. In this case - * we'll have postcopy_requested set to true but the target channel - * will be the precopy channel (so that we don't split brain on that - * specific page since the precopy channel already contains partial of - * that page data). - * - * Besides that specific use case, postcopy_target_channel should - * always be equal to postcopy_requested, because by default we send - * postcopy pages via postcopy preempt channel. - */ - bool postcopy_target_channel; - /* Whether we're sending a host page */ - bool host_page_sending; - /* The start/end of current host page. Only valid if host_page_sendin= g=3D=3Dtrue */ - unsigned long host_page_start; - unsigned long host_page_end; -}; -typedef struct PageSearchStatus PageSearchStatus; - CompressionStats compression_counters; =20 struct CompressParam { @@ -2637,7 +2647,7 @@ static int ram_save_host_page(RAMState *rs, PageSearc= hStatus *pss) */ static int ram_find_and_save_block(RAMState *rs) { - PageSearchStatus pss; + PageSearchStatus *pss =3D &rs->pss[RAM_CHANNEL_PRECOPY]; int pages =3D 0; bool again, found; =20 @@ -2658,11 +2668,11 @@ static int ram_find_and_save_block(RAMState *rs) rs->last_page =3D 0; } =20 - pss_init(&pss, rs->last_seen_block, rs->last_page); + pss_init(pss, rs->last_seen_block, rs->last_page); =20 do { again =3D true; - found =3D get_queued_page(rs, &pss); + found =3D get_queued_page(rs, pss); =20 if (!found) { /* @@ -2670,27 +2680,27 @@ static int ram_find_and_save_block(RAMState *rs) * preempted precopy. Otherwise find the next dirty bit. */ if (postcopy_preempt_triggered(rs)) { - postcopy_preempt_restore(rs, &pss, false); + postcopy_preempt_restore(rs, pss, false); found =3D true; } else { /* priority queue empty, so just search for something dirt= y */ - found =3D find_dirty_block(rs, &pss, &again); + found =3D find_dirty_block(rs, pss, &again); } } =20 if (found) { /* Update rs->f with correct channel */ if (postcopy_preempt_active()) { - postcopy_preempt_choose_channel(rs, &pss); + postcopy_preempt_choose_channel(rs, pss); } /* Cache rs->f in pss_channel (TODO: remove rs->f) */ - pss.pss_channel =3D rs->f; - pages =3D ram_save_host_page(rs, &pss); + pss->pss_channel =3D rs->f; + pages =3D ram_save_host_page(rs, pss); } } while (!pages && again); =20 - rs->last_seen_block =3D pss.block; - rs->last_page =3D pss.page; + rs->last_seen_block =3D pss->block; + rs->last_page =3D pss->page; =20 return pages; } --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670236530; cv=none; d=zohomail.com; s=zohoarc; b=M9CsMJhIdytF7P6FTxO21rt2ub9k59Cf+THIrYGwWFZzzBg6rse4zUnNt5H8dZPZEyMN+8GCa9fBrEuSEL/4bhCZqGJVuGutAyiP20q9k/KVb02QO3clf/Cc5o4pUrYHnP9+hmyQnuwcTO8miX/giRjzFywvs0T7z/UFEGt+Ajc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670236530; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=7icidAgMmKsBG3F4fcNXQX7B0Cy+7eWT7Gq+EOY+DcU=; b=YUyqVSOC+3GXL3wGejXnvHxb9fmcjubsabtHRtAZITy7lXefZd1gAzzcYPMt3baAXVF/c5qcnDgsMffhWxfte+G0yxQshifkm7FnT2MKAbRhceOSfmNrW0uej0q4bRRS/D4YOxLHp8dFsSmCfUncKIgEvKGekCqLwyhE02Lu1uI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670236530983569.0985730557652; Mon, 5 Dec 2022 02:35:30 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28F2-0006EB-6u; Mon, 05 Dec 2022 04:58:28 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28F0-0006A0-5p for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:58:26 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Ey-00085y-04 for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:58:25 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-399-eahB3lwOMwOYmO_vPt4zMg-1; Mon, 05 Dec 2022 04:58:18 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id B7B8A101A5AD; Mon, 5 Dec 2022 09:58:16 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4A7A12166B29; Mon, 5 Dec 2022 09:58:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234303; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=7icidAgMmKsBG3F4fcNXQX7B0Cy+7eWT7Gq+EOY+DcU=; b=ZP62fvQZM0wQXCve3L35W4u8MEnQ7ScFsGDNb4HU6IjoZ9YpUeIcm3yw3uaI7S0IRGuzMe rAQKAAqtLTjcJCwVlLMn4lGV1uZKECTCwIXK+HS0bn2KDOZ2X8pxII+U6n3BM0qwvrPAj6 HgFIZjeVNR0bgRWoVY8zjokNT3YxQzg= X-MC-Unique: eahB3lwOMwOYmO_vPt4zMg-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Peter Xu Subject: [PATCH v2 43/51] migration: Move last_sent_block into PageSearchStatus Date: Mon, 5 Dec 2022 10:52:20 +0100 Message-Id: <20221205095228.1314-44-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670236532697100003 Content-Type: text/plain; charset="utf-8" From: Peter Xu Since we use PageSearchStatus to represent a channel, it makes perfect sense to keep last_sent_block (aka, leverage RAM_SAVE_FLAG_CONTINUE) to be per-channel rather than global because each channel can be sending different pages on ramblocks. Hence move it from RAMState into PageSearchStatus. Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Peter Xu Reviewed-by: Juan Quintela Signed-off-by: Juan Quintela --- migration/ram.c | 71 ++++++++++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 30 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index 3194997738..1233ff53ac 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -89,6 +89,8 @@ XBZRLECacheStats xbzrle_counters; struct PageSearchStatus { /* The migration channel used for a specific host page */ QEMUFile *pss_channel; + /* Last block from where we have sent data */ + RAMBlock *last_sent_block; /* Current block being searched */ RAMBlock *block; /* Current page to search from */ @@ -368,8 +370,6 @@ struct RAMState { int uffdio_fd; /* Last block that we have visited searching for dirty pages */ RAMBlock *last_seen_block; - /* Last block from where we have sent data */ - RAMBlock *last_sent_block; /* Last dirty target page we have sent */ ram_addr_t last_page; /* last ram version we have seen */ @@ -684,16 +684,17 @@ exit: * * Returns the number of bytes written * - * @f: QEMUFile where to send the data + * @pss: current PSS channel status * @block: block that contains the page we want to send * @offset: offset inside the block for the page * in the lower bits, it contains flags */ -static size_t save_page_header(RAMState *rs, QEMUFile *f, RAMBlock *block, +static size_t save_page_header(PageSearchStatus *pss, RAMBlock *block, ram_addr_t offset) { size_t size, len; - bool same_block =3D (block =3D=3D rs->last_sent_block); + bool same_block =3D (block =3D=3D pss->last_sent_block); + QEMUFile *f =3D pss->pss_channel; =20 if (same_block) { offset |=3D RAM_SAVE_FLAG_CONTINUE; @@ -706,7 +707,7 @@ static size_t save_page_header(RAMState *rs, QEMUFile *= f, RAMBlock *block, qemu_put_byte(f, len); qemu_put_buffer(f, (uint8_t *)block->idstr, len); size +=3D 1 + len; - rs->last_sent_block =3D block; + pss->last_sent_block =3D block; } return size; } @@ -790,17 +791,19 @@ static void xbzrle_cache_zero_page(RAMState *rs, ram_= addr_t current_addr) * -1 means that xbzrle would be longer than normal * * @rs: current RAM state + * @pss: current PSS channel * @current_data: pointer to the address of the page contents * @current_addr: addr of the page * @block: block that contains the page we want to send * @offset: offset inside the block for the page */ -static int save_xbzrle_page(RAMState *rs, QEMUFile *file, +static int save_xbzrle_page(RAMState *rs, PageSearchStatus *pss, uint8_t **current_data, ram_addr_t current_add= r, RAMBlock *block, ram_addr_t offset) { int encoded_len =3D 0, bytes_xbzrle; uint8_t *prev_cached_page; + QEMUFile *file =3D pss->pss_channel; =20 if (!cache_is_cached(XBZRLE.cache, current_addr, ram_counters.dirty_sync_count)) { @@ -865,7 +868,7 @@ static int save_xbzrle_page(RAMState *rs, QEMUFile *fil= e, } =20 /* Send XBZRLE based compressed page */ - bytes_xbzrle =3D save_page_header(rs, file, block, + bytes_xbzrle =3D save_page_header(pss, block, offset | RAM_SAVE_FLAG_XBZRLE); qemu_put_byte(file, ENCODING_FLAG_XBZRLE); qemu_put_be16(file, encoded_len); @@ -1296,19 +1299,19 @@ void ram_release_page(const char *rbname, uint64_t = offset) * Returns the size of data written to the file, 0 means the page is not * a zero page * - * @rs: current RAM state - * @file: the file where the data is saved + * @pss: current PSS channel * @block: block that contains the page we want to send * @offset: offset inside the block for the page */ -static int save_zero_page_to_file(RAMState *rs, QEMUFile *file, +static int save_zero_page_to_file(PageSearchStatus *pss, RAMBlock *block, ram_addr_t offset) { uint8_t *p =3D block->host + offset; + QEMUFile *file =3D pss->pss_channel; int len =3D 0; =20 if (buffer_is_zero(p, TARGET_PAGE_SIZE)) { - len +=3D save_page_header(rs, file, block, offset | RAM_SAVE_FLAG_= ZERO); + len +=3D save_page_header(pss, block, offset | RAM_SAVE_FLAG_ZERO); qemu_put_byte(file, 0); len +=3D 1; ram_release_page(block->idstr, offset); @@ -1321,14 +1324,14 @@ static int save_zero_page_to_file(RAMState *rs, QEM= UFile *file, * * Returns the number of pages written. * - * @rs: current RAM state + * @pss: current PSS channel * @block: block that contains the page we want to send * @offset: offset inside the block for the page */ -static int save_zero_page(RAMState *rs, QEMUFile *file, RAMBlock *block, +static int save_zero_page(PageSearchStatus *pss, RAMBlock *block, ram_addr_t offset) { - int len =3D save_zero_page_to_file(rs, file, block, offset); + int len =3D save_zero_page_to_file(pss, block, offset); =20 if (len) { stat64_add(&ram_atomic_counters.duplicate, 1); @@ -1381,16 +1384,18 @@ static bool control_save_page(PageSearchStatus *pss= , RAMBlock *block, * * Returns the number of pages written. * - * @rs: current RAM state + * @pss: current PSS channel * @block: block that contains the page we want to send * @offset: offset inside the block for the page * @buf: the page to be sent * @async: send to page asyncly */ -static int save_normal_page(RAMState *rs, QEMUFile *file, RAMBlock *block, +static int save_normal_page(PageSearchStatus *pss, RAMBlock *block, ram_addr_t offset, uint8_t *buf, bool async) { - ram_transferred_add(save_page_header(rs, file, block, + QEMUFile *file =3D pss->pss_channel; + + ram_transferred_add(save_page_header(pss, block, offset | RAM_SAVE_FLAG_PAGE)); if (async) { qemu_put_buffer_async(file, buf, TARGET_PAGE_SIZE, @@ -1430,7 +1435,7 @@ static int ram_save_page(RAMState *rs, PageSearchStat= us *pss) =20 XBZRLE_cache_lock(); if (rs->xbzrle_enabled && !migration_in_postcopy()) { - pages =3D save_xbzrle_page(rs, pss->pss_channel, &p, current_addr, + pages =3D save_xbzrle_page(rs, pss, &p, current_addr, block, offset); if (!rs->last_stage) { /* Can't send this cached data async, since the cache page @@ -1442,8 +1447,7 @@ static int ram_save_page(RAMState *rs, PageSearchStat= us *pss) =20 /* XBZRLE overflow or normal page */ if (pages =3D=3D -1) { - pages =3D save_normal_page(rs, pss->pss_channel, block, offset, - p, send_async); + pages =3D save_normal_page(pss, block, offset, p, send_async); } =20 XBZRLE_cache_unlock(); @@ -1466,14 +1470,15 @@ static bool do_compress_ram_page(QEMUFile *f, z_str= eam *stream, RAMBlock *block, ram_addr_t offset, uint8_t *source_buf) { RAMState *rs =3D ram_state; + PageSearchStatus *pss =3D &rs->pss[RAM_CHANNEL_PRECOPY]; uint8_t *p =3D block->host + offset; int ret; =20 - if (save_zero_page_to_file(rs, f, block, offset)) { + if (save_zero_page_to_file(pss, block, offset)) { return true; } =20 - save_page_header(rs, f, block, offset | RAM_SAVE_FLAG_COMPRESS_PAGE); + save_page_header(pss, block, offset | RAM_SAVE_FLAG_COMPRESS_PAGE); =20 /* * copy it to a internal buffer to avoid it being modified by VM @@ -2293,7 +2298,8 @@ static bool save_page_use_compression(RAMState *rs) * has been properly handled by compression, otherwise needs other * paths to handle it */ -static bool save_compress_page(RAMState *rs, RAMBlock *block, ram_addr_t o= ffset) +static bool save_compress_page(RAMState *rs, PageSearchStatus *pss, + RAMBlock *block, ram_addr_t offset) { if (!save_page_use_compression(rs)) { return false; @@ -2309,7 +2315,7 @@ static bool save_compress_page(RAMState *rs, RAMBlock= *block, ram_addr_t offset) * We post the fist page as normal page as compression will take * much CPU resource. */ - if (block !=3D rs->last_sent_block) { + if (block !=3D pss->last_sent_block) { flush_compressed_data(rs); return false; } @@ -2340,11 +2346,11 @@ static int ram_save_target_page(RAMState *rs, PageS= earchStatus *pss) return res; } =20 - if (save_compress_page(rs, block, offset)) { + if (save_compress_page(rs, pss, block, offset)) { return 1; } =20 - res =3D save_zero_page(rs, pss->pss_channel, block, offset); + res =3D save_zero_page(pss, block, offset); if (res > 0) { /* Must let xbzrle know, otherwise a previous (now 0'd) cached * page would be stale @@ -2475,7 +2481,7 @@ static void postcopy_preempt_choose_channel(RAMState = *rs, PageSearchStatus *pss) * If channel switched, reset last_sent_block since the old sent b= lock * may not be on the same channel. */ - rs->last_sent_block =3D NULL; + pss->last_sent_block =3D NULL; =20 trace_postcopy_preempt_switch_channel(channel); } @@ -2814,8 +2820,13 @@ static void ram_save_cleanup(void *opaque) =20 static void ram_state_reset(RAMState *rs) { + int i; + + for (i =3D 0; i < RAM_CHANNEL_MAX; i++) { + rs->pss[i].last_sent_block =3D NULL; + } + rs->last_seen_block =3D NULL; - rs->last_sent_block =3D NULL; rs->last_page =3D 0; rs->last_version =3D ram_list.version; rs->xbzrle_enabled =3D false; @@ -3009,8 +3020,8 @@ void ram_postcopy_send_discard_bitmap(MigrationState = *ms) migration_bitmap_sync(rs); =20 /* Easiest way to make sure we don't resume in the middle of a host-pa= ge */ + rs->pss[RAM_CHANNEL_PRECOPY].last_sent_block =3D NULL; rs->last_seen_block =3D NULL; - rs->last_sent_block =3D NULL; rs->last_page =3D 0; =20 postcopy_each_ram_send_discard(ms); --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670235161; cv=none; d=zohomail.com; s=zohoarc; b=ASBTRqs0x3JQs5gveajnwBjpRi0/kr61QqNAvebp5H4y1uTpZDJZUSrZ5oM5Wbw6Fh1VvS41ATdUpuptt8DOPD9IXqc8aLK6H1CJi7WEOIFXtN+NwEJR75mVMJYDlSvNk+p1ah5/EqsCLpJdyXrVzvfmztiQCXnNR1DZ9DFDxL0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670235161; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=T/JPm5m9WNX1+QtcngXEAxrLV4M1X8iY9tKJjlFSJj4=; b=K+o90gzBKlLh2zDlen6ybgoQMpcrooknh3XNduNDfSSRuRVYdvXUcFetBUFTNtNQaE41HdPhWyNiduwe72unw656NyH1XDS96YFIstlzP1eUdWKhDUHPMr2GBOncmd+pU9f6BsmNnNR7hwll/mWovzHebr3ZI5Pi66gJYRxCiUY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 167023516148942.788418098295665; Mon, 5 Dec 2022 02:12:41 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28F7-0006OB-Bu; Mon, 05 Dec 2022 04:58:33 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28F5-0006KF-1O for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:58:31 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28F3-000875-96 for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:58:30 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-66-3Cx1-7IdMOCZwAvKEwaYDw-1; Mon, 05 Dec 2022 04:58:25 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 891CA85A588; Mon, 5 Dec 2022 09:58:24 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 19A942166B29; Mon, 5 Dec 2022 09:58:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234308; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=T/JPm5m9WNX1+QtcngXEAxrLV4M1X8iY9tKJjlFSJj4=; b=WikmF780O2K3IGF1HT5D2Op8LqpAU5F30sEP4aNH88FajMPqhnNaI80ns8Zhb1z9OREtge iyPNhWHYF9AoCUPwVMWP1VvhHS9MCHw3j10NdJbuMOJTUlQ8Ikf1JY4/ulaJRyRkfeaVA9 GmvFzA5YjDDRWj6jiVacZbDMPMP71b0= X-MC-Unique: 3Cx1-7IdMOCZwAvKEwaYDw-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Peter Xu Subject: [PATCH v2 44/51] migration: Send requested page directly in rp-return thread Date: Mon, 5 Dec 2022 10:52:21 +0100 Message-Id: <20221205095228.1314-45-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -14 X-Spam_score: -1.5 X-Spam_bar: - X-Spam_report: (-1.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, URG_BIZ=0.573 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670235162663100005 Content-Type: text/plain; charset="utf-8" From: Peter Xu With all the facilities ready, send the requested page directly in the rp-return thread rather than queuing it in the request queue, if and only if postcopy preempt is enabled. It can achieve so because it uses separate channel for sending urgent pages. The only shared data is bitmap and it's protected by the bitmap_mutex. Note that since we're moving the ownership of the urgent channel from the migration thread to rp thread it also means the rp thread is responsible for managing the qemufile, e.g. properly close it when pausing migration happens. For this, let migration_release_from_dst_file to cover shutdown of the urgent channel too, renaming it as migration_release_dst_files() to better show what it does. Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Peter Xu Reviewed-by: Juan Quintela Signed-off-by: Juan Quintela --- migration/migration.c | 35 +++++++------ migration/ram.c | 112 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 131 insertions(+), 16 deletions(-) diff --git a/migration/migration.c b/migration/migration.c index de83c50f51..c1d4d76d0c 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -2848,8 +2848,11 @@ static int migrate_handle_rp_resume_ack(MigrationSta= te *s, uint32_t value) return 0; } =20 -/* Release ms->rp_state.from_dst_file in a safe way */ -static void migration_release_from_dst_file(MigrationState *ms) +/* + * Release ms->rp_state.from_dst_file (and postcopy_qemufile_src if + * existed) in a safe way. + */ +static void migration_release_dst_files(MigrationState *ms) { QEMUFile *file; =20 @@ -2862,6 +2865,18 @@ static void migration_release_from_dst_file(Migratio= nState *ms) ms->rp_state.from_dst_file =3D NULL; } =20 + /* + * Do the same to postcopy fast path socket too if there is. No + * locking needed because this qemufile should only be managed by + * return path thread. + */ + if (ms->postcopy_qemufile_src) { + migration_ioc_unregister_yank_from_file(ms->postcopy_qemufile_src); + qemu_file_shutdown(ms->postcopy_qemufile_src); + qemu_fclose(ms->postcopy_qemufile_src); + ms->postcopy_qemufile_src =3D NULL; + } + qemu_fclose(file); } =20 @@ -3006,7 +3021,7 @@ out: * Maybe there is something we can do: it looks like a * network down issue, and we pause for a recovery. */ - migration_release_from_dst_file(ms); + migration_release_dst_files(ms); rp =3D NULL; if (postcopy_pause_return_path_thread(ms)) { /* @@ -3024,7 +3039,7 @@ out: } =20 trace_source_return_path_thread_end(); - migration_release_from_dst_file(ms); + migration_release_dst_files(ms); rcu_unregister_thread(); return NULL; } @@ -3547,18 +3562,6 @@ static MigThrError postcopy_pause(MigrationState *s) qemu_file_shutdown(file); qemu_fclose(file); =20 - /* - * Do the same to postcopy fast path socket too if there is. No - * locking needed because no racer as long as we do this before se= tting - * status to paused. - */ - if (s->postcopy_qemufile_src) { - migration_ioc_unregister_yank_from_file(s->postcopy_qemufile_s= rc); - qemu_file_shutdown(s->postcopy_qemufile_src); - qemu_fclose(s->postcopy_qemufile_src); - s->postcopy_qemufile_src =3D NULL; - } - migrate_set_state(&s->state, s->state, MIGRATION_STATUS_POSTCOPY_PAUSED); =20 diff --git a/migration/ram.c b/migration/ram.c index 1233ff53ac..16ade7cb70 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -546,6 +546,8 @@ static QemuThread *decompress_threads; static QemuMutex decomp_done_lock; static QemuCond decomp_done_cond; =20 +static int ram_save_host_page_urgent(PageSearchStatus *pss); + static bool do_compress_ram_page(QEMUFile *f, z_stream *stream, RAMBlock *= block, ram_addr_t offset, uint8_t *source_buf); =20 @@ -560,6 +562,16 @@ static void pss_init(PageSearchStatus *pss, RAMBlock *= rb, ram_addr_t page) pss->complete_round =3D false; } =20 +/* + * Check whether two PSSs are actively sending the same page. Return true + * if it is, false otherwise. + */ +static bool pss_overlap(PageSearchStatus *pss1, PageSearchStatus *pss2) +{ + return pss1->host_page_sending && pss2->host_page_sending && + (pss1->host_page_start =3D=3D pss2->host_page_start); +} + static void *do_data_compress(void *opaque) { CompressParam *param =3D opaque; @@ -2260,6 +2272,57 @@ int ram_save_queue_pages(const char *rbname, ram_add= r_t start, ram_addr_t len) return -1; } =20 + /* + * When with postcopy preempt, we send back the page directly in the + * rp-return thread. + */ + if (postcopy_preempt_active()) { + ram_addr_t page_start =3D start >> TARGET_PAGE_BITS; + size_t page_size =3D qemu_ram_pagesize(ramblock); + PageSearchStatus *pss =3D &ram_state->pss[RAM_CHANNEL_POSTCOPY]; + int ret =3D 0; + + qemu_mutex_lock(&rs->bitmap_mutex); + + pss_init(pss, ramblock, page_start); + /* + * Always use the preempt channel, and make sure it's there. It's + * safe to access without lock, because when rp-thread is running + * we should be the only one who operates on the qemufile + */ + pss->pss_channel =3D migrate_get_current()->postcopy_qemufile_src; + pss->postcopy_requested =3D true; + assert(pss->pss_channel); + + /* + * It must be either one or multiple of host page size. Just + * assert; if something wrong we're mostly split brain anyway. + */ + assert(len % page_size =3D=3D 0); + while (len) { + if (ram_save_host_page_urgent(pss)) { + error_report("%s: ram_save_host_page_urgent() failed: " + "ramblock=3D%s, start_addr=3D0x"RAM_ADDR_FMT, + __func__, ramblock->idstr, start); + ret =3D -1; + break; + } + /* + * NOTE: after ram_save_host_page_urgent() succeeded, pss->page + * will automatically be moved and point to the next host page + * we're going to send, so no need to update here. + * + * Normally QEMU never sends >1 host page in requests, so + * logically we don't even need that as the loop should only + * run once, but just to be consistent. + */ + len -=3D page_size; + }; + qemu_mutex_unlock(&rs->bitmap_mutex); + + return ret; + } + struct RAMSrcPageRequest *new_entry =3D g_new0(struct RAMSrcPageRequest, 1); new_entry->rb =3D ramblock; @@ -2537,6 +2600,55 @@ static void pss_host_page_finish(PageSearchStatus *p= ss) pss->host_page_start =3D pss->host_page_end =3D 0; } =20 +/* + * Send an urgent host page specified by `pss'. Need to be called with + * bitmap_mutex held. + * + * Returns 0 if save host page succeeded, false otherwise. + */ +static int ram_save_host_page_urgent(PageSearchStatus *pss) +{ + bool page_dirty, sent =3D false; + RAMState *rs =3D ram_state; + int ret =3D 0; + + trace_postcopy_preempt_send_host_page(pss->block->idstr, pss->page); + pss_host_page_prepare(pss); + + /* + * If precopy is sending the same page, let it be done in precopy, or + * we could send the same page in two channels and none of them will + * receive the whole page. + */ + if (pss_overlap(pss, &ram_state->pss[RAM_CHANNEL_PRECOPY])) { + trace_postcopy_preempt_hit(pss->block->idstr, + pss->page << TARGET_PAGE_BITS); + return 0; + } + + do { + page_dirty =3D migration_bitmap_clear_dirty(rs, pss->block, pss->p= age); + + if (page_dirty) { + /* Be strict to return code; it must be 1, or what else? */ + if (ram_save_target_page(rs, pss) !=3D 1) { + error_report_once("%s: ram_save_target_page failed", __fun= c__); + ret =3D -1; + goto out; + } + sent =3D true; + } + pss_find_next_dirty(pss); + } while (pss_within_range(pss)); +out: + pss_host_page_finish(pss); + /* For urgent requests, flush immediately if sent */ + if (sent) { + qemu_fflush(pss->pss_channel); + } + return ret; +} + /** * ram_save_host_page: save a whole host page * --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670235552; cv=none; d=zohomail.com; s=zohoarc; b=Es+XbpJi1AoeVx+20di4elLOnkyBfyBLzmq8K/3zEWMsciRJaPjdrMIG+rfid8dsqN4qGY9tcJy6iWu7xM7t3NrHpBkJhwDbVtehv9pqiAbygwPcmLQ62/4hJqybMVQVszdu42872k9F3NMEROCsTJEqtw1oRx1U0IjfHMmnb/I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670235552; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=b3OaD6EmIOQmYblQD6JDebQ+SMMGjJtWN/jwPdmSW4w=; b=Q1p4m9/h2E1ytP3EsXG38giwfq2YRbBr4fqteczFW13uQzBnJJvX5x/UlfQY9Y7I9JWFhFN7nctV/6eHznNe1sky4Jfyp9ycl2/rZSEHZ6dwqw6/sZPkCf/tWGLr2tISx6zwLisp0cPojychMjCNIhxpyrlPC4ptIohBcQwCLOM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670235552204110.43426484334373; Mon, 5 Dec 2022 02:19:12 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28FU-0006ge-OC; Mon, 05 Dec 2022 04:58:56 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28FJ-0006aZ-85 for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:58:47 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28FE-00088q-8r for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:58:43 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-466-0unskWxPMBquuJk0m40big-1; Mon, 05 Dec 2022 04:58:33 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 54830185A7A8; Mon, 5 Dec 2022 09:58:32 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id DFA192166B29; Mon, 5 Dec 2022 09:58:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234319; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=b3OaD6EmIOQmYblQD6JDebQ+SMMGjJtWN/jwPdmSW4w=; b=fndEHZcDf2Jktiq02pBHx7h9FE6v2jjJ848xIerlJjt6qu1XknWLeUZw6y5lvReRJEXLd+ xJ31yIy++VutoTD1p/EoVfq39URFz0/iGcELWa6bgot+L7/z5ZMzhLvu+S1PZyFKlxRIgc FwFmfztp17fouiraIVjEKdMMQK6QPNs= X-MC-Unique: 0unskWxPMBquuJk0m40big-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Peter Xu Subject: [PATCH v2 45/51] migration: Remove old preempt code around state maintainance Date: Mon, 5 Dec 2022 10:52:22 +0100 Message-Id: <20221205095228.1314-46-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -14 X-Spam_score: -1.5 X-Spam_bar: - X-Spam_report: (-1.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, URG_BIZ=0.573 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670235552760100001 Content-Type: text/plain; charset="utf-8" From: Peter Xu With the new code to send pages in rp-return thread, there's little help to keep lots of the old code on maintaining the preempt state in migration thread, because the new way should always be faster.. Then if we'll always send pages in the rp-return thread anyway, we don't need those logic to maintain preempt state anymore because now we serialize things using the mutex directly instead of using those fields. It's very unfortunate to have those code for a short period, but that's still one intermediate step that we noticed the next bottleneck on the migration thread. Now what we can do best is to drop unnecessary code as long as the new code is stable to reduce the burden. It's actually a good thing because the new "sending page in rp-return thread" model is (IMHO) even cleaner and with better performance. Remove the old code that was responsible for maintaining preempt states, at the meantime also remove x-postcopy-preempt-break-huge parameter because with concurrent sender threads we don't really need to break-huge anymore. Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Peter Xu Reviewed-by: Juan Quintela Signed-off-by: Juan Quintela --- migration/migration.h | 7 - migration/migration.c | 2 - migration/ram.c | 291 +----------------------------------------- 3 files changed, 3 insertions(+), 297 deletions(-) diff --git a/migration/migration.h b/migration/migration.h index cdad8aceaa..ae4ffd3454 100644 --- a/migration/migration.h +++ b/migration/migration.h @@ -340,13 +340,6 @@ struct MigrationState { bool send_configuration; /* Whether we send section footer during migration */ bool send_section_footer; - /* - * Whether we allow break sending huge pages when postcopy preempt is - * enabled. When disabled, we won't interrupt precopy within sending a - * host huge page, which is the old behavior of vanilla postcopy. - * NOTE: this parameter is ignored if postcopy preempt is not enabled. - */ - bool postcopy_preempt_break_huge; =20 /* Needed by postcopy-pause state */ QemuSemaphore postcopy_pause_sem; diff --git a/migration/migration.c b/migration/migration.c index c1d4d76d0c..c3490c495d 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -4402,8 +4402,6 @@ static Property migration_properties[] =3D { DEFINE_PROP_SIZE("announce-step", MigrationState, parameters.announce_step, DEFAULT_MIGRATE_ANNOUNCE_STEP), - DEFINE_PROP_BOOL("x-postcopy-preempt-break-huge", MigrationState, - postcopy_preempt_break_huge, true), DEFINE_PROP_STRING("tls-creds", MigrationState, parameters.tls_creds), DEFINE_PROP_STRING("tls-hostname", MigrationState, parameters.tls_host= name), DEFINE_PROP_STRING("tls-authz", MigrationState, parameters.tls_authz), diff --git a/migration/ram.c b/migration/ram.c index 16ade7cb70..1ae093fb61 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -97,28 +97,6 @@ struct PageSearchStatus { unsigned long page; /* Set once we wrap around */ bool complete_round; - /* - * [POSTCOPY-ONLY] Whether current page is explicitly requested by - * postcopy. When set, the request is "urgent" because the dest QEMU - * threads are waiting for us. - */ - bool postcopy_requested; - /* - * [POSTCOPY-ONLY] The target channel to use to send current page. - * - * Note: This may _not_ match with the value in postcopy_requested - * above. Let's imagine the case where the postcopy request is exactly - * the page that we're sending in progress during precopy. In this case - * we'll have postcopy_requested set to true but the target channel - * will be the precopy channel (so that we don't split brain on that - * specific page since the precopy channel already contains partial of - * that page data). - * - * Besides that specific use case, postcopy_target_channel should - * always be equal to postcopy_requested, because by default we send - * postcopy pages via postcopy preempt channel. - */ - bool postcopy_target_channel; /* Whether we're sending a host page */ bool host_page_sending; /* The start/end of current host page. Invalid if host_page_sending= =3D=3Dfalse */ @@ -343,20 +321,6 @@ struct RAMSrcPageRequest { QSIMPLEQ_ENTRY(RAMSrcPageRequest) next_req; }; =20 -typedef struct { - /* - * Cached ramblock/offset values if preempted. They're only meaningfu= l if - * preempted=3D=3Dtrue below. - */ - RAMBlock *ram_block; - unsigned long ram_page; - /* - * Whether a postcopy preemption just happened. Will be reset after - * precopy recovered to background migration. - */ - bool preempted; -} PostcopyPreemptState; - /* State of RAM for migration */ struct RAMState { /* QEMUFile used for this migration */ @@ -419,14 +383,6 @@ struct RAMState { /* Queue of outstanding page requests from the destination */ QemuMutex src_page_req_mutex; QSIMPLEQ_HEAD(, RAMSrcPageRequest) src_page_requests; - - /* Postcopy preemption informations */ - PostcopyPreemptState postcopy_preempt_state; - /* - * Current channel we're using on src VM. Only valid if postcopy-pree= mpt - * is enabled. - */ - unsigned int postcopy_channel; }; typedef struct RAMState RAMState; =20 @@ -434,11 +390,6 @@ static RAMState *ram_state; =20 static NotifierWithReturnList precopy_notifier_list; =20 -static void postcopy_preempt_reset(RAMState *rs) -{ - memset(&rs->postcopy_preempt_state, 0, sizeof(PostcopyPreemptState)); -} - /* Whether postcopy has queued requests? */ static bool postcopy_has_request(RAMState *rs) { @@ -551,9 +502,6 @@ static int ram_save_host_page_urgent(PageSearchStatus *= pss); static bool do_compress_ram_page(QEMUFile *f, z_stream *stream, RAMBlock *= block, ram_addr_t offset, uint8_t *source_buf); =20 -static void postcopy_preempt_restore(RAMState *rs, PageSearchStatus *pss, - bool postcopy_requested); - /* NOTE: page is the PFN not real ram_addr_t. */ static void pss_init(PageSearchStatus *pss, RAMBlock *rb, ram_addr_t page) { @@ -1612,13 +1560,6 @@ retry: */ static bool find_dirty_block(RAMState *rs, PageSearchStatus *pss, bool *ag= ain) { - /* - * This is not a postcopy requested page, mark it "not urgent", and use - * precopy channel to send it. - */ - pss->postcopy_requested =3D false; - pss->postcopy_target_channel =3D RAM_CHANNEL_PRECOPY; - /* Update pss->page for the next dirty bit in ramblock */ pss_find_next_dirty(pss); =20 @@ -2069,55 +2010,6 @@ void ram_write_tracking_stop(void) } #endif /* defined(__linux__) */ =20 -/* - * Check whether two addr/offset of the ramblock falls onto the same host = huge - * page. Returns true if so, false otherwise. - */ -static bool offset_on_same_huge_page(RAMBlock *rb, uint64_t addr1, - uint64_t addr2) -{ - size_t page_size =3D qemu_ram_pagesize(rb); - - addr1 =3D ROUND_DOWN(addr1, page_size); - addr2 =3D ROUND_DOWN(addr2, page_size); - - return addr1 =3D=3D addr2; -} - -/* - * Whether a previous preempted precopy huge page contains current request= ed - * page? Returns true if so, false otherwise. - * - * This should really happen very rarely, because it means when we were se= nding - * during background migration for postcopy we're sending exactly the page= that - * some vcpu got faulted on on dest node. When it happens, we probably do= n't - * need to do much but drop the request, because we know right after we re= store - * the precopy stream it'll be serviced. It'll slightly affect the order = of - * postcopy requests to be serviced (e.g. it'll be the same as we move cur= rent - * request to the end of the queue) but it shouldn't be a big deal. The m= ost - * imporant thing is we can _never_ try to send a partial-sent huge page o= n the - * POSTCOPY channel again, otherwise that huge page will got "split brain"= on - * two channels (PRECOPY, POSTCOPY). - */ -static bool postcopy_preempted_contains(RAMState *rs, RAMBlock *block, - ram_addr_t offset) -{ - PostcopyPreemptState *state =3D &rs->postcopy_preempt_state; - - /* No preemption at all? */ - if (!state->preempted) { - return false; - } - - /* Not even the same ramblock? */ - if (state->ram_block !=3D block) { - return false; - } - - return offset_on_same_huge_page(block, offset, - state->ram_page << TARGET_PAGE_BITS); -} - /** * get_queued_page: unqueue a page from the postcopy requests * @@ -2157,20 +2049,7 @@ static bool get_queued_page(RAMState *rs, PageSearch= Status *pss) =20 } while (block && !dirty); =20 - if (block) { - /* See comment above postcopy_preempted_contains() */ - if (postcopy_preempted_contains(rs, block, offset)) { - trace_postcopy_preempt_hit(block->idstr, offset); - /* - * If what we preempted previously was exactly what we're - * requesting right now, restore the preempted precopy - * immediately, boosting its priority as it's requested by - * postcopy. - */ - postcopy_preempt_restore(rs, pss, true); - return true; - } - } else { + if (!block) { /* * Poll write faults too if background snapshot is enabled; that's * when we have vcpus got blocked by the write protected pages. @@ -2192,9 +2071,6 @@ static bool get_queued_page(RAMState *rs, PageSearchS= tatus *pss) * really rare. */ pss->complete_round =3D false; - /* Mark it an urgent request, meanwhile using POSTCOPY channel */ - pss->postcopy_requested =3D true; - pss->postcopy_target_channel =3D RAM_CHANNEL_POSTCOPY; } =20 return !!block; @@ -2291,7 +2167,6 @@ int ram_save_queue_pages(const char *rbname, ram_addr= _t start, ram_addr_t len) * we should be the only one who operates on the qemufile */ pss->pss_channel =3D migrate_get_current()->postcopy_qemufile_src; - pss->postcopy_requested =3D true; assert(pss->pss_channel); =20 /* @@ -2439,129 +2314,6 @@ static int ram_save_target_page(RAMState *rs, PageS= earchStatus *pss) return ram_save_page(rs, pss); } =20 -static bool postcopy_needs_preempt(RAMState *rs, PageSearchStatus *pss) -{ - MigrationState *ms =3D migrate_get_current(); - - /* Not enabled eager preempt? Then never do that. */ - if (!migrate_postcopy_preempt()) { - return false; - } - - /* If the user explicitly disabled breaking of huge page, skip */ - if (!ms->postcopy_preempt_break_huge) { - return false; - } - - /* If the ramblock we're sending is a small page? Never bother. */ - if (qemu_ram_pagesize(pss->block) =3D=3D TARGET_PAGE_SIZE) { - return false; - } - - /* Not in postcopy at all? */ - if (!migration_in_postcopy()) { - return false; - } - - /* - * If we're already handling a postcopy request, don't preempt as this= page - * has got the same high priority. - */ - if (pss->postcopy_requested) { - return false; - } - - /* If there's postcopy requests, then check it up! */ - return postcopy_has_request(rs); -} - -/* Returns true if we preempted precopy, false otherwise */ -static void postcopy_do_preempt(RAMState *rs, PageSearchStatus *pss) -{ - PostcopyPreemptState *p_state =3D &rs->postcopy_preempt_state; - - trace_postcopy_preempt_triggered(pss->block->idstr, pss->page); - - /* - * Time to preempt precopy. Cache current PSS into preempt state, so t= hat - * after handling the postcopy pages we can recover to it. We need to= do - * so because the dest VM will have partial of the precopy huge page k= ept - * over in its tmp huge page caches; better move on with it when we ca= n. - */ - p_state->ram_block =3D pss->block; - p_state->ram_page =3D pss->page; - p_state->preempted =3D true; -} - -/* Whether we're preempted by a postcopy request during sending a huge pag= e */ -static bool postcopy_preempt_triggered(RAMState *rs) -{ - return rs->postcopy_preempt_state.preempted; -} - -static void postcopy_preempt_restore(RAMState *rs, PageSearchStatus *pss, - bool postcopy_requested) -{ - PostcopyPreemptState *state =3D &rs->postcopy_preempt_state; - - assert(state->preempted); - - pss->block =3D state->ram_block; - pss->page =3D state->ram_page; - - /* Whether this is a postcopy request? */ - pss->postcopy_requested =3D postcopy_requested; - /* - * When restoring a preempted page, the old data resides in PRECOPY - * slow channel, even if postcopy_requested is set. So always use - * PRECOPY channel here. - */ - pss->postcopy_target_channel =3D RAM_CHANNEL_PRECOPY; - - trace_postcopy_preempt_restored(pss->block->idstr, pss->page); - - /* Reset preempt state, most importantly, set preempted=3D=3Dfalse */ - postcopy_preempt_reset(rs); -} - -static void postcopy_preempt_choose_channel(RAMState *rs, PageSearchStatus= *pss) -{ - MigrationState *s =3D migrate_get_current(); - unsigned int channel =3D pss->postcopy_target_channel; - QEMUFile *next; - - if (channel !=3D rs->postcopy_channel) { - if (channel =3D=3D RAM_CHANNEL_PRECOPY) { - next =3D s->to_dst_file; - } else { - next =3D s->postcopy_qemufile_src; - } - /* Update and cache the current channel */ - rs->f =3D next; - rs->postcopy_channel =3D channel; - - /* - * If channel switched, reset last_sent_block since the old sent b= lock - * may not be on the same channel. - */ - pss->last_sent_block =3D NULL; - - trace_postcopy_preempt_switch_channel(channel); - } - - trace_postcopy_preempt_send_host_page(pss->block->idstr, pss->page); -} - -/* We need to make sure rs->f always points to the default channel elsewhe= re */ -static void postcopy_preempt_reset_channel(RAMState *rs) -{ - if (postcopy_preempt_active()) { - rs->postcopy_channel =3D RAM_CHANNEL_PRECOPY; - rs->f =3D migrate_get_current()->to_dst_file; - trace_postcopy_preempt_reset_channel(); - } -} - /* Should be called before sending a host page */ static void pss_host_page_prepare(PageSearchStatus *pss) { @@ -2688,11 +2440,6 @@ static int ram_save_host_page(RAMState *rs, PageSear= chStatus *pss) pss_host_page_prepare(pss); =20 do { - if (postcopy_needs_preempt(rs, pss)) { - postcopy_do_preempt(rs, pss); - break; - } - page_dirty =3D migration_bitmap_clear_dirty(rs, pss->block, pss->p= age); =20 /* Check the pages is dirty and if it is send it */ @@ -2733,19 +2480,6 @@ static int ram_save_host_page(RAMState *rs, PageSear= chStatus *pss) =20 pss_host_page_finish(pss); =20 - /* - * When with postcopy preempt mode, flush the data as soon as possible= for - * postcopy requests, because we've already sent a whole huge page, so= the - * dst node should already have enough resource to atomically filling = in - * the current missing page. - * - * More importantly, when using separate postcopy channel, we must do - * explicit flush or it won't flush until the buffer is full. - */ - if (migrate_postcopy_preempt() && pss->postcopy_requested) { - qemu_fflush(pss->pss_channel); - } - res =3D ram_save_release_protection(rs, pss, start_page); return (res < 0 ? res : pages); } @@ -2793,24 +2527,11 @@ static int ram_find_and_save_block(RAMState *rs) found =3D get_queued_page(rs, pss); =20 if (!found) { - /* - * Recover previous precopy ramblock/offset if postcopy has - * preempted precopy. Otherwise find the next dirty bit. - */ - if (postcopy_preempt_triggered(rs)) { - postcopy_preempt_restore(rs, pss, false); - found =3D true; - } else { - /* priority queue empty, so just search for something dirt= y */ - found =3D find_dirty_block(rs, pss, &again); - } + /* priority queue empty, so just search for something dirty */ + found =3D find_dirty_block(rs, pss, &again); } =20 if (found) { - /* Update rs->f with correct channel */ - if (postcopy_preempt_active()) { - postcopy_preempt_choose_channel(rs, pss); - } /* Cache rs->f in pss_channel (TODO: remove rs->f) */ pss->pss_channel =3D rs->f; pages =3D ram_save_host_page(rs, pss); @@ -2942,8 +2663,6 @@ static void ram_state_reset(RAMState *rs) rs->last_page =3D 0; rs->last_version =3D ram_list.version; rs->xbzrle_enabled =3D false; - postcopy_preempt_reset(rs); - rs->postcopy_channel =3D RAM_CHANNEL_PRECOPY; } =20 #define MAX_WAIT 50 /* ms, half buffered_file limit */ @@ -3587,8 +3306,6 @@ static int ram_save_iterate(QEMUFile *f, void *opaque) } qemu_mutex_unlock(&rs->bitmap_mutex); =20 - postcopy_preempt_reset_channel(rs); - /* * Must occur before EOS (or any QEMUFile operation) * because of RDMA protocol. @@ -3668,8 +3385,6 @@ static int ram_save_complete(QEMUFile *f, void *opaqu= e) return ret; } =20 - postcopy_preempt_reset_channel(rs); - ret =3D multifd_send_sync_main(rs->f); if (ret < 0) { return ret; --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670234860; cv=none; d=zohomail.com; s=zohoarc; b=nspdhf1ndOkMeJj+zZgTv1xpmtrhtyqzxY48D9vdx7uW+kxg3YOKBgLnnJ/Cj4sij+3ohgto8hlHdFG1UZ7RGZMxc8rKlauLo+PC4bEai+fl7JOqSrkJd08YSgIILkRi0ZGp1WLntLUNbdb6DmcyEtwhkbNi3CvB68yFf9Fhs/4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670234860; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=W+GlhHy1Aw+J2S/PdKkSiWceIYryK6JZft0nwXoxTSo=; b=kKr4sqy6C9Yn/Bb8bmme3F2By9pJd71jzJcGgtb5ltllfPDgyP0cJRdwGwOw8lLw9WA0jNLlrLS6HTKcHmwVfZLCZMwyLwMtQTfqeoNrKFAsGkuzSzcWD7AKkn4sLwFK4O764h3EJyvAxrgDxFD/qt3FnvdFU1+SrDUOxuxV2Sk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670234860489131.42325815040772; Mon, 5 Dec 2022 02:07:40 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28GJ-00072a-Jt; Mon, 05 Dec 2022 04:59:47 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28FO-0006cg-Ic for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:58:52 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28FL-00089f-DL for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:58:50 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-216-LGkLmgsSPPuNhex4gBBa8g-1; Mon, 05 Dec 2022 04:58:41 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 1D39F811E67; Mon, 5 Dec 2022 09:58:40 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id A9C242166B29; Mon, 5 Dec 2022 09:58:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234326; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=W+GlhHy1Aw+J2S/PdKkSiWceIYryK6JZft0nwXoxTSo=; b=E+0cCrxkzVSPqA/nNqk7ZIKIbrD9SM1LrP2YqQoIdiNp/NPR8XUYv8xS/wHy+Hr00HpaK/ VEseVrOT6gnlwph2PhjTNoeSsRkLl0N+7hYO5vbAg+LUONdtdnM3lhJUiuPbp/aababTjs UnbWCox6P5sphchQpFUo678bQtlShH8= X-MC-Unique: LGkLmgsSPPuNhex4gBBa8g-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz , Peter Xu Subject: [PATCH v2 46/51] migration: Drop rs->f Date: Mon, 5 Dec 2022 10:52:23 +0100 Message-Id: <20221205095228.1314-47-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670234861227100001 Content-Type: text/plain; charset="utf-8" From: Peter Xu Now with rs->pss we can already cache channels in pss->pss_channels. That pss_channel contains more infromation than rs->f because it's per-channel. So rs->f could be replaced by rss->pss[RAM_CHANNEL_PRECOPY].pss_channel, while rs->f itself is a bit vague now. Note that vanilla postcopy still send pages via pss[RAM_CHANNEL_PRECOPY], that's slightly confusing but it reflects the reality. Then, after the replacement we can safely drop rs->f. Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Peter Xu Reviewed-by: Juan Quintela Signed-off-by: Juan Quintela --- migration/ram.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index 1ae093fb61..334309f1c6 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -323,8 +323,6 @@ struct RAMSrcPageRequest { =20 /* State of RAM for migration */ struct RAMState { - /* QEMUFile used for this migration */ - QEMUFile *f; /* * PageSearchStatus structures for the channels when send pages. * Protected by the bitmap_mutex. @@ -2532,8 +2530,6 @@ static int ram_find_and_save_block(RAMState *rs) } =20 if (found) { - /* Cache rs->f in pss_channel (TODO: remove rs->f) */ - pss->pss_channel =3D rs->f; pages =3D ram_save_host_page(rs, pss); } } while (!pages && again); @@ -3089,7 +3085,7 @@ static void ram_state_resume_prepare(RAMState *rs, QE= MUFile *out) ram_state_reset(rs); =20 /* Update RAMState cache of output QEMUFile */ - rs->f =3D out; + rs->pss[RAM_CHANNEL_PRECOPY].pss_channel =3D out; =20 trace_ram_state_resume_prepare(pages); } @@ -3180,7 +3176,7 @@ static int ram_save_setup(QEMUFile *f, void *opaque) return -1; } } - (*rsp)->f =3D f; + (*rsp)->pss[RAM_CHANNEL_PRECOPY].pss_channel =3D f; =20 WITH_RCU_READ_LOCK_GUARD() { qemu_put_be64(f, ram_bytes_total_common(true) | RAM_SAVE_FLAG_MEM_= SIZE); @@ -3315,7 +3311,7 @@ static int ram_save_iterate(QEMUFile *f, void *opaque) out: if (ret >=3D 0 && migration_is_setup_or_active(migrate_get_current()->state)) { - ret =3D multifd_send_sync_main(rs->f); + ret =3D multifd_send_sync_main(rs->pss[RAM_CHANNEL_PRECOPY].pss_ch= annel); if (ret < 0) { return ret; } @@ -3385,7 +3381,7 @@ static int ram_save_complete(QEMUFile *f, void *opaqu= e) return ret; } =20 - ret =3D multifd_send_sync_main(rs->f); + ret =3D multifd_send_sync_main(rs->pss[RAM_CHANNEL_PRECOPY].pss_channe= l); if (ret < 0) { return ret; } --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670234783; cv=none; d=zohomail.com; s=zohoarc; b=nCQgMZnz8XDLMJVEHwCs8Reh2Vu1vxErLfO7v8/CxauWHKGq3gWW6gN5inQiDKtfQ8IYAbJ5ZZQ0A0BpNs1sunkYnXn5lbxvaKhquRko1VCV9RFZh08dsPurMXKlHR6IrOBCegQmTOvBY+cLVhL7Eel0dhUEN6nV+ErIgcTRM18= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670234783; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=C6XWOsHzVK+1xN5Bn4dqmNKOe+moJvckLNMR3xiKGq8=; b=ROkzG77IfaijawCYpr60XYXwBjwMbQHMmGPO48Zy9MRI3gGkrbFx2w9bDgRcgJWg22YGwE+G9fEFmMT/VGou7dyNmZYzIZORwBKt9DC2H0YoaZMBuYjqhJ33xFdgulfOqo3cJ1dFVBo3ff4ryxvHXN4Hhys2Vh1TJwivSshmMM8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670234783701737.1967922986686; Mon, 5 Dec 2022 02:06:23 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28FV-0006hj-IE; Mon, 05 Dec 2022 04:58:57 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28FT-0006dt-AO for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:58:56 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28FR-0008Aq-AQ for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:58:55 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-20-Yx8ZJmEVNZaI263buHngxQ-1; Mon, 05 Dec 2022 04:58:48 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id ADB32800186; Mon, 5 Dec 2022 09:58:47 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6B8AF2166B29; Mon, 5 Dec 2022 09:58:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234332; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=C6XWOsHzVK+1xN5Bn4dqmNKOe+moJvckLNMR3xiKGq8=; b=PhU1DPPCSeO+xIPmH+BGZVvXiGMr/C5GJ6mzb01vOKBJce/lrYAHncxlwc8sEsgjfOU4RV QDBClpxxkMlVrvgCo5JebfEp6nLcs4UpxbdBv+oYUs252s+NkcUG8gs4qI/f9JuA0wLE+z XWNZeoSboCkYLTocNzgGnQVD4y149LY= X-MC-Unique: Yx8ZJmEVNZaI263buHngxQ-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz Subject: [PATCH v2 47/51] migration: Remove res_compatible parameter Date: Mon, 5 Dec 2022 10:52:24 +0100 Message-Id: <20221205095228.1314-48-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670234784973100001 Content-Type: text/plain; charset="utf-8" It was only used for RAM, and in that case, it means that this amount of data was sent for memory. Just delete the field in all callers. Signed-off-by: Juan Quintela --- include/migration/register.h | 20 ++++++++++---------- migration/savevm.h | 4 +--- hw/s390x/s390-stattrib.c | 6 ++---- hw/vfio/migration.c | 10 ++++------ migration/block-dirty-bitmap.c | 7 +++---- migration/block.c | 7 +++---- migration/migration.c | 9 ++++----- migration/ram.c | 8 +++----- migration/savevm.c | 14 +++++--------- hw/vfio/trace-events | 2 +- migration/trace-events | 2 +- 11 files changed, 37 insertions(+), 52 deletions(-) diff --git a/include/migration/register.h b/include/migration/register.h index c1dcff0f90..1950fee6a8 100644 --- a/include/migration/register.h +++ b/include/migration/register.h @@ -48,18 +48,18 @@ typedef struct SaveVMHandlers { int (*save_setup)(QEMUFile *f, void *opaque); void (*save_live_pending)(QEMUFile *f, void *opaque, uint64_t threshold_size, - uint64_t *res_precopy_only, - uint64_t *res_compatible, - uint64_t *res_postcopy_only); + uint64_t *rest_precopy, + uint64_t *rest_postcopy); /* Note for save_live_pending: - * - res_precopy_only is for data which must be migrated in precopy ph= ase - * or in stopped state, in other words - before target vm start - * - res_compatible is for data which may be migrated in any phase - * - res_postcopy_only is for data which must be migrated in postcopy = phase - * or in stopped state, in other words - after source vm stop + * - res_precopy is for data which must be migrated in precopy + * phase or in stopped state, in other words - before target + * vm start + * - res_postcopy is for data which must be migrated in postcopy + * phase or in stopped state, in other words - after source vm + * stop * - * Sum of res_postcopy_only, res_compatible and res_postcopy_only is t= he - * whole amount of pending data. + * Sum of res_precopy and res_postcopy is the whole amount of + * pending data. */ =20 =20 diff --git a/migration/savevm.h b/migration/savevm.h index 6461342cb4..9bd55c336c 100644 --- a/migration/savevm.h +++ b/migration/savevm.h @@ -41,9 +41,7 @@ void qemu_savevm_state_complete_postcopy(QEMUFile *f); int qemu_savevm_state_complete_precopy(QEMUFile *f, bool iterable_only, bool inactivate_disks); void qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size, - uint64_t *res_precopy_only, - uint64_t *res_compatible, - uint64_t *res_postcopy_only); + uint64_t *res_precopy, uint64_t *res_postco= py); void qemu_savevm_send_ping(QEMUFile *f, uint32_t value); void qemu_savevm_send_open_return_path(QEMUFile *f); int qemu_savevm_send_packaged(QEMUFile *f, const uint8_t *buf, size_t len); diff --git a/hw/s390x/s390-stattrib.c b/hw/s390x/s390-stattrib.c index 9eda1c3b2a..ee60b53da4 100644 --- a/hw/s390x/s390-stattrib.c +++ b/hw/s390x/s390-stattrib.c @@ -183,16 +183,14 @@ static int cmma_save_setup(QEMUFile *f, void *opaque) } =20 static void cmma_save_pending(QEMUFile *f, void *opaque, uint64_t max_size, - uint64_t *res_precopy_only, - uint64_t *res_compatible, - uint64_t *res_postcopy_only) + uint64_t *res_precopy, uint64_t *res_postcop= y) { S390StAttribState *sas =3D S390_STATTRIB(opaque); S390StAttribClass *sac =3D S390_STATTRIB_GET_CLASS(sas); long long res =3D sac->get_dirtycount(sas); =20 if (res >=3D 0) { - *res_precopy_only +=3D res; + *res_precopy +=3D res; } } =20 diff --git a/hw/vfio/migration.c b/hw/vfio/migration.c index c74453e0b5..d03681678d 100644 --- a/hw/vfio/migration.c +++ b/hw/vfio/migration.c @@ -458,9 +458,8 @@ static void vfio_save_cleanup(void *opaque) =20 static void vfio_save_pending(QEMUFile *f, void *opaque, uint64_t threshold_size, - uint64_t *res_precopy_only, - uint64_t *res_compatible, - uint64_t *res_postcopy_only) + uint64_t *res_precopy, + uint64_t *res_postcopy) { VFIODevice *vbasedev =3D opaque; VFIOMigration *migration =3D vbasedev->migration; @@ -471,10 +470,9 @@ static void vfio_save_pending(QEMUFile *f, void *opaqu= e, return; } =20 - *res_precopy_only +=3D migration->pending_bytes; + *res_precopy +=3D migration->pending_bytes; =20 - trace_vfio_save_pending(vbasedev->name, *res_precopy_only, - *res_postcopy_only, *res_compatible); + trace_vfio_save_pending(vbasedev->name, *res_precopy, *res_postcopy); } =20 static int vfio_save_iterate(QEMUFile *f, void *opaque) diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c index 9aba7d9c22..dfea546330 100644 --- a/migration/block-dirty-bitmap.c +++ b/migration/block-dirty-bitmap.c @@ -763,9 +763,8 @@ static int dirty_bitmap_save_complete(QEMUFile *f, void= *opaque) =20 static void dirty_bitmap_save_pending(QEMUFile *f, void *opaque, uint64_t max_size, - uint64_t *res_precopy_only, - uint64_t *res_compatible, - uint64_t *res_postcopy_only) + uint64_t *res_precopy, + uint64_t *res_postcopy) { DBMSaveState *s =3D &((DBMState *)opaque)->save; SaveBitmapState *dbms; @@ -785,7 +784,7 @@ static void dirty_bitmap_save_pending(QEMUFile *f, void= *opaque, =20 trace_dirty_bitmap_save_pending(pending, max_size); =20 - *res_postcopy_only +=3D pending; + *res_postcopy +=3D pending; } =20 /* First occurrence of this bitmap. It should be created if doesn't exist = */ diff --git a/migration/block.c b/migration/block.c index 4347da1526..593754c38c 100644 --- a/migration/block.c +++ b/migration/block.c @@ -863,9 +863,8 @@ static int block_save_complete(QEMUFile *f, void *opaqu= e) } =20 static void block_save_pending(QEMUFile *f, void *opaque, uint64_t max_siz= e, - uint64_t *res_precopy_only, - uint64_t *res_compatible, - uint64_t *res_postcopy_only) + uint64_t *res_precopy, + uint64_t *res_postcopy) { /* Estimate pending number of bytes to send */ uint64_t pending; @@ -886,7 +885,7 @@ static void block_save_pending(QEMUFile *f, void *opaqu= e, uint64_t max_size, =20 trace_migration_block_save_pending(pending); /* We don't do postcopy */ - *res_precopy_only +=3D pending; + *res_precopy +=3D pending; } =20 static int block_load(QEMUFile *f, void *opaque, int version_id) diff --git a/migration/migration.c b/migration/migration.c index c3490c495d..6b8a6dd74e 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -3756,15 +3756,14 @@ typedef enum { */ static MigIterateState migration_iteration_run(MigrationState *s) { - uint64_t pending_size, pend_pre, pend_compat, pend_post; + uint64_t pending_size, pend_pre, pend_post; bool in_postcopy =3D s->state =3D=3D MIGRATION_STATUS_POSTCOPY_ACTIVE; =20 qemu_savevm_state_pending(s->to_dst_file, s->threshold_size, &pend_pre, - &pend_compat, &pend_post); - pending_size =3D pend_pre + pend_compat + pend_post; + &pend_post); + pending_size =3D pend_pre + pend_post; =20 - trace_migrate_pending(pending_size, s->threshold_size, - pend_pre, pend_compat, pend_post); + trace_migrate_pending(pending_size, s->threshold_size, pend_pre, pend_= post); =20 if (pending_size && pending_size >=3D s->threshold_size) { /* Still a significant amount to transfer */ diff --git a/migration/ram.c b/migration/ram.c index 334309f1c6..640839dcee 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -3393,9 +3393,7 @@ static int ram_save_complete(QEMUFile *f, void *opaqu= e) } =20 static void ram_save_pending(QEMUFile *f, void *opaque, uint64_t max_size, - uint64_t *res_precopy_only, - uint64_t *res_compatible, - uint64_t *res_postcopy_only) + uint64_t *res_precopy, uint64_t *res_postcopy) { RAMState **temp =3D opaque; RAMState *rs =3D *temp; @@ -3415,9 +3413,9 @@ static void ram_save_pending(QEMUFile *f, void *opaqu= e, uint64_t max_size, =20 if (migrate_postcopy_ram()) { /* We can do postcopy, and all the data is postcopiable */ - *res_compatible +=3D remaining_size; + *res_postcopy +=3D remaining_size; } else { - *res_precopy_only +=3D remaining_size; + *res_precopy +=3D remaining_size; } } =20 diff --git a/migration/savevm.c b/migration/savevm.c index a0cdb714f7..4d02887f25 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -1472,16 +1472,13 @@ flush: * for units that can't do postcopy. */ void qemu_savevm_state_pending(QEMUFile *f, uint64_t threshold_size, - uint64_t *res_precopy_only, - uint64_t *res_compatible, - uint64_t *res_postcopy_only) + uint64_t *res_precopy, + uint64_t *res_postcopy) { SaveStateEntry *se; =20 - *res_precopy_only =3D 0; - *res_compatible =3D 0; - *res_postcopy_only =3D 0; - + *res_precopy =3D 0; + *res_postcopy =3D 0; =20 QTAILQ_FOREACH(se, &savevm_state.handlers, entry) { if (!se->ops || !se->ops->save_live_pending) { @@ -1493,8 +1490,7 @@ void qemu_savevm_state_pending(QEMUFile *f, uint64_t = threshold_size, } } se->ops->save_live_pending(f, se->opaque, threshold_size, - res_precopy_only, res_compatible, - res_postcopy_only); + res_precopy, res_postcopy); } } =20 diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events index 73dffe9e00..a21cbd2a56 100644 --- a/hw/vfio/trace-events +++ b/hw/vfio/trace-events @@ -157,7 +157,7 @@ vfio_save_cleanup(const char *name) " (%s)" vfio_save_buffer(const char *name, uint64_t data_offset, uint64_t data_siz= e, uint64_t pending) " (%s) Offset 0x%"PRIx64" size 0x%"PRIx64" pending 0x%= "PRIx64 vfio_update_pending(const char *name, uint64_t pending) " (%s) pending 0x%= "PRIx64 vfio_save_device_config_state(const char *name) " (%s)" -vfio_save_pending(const char *name, uint64_t precopy, uint64_t postcopy, u= int64_t compatible) " (%s) precopy 0x%"PRIx64" postcopy 0x%"PRIx64" compati= ble 0x%"PRIx64 +vfio_save_pending(const char *name, uint64_t precopy, uint64_t postcopy) "= (%s) precopy 0x%"PRIx64" postcopy 0x%"PRIx64 vfio_save_iterate(const char *name, int data_size) " (%s) data_size %d" vfio_save_complete_precopy(const char *name) " (%s)" vfio_load_device_config_state(const char *name) " (%s)" diff --git a/migration/trace-events b/migration/trace-events index 57003edcbd..f2a873fd6c 100644 --- a/migration/trace-events +++ b/migration/trace-events @@ -150,7 +150,7 @@ migrate_fd_cleanup(void) "" migrate_fd_error(const char *error_desc) "error=3D%s" migrate_fd_cancel(void) "" migrate_handle_rp_req_pages(const char *rbname, size_t start, size_t len) = "in %s at 0x%zx len 0x%zx" -migrate_pending(uint64_t size, uint64_t max, uint64_t pre, uint64_t compat= , uint64_t post) "pending size %" PRIu64 " max %" PRIu64 " (pre =3D %" PRIu= 64 " compat=3D%" PRIu64 " post=3D%" PRIu64 ")" +migrate_pending(uint64_t size, uint64_t max, uint64_t pre, uint64_t post) = "pending size %" PRIu64 " max %" PRIu64 " (pre =3D %" PRIu64 " post=3D%" PR= Iu64 ")" migrate_send_rp_message(int msg_type, uint16_t len) "%d: len %d" migrate_send_rp_recv_bitmap(char *name, int64_t size) "block '%s' size 0x%= "PRIi64 migration_completion_file_err(void) "" --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670236870; cv=none; d=zohomail.com; s=zohoarc; b=ImlbspX6z4FtGLTVxrTesMZdcJcwAE0nhZp0+hNnfcb6BRfuEMe/Yi7NQjoJrWrPenZCOlaUsaQ8L4oqK9dwdPR3Gb76D1AvRsLVKyO4fl21RQgibZ37T1vrgdQgXyVEWqUT+IzLKCFcj29wlnGqzbQeg2mkiQckdTTlBOcl96U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670236870; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=w2uvfZXXJ9nxYpqnVRQpkPADHauD+tdAxAPNOq1F1P4=; b=H9sYpHgc1Rx/yt7Vc91ru/UNnxVvNXlEpFAFFn/BW0jnVJeLw63Swqph2NnDyYonmEZyLi6NkYV7DGQdAdrVeMdVeooUSebtxxj1jg2hm164oaq79wOG0WtUiRKIJukBBjEHnYZ0YtCXPsP9kOSv76srWMeAlI3/xwOyq+CgsGQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670236870439371.63362951526676; Mon, 5 Dec 2022 02:41:10 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28GL-00076Q-Ir; Mon, 05 Dec 2022 04:59:49 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28G3-0006vg-2n for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:59:39 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28Fn-0008E9-PN for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:59:20 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-584-VLiUXFFROyuF7R1pA9Sadg-1; Mon, 05 Dec 2022 04:58:56 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 4871C101A528; Mon, 5 Dec 2022 09:58:55 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0F81C2166B29; Mon, 5 Dec 2022 09:58:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234346; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=w2uvfZXXJ9nxYpqnVRQpkPADHauD+tdAxAPNOq1F1P4=; b=f06YZT4/Hgy+SBsyyOBMFQvgLboKR1BExsIAMNdTwPIjzdx70l/mAh2FUK0XYPDTO8pqTT PQwZY165tcndhtEUdji8NieyIkRaOlNfQxqpJUM3Bekb7tGyShDM5UU2a7P74ocuORJai2 5IX27sePwPRsITKGANIkJpKDyKyc6lQ= X-MC-Unique: VLiUXFFROyuF7R1pA9Sadg-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz Subject: [PATCH v2 48/51] migration: No save_live_pending() method uses the QEMUFile parameter Date: Mon, 5 Dec 2022 10:52:25 +0100 Message-Id: <20221205095228.1314-49-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670236871211100001 Content-Type: text/plain; charset="utf-8" So remove it everywhere. Signed-off-by: Juan Quintela Reviewed-by: Dr. David Alan Gilbert --- include/migration/register.h | 6 ++---- migration/savevm.h | 2 +- hw/s390x/s390-stattrib.c | 2 +- hw/vfio/migration.c | 6 ++---- migration/block-dirty-bitmap.c | 5 ++--- migration/block.c | 2 +- migration/migration.c | 3 +-- migration/ram.c | 2 +- migration/savevm.c | 5 ++--- 9 files changed, 13 insertions(+), 20 deletions(-) diff --git a/include/migration/register.h b/include/migration/register.h index 1950fee6a8..5b5424ed8f 100644 --- a/include/migration/register.h +++ b/include/migration/register.h @@ -46,10 +46,8 @@ typedef struct SaveVMHandlers { =20 /* This runs outside the iothread lock! */ int (*save_setup)(QEMUFile *f, void *opaque); - void (*save_live_pending)(QEMUFile *f, void *opaque, - uint64_t threshold_size, - uint64_t *rest_precopy, - uint64_t *rest_postcopy); + void (*save_live_pending)(void *opaque, uint64_t threshold_size, + uint64_t *rest_precopy, uint64_t *rest_postc= opy); /* Note for save_live_pending: * - res_precopy is for data which must be migrated in precopy * phase or in stopped state, in other words - before target diff --git a/migration/savevm.h b/migration/savevm.h index 9bd55c336c..98fae6f9b3 100644 --- a/migration/savevm.h +++ b/migration/savevm.h @@ -40,7 +40,7 @@ void qemu_savevm_state_cleanup(void); void qemu_savevm_state_complete_postcopy(QEMUFile *f); int qemu_savevm_state_complete_precopy(QEMUFile *f, bool iterable_only, bool inactivate_disks); -void qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size, +void qemu_savevm_state_pending(uint64_t max_size, uint64_t *res_precopy, uint64_t *res_postco= py); void qemu_savevm_send_ping(QEMUFile *f, uint32_t value); void qemu_savevm_send_open_return_path(QEMUFile *f); diff --git a/hw/s390x/s390-stattrib.c b/hw/s390x/s390-stattrib.c index ee60b53da4..9b74eeadf3 100644 --- a/hw/s390x/s390-stattrib.c +++ b/hw/s390x/s390-stattrib.c @@ -182,7 +182,7 @@ static int cmma_save_setup(QEMUFile *f, void *opaque) return 0; } =20 -static void cmma_save_pending(QEMUFile *f, void *opaque, uint64_t max_size, +static void cmma_save_pending(void *opaque, uint64_t max_size, uint64_t *res_precopy, uint64_t *res_postcop= y) { S390StAttribState *sas =3D S390_STATTRIB(opaque); diff --git a/hw/vfio/migration.c b/hw/vfio/migration.c index d03681678d..8ae1bd31a8 100644 --- a/hw/vfio/migration.c +++ b/hw/vfio/migration.c @@ -456,10 +456,8 @@ static void vfio_save_cleanup(void *opaque) trace_vfio_save_cleanup(vbasedev->name); } =20 -static void vfio_save_pending(QEMUFile *f, void *opaque, - uint64_t threshold_size, - uint64_t *res_precopy, - uint64_t *res_postcopy) +static void vfio_save_pending(void *opaque, uint64_t threshold_size, + uint64_t *res_precopy, uint64_t *res_postcop= y) { VFIODevice *vbasedev =3D opaque; VFIOMigration *migration =3D vbasedev->migration; diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c index dfea546330..a445bdc3c3 100644 --- a/migration/block-dirty-bitmap.c +++ b/migration/block-dirty-bitmap.c @@ -761,9 +761,8 @@ static int dirty_bitmap_save_complete(QEMUFile *f, void= *opaque) return 0; } =20 -static void dirty_bitmap_save_pending(QEMUFile *f, void *opaque, - uint64_t max_size, - uint64_t *res_precopy, +static void dirty_bitmap_save_pending(void *opaque, uint64_t max_size, + uint64_t *res_precopy,=20 uint64_t *res_postcopy) { DBMSaveState *s =3D &((DBMState *)opaque)->save; diff --git a/migration/block.c b/migration/block.c index 593754c38c..39ce4003c6 100644 --- a/migration/block.c +++ b/migration/block.c @@ -862,7 +862,7 @@ static int block_save_complete(QEMUFile *f, void *opaqu= e) return 0; } =20 -static void block_save_pending(QEMUFile *f, void *opaque, uint64_t max_siz= e, +static void block_save_pending(void *opaque, uint64_t max_size, uint64_t *res_precopy, uint64_t *res_postcopy) { diff --git a/migration/migration.c b/migration/migration.c index 6b8a6dd74e..a75a281635 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -3759,8 +3759,7 @@ static MigIterateState migration_iteration_run(Migrat= ionState *s) uint64_t pending_size, pend_pre, pend_post; bool in_postcopy =3D s->state =3D=3D MIGRATION_STATUS_POSTCOPY_ACTIVE; =20 - qemu_savevm_state_pending(s->to_dst_file, s->threshold_size, &pend_pre, - &pend_post); + qemu_savevm_state_pending(s->threshold_size, &pend_pre, &pend_post); pending_size =3D pend_pre + pend_post; =20 trace_migrate_pending(pending_size, s->threshold_size, pend_pre, pend_= post); diff --git a/migration/ram.c b/migration/ram.c index 640839dcee..63cb6544e5 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -3392,7 +3392,7 @@ static int ram_save_complete(QEMUFile *f, void *opaqu= e) return 0; } =20 -static void ram_save_pending(QEMUFile *f, void *opaque, uint64_t max_size, +static void ram_save_pending(void *opaque, uint64_t max_size, uint64_t *res_precopy, uint64_t *res_postcopy) { RAMState **temp =3D opaque; diff --git a/migration/savevm.c b/migration/savevm.c index 4d02887f25..9ddcbba4e3 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -1471,8 +1471,7 @@ flush: * the result is split into the amount for units that can and * for units that can't do postcopy. */ -void qemu_savevm_state_pending(QEMUFile *f, uint64_t threshold_size, - uint64_t *res_precopy, +void qemu_savevm_state_pending(uint64_t threshold_size, uint64_t *res_prec= opy, uint64_t *res_postcopy) { SaveStateEntry *se; @@ -1489,7 +1488,7 @@ void qemu_savevm_state_pending(QEMUFile *f, uint64_t = threshold_size, continue; } } - se->ops->save_live_pending(f, se->opaque, threshold_size, + se->ops->save_live_pending(se->opaque, threshold_size, res_precopy, res_postcopy); } } --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670236621; cv=none; d=zohomail.com; s=zohoarc; b=hi/s+rTGtxixKPOqSR8eKm5ZoiXrYfqrMepfLw+4wNn9z/eGeNfTA1N9lqtI8XsCHEaKYy8ZAwWnXWkglR1c8MJqGmvLus8UBaRjnCCymbxLg2NxzAU/cPg1Zsz75ggQCMKbnHzn7YrVUF+QCiFrCxxUA8/AQmrH+t3NO/dYYF4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670236621; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=t7GhRVRuk4w6kxgY8TKB2tB0RQJE/YUQTwti6mwv/VQ=; b=OSzjncwm+saAIFmWna6aX9lIKiNM10IJfbdDMCWauC2ksBjbwAPyuXkMcvkAWdJy8UmWtALxJ3MaetIcfIEvDCrqBUlT9IQzhLlNDt1mrAC3RXqntPCTRUNWC6EVPv97Mzd6bVZ1ZHgyMF8bZCvQieR3/G5ERGrdfyfY9wwZkVQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670236621612526.7445874370363; Mon, 5 Dec 2022 02:37:01 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28GN-00079f-8k; Mon, 05 Dec 2022 04:59:51 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28GD-0006zH-IW for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:59:42 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28G3-0008Ei-DC for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:59:37 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-28-j88G3rdaPEiEPc_baIl7Cw-1; Mon, 05 Dec 2022 04:59:04 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id D5020800B23; Mon, 5 Dec 2022 09:59:02 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9E2EC2166B29; Mon, 5 Dec 2022 09:58:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234349; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=t7GhRVRuk4w6kxgY8TKB2tB0RQJE/YUQTwti6mwv/VQ=; b=bBnt/qjoS/0+o6M+yQlieOmM7qH6U4haoNd2t0Jg+IN9WoCq872P8mUmhCwFurYvCfkFKB soKt0Vh5j1COAXTSp9UJrl9lg+WV0PY2PwOMeSDWZPXAn8uTbU7VYBeLytoi0sAfHVYBUD yGnhc+1DBp096PPXN0PEz4OBd+zKTo4= X-MC-Unique: j88G3rdaPEiEPc_baIl7Cw-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz Subject: [PATCH v2 49/51] migration: Split save_live_pending() into state_pending_* Date: Mon, 5 Dec 2022 10:52:26 +0100 Message-Id: <20221205095228.1314-50-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670236622150100001 Content-Type: text/plain; charset="utf-8" We split the function into to: - state_pending_estimate: We estimate the remaining state size without stopping the machine. - state pending_exact: We calculate the exact amount of remaining state. The only "device" that implements different functions for _estimate() and _exact() is ram. Signed-off-by: Juan Quintela Reviewed-by: Dr. David Alan Gilbert --- docs/devel/migration.rst | 18 ++++++++++-------- docs/devel/vfio-migration.rst | 4 ++-- include/migration/register.h | 12 ++++++++---- migration/savevm.h | 8 ++++++-- hw/s390x/s390-stattrib.c | 7 ++++--- hw/vfio/migration.c | 9 +++++---- migration/block-dirty-bitmap.c | 11 ++++++----- migration/block.c | 11 ++++++----- migration/migration.c | 13 +++++++++---- migration/ram.c | 31 ++++++++++++++++++++++++------- migration/savevm.c | 34 +++++++++++++++++++++++++++++----- hw/vfio/trace-events | 2 +- migration/trace-events | 7 ++++--- 13 files changed, 114 insertions(+), 53 deletions(-) diff --git a/docs/devel/migration.rst b/docs/devel/migration.rst index 3e9656d8e0..6f65c23b47 100644 --- a/docs/devel/migration.rst +++ b/docs/devel/migration.rst @@ -482,15 +482,17 @@ An iterative device must provide: - A ``load_setup`` function that initialises the data structures on the destination. =20 - - A ``save_live_pending`` function that is called repeatedly and must - indicate how much more data the iterative data must save. The core - migration code will use this to determine when to pause the CPUs - and complete the migration. + - A ``state_pending_exact`` function that indicates how much more + data we must save. The core migration code will use this to + determine when to pause the CPUs and complete the migration. =20 - - A ``save_live_iterate`` function (called after ``save_live_pending`` - when there is significant data still to be sent). It should send - a chunk of data until the point that stream bandwidth limits tell it - to stop. Each call generates one section. + - A ``state_pending_estimate`` function that indicates how much more + data we must save. When the estimated amount is smaller than the + threshold, we call ``state_pending_exact``. + + - A ``save_live_iterate`` function should send a chunk of data until + the point that stream bandwidth limits tell it to stop. Each call + generates one section. =20 - A ``save_live_complete_precopy`` function that must transmit the last section for the device containing any remaining data. diff --git a/docs/devel/vfio-migration.rst b/docs/devel/vfio-migration.rst index 9ff6163c88..673057c90d 100644 --- a/docs/devel/vfio-migration.rst +++ b/docs/devel/vfio-migration.rst @@ -28,7 +28,7 @@ VFIO implements the device hooks for the iterative approa= ch as follows: * A ``load_setup`` function that sets up the migration region on the destination and sets _RESUMING flag in the VFIO device state. =20 -* A ``save_live_pending`` function that reads pending_bytes from the vendor +* A ``state_pending_exact`` function that reads pending_bytes from the ven= dor driver, which indicates the amount of data that the vendor driver has ye= t to save for the VFIO device. =20 @@ -114,7 +114,7 @@ Live migration save path (RUNNING, _SETUP, _RUNNING|_SAVING) | (RUNNING, _ACTIVE, _RUNNING|_SAVING) - If device is active, get pending_bytes by .save_live_pending() + If device is active, get pending_bytes by .state_pending_exac= t() If total pending_bytes >=3D threshold_size, call .save_live_iter= ate() Data of VFIO device for pre-copy phase is copied Iterate till total pending bytes converge and are less than thresh= old diff --git a/include/migration/register.h b/include/migration/register.h index 5b5424ed8f..313b8e1c3b 100644 --- a/include/migration/register.h +++ b/include/migration/register.h @@ -46,9 +46,7 @@ typedef struct SaveVMHandlers { =20 /* This runs outside the iothread lock! */ int (*save_setup)(QEMUFile *f, void *opaque); - void (*save_live_pending)(void *opaque, uint64_t threshold_size, - uint64_t *rest_precopy, uint64_t *rest_postc= opy); - /* Note for save_live_pending: + /* Note for state_pending_*: * - res_precopy is for data which must be migrated in precopy * phase or in stopped state, in other words - before target * vm start @@ -59,7 +57,13 @@ typedef struct SaveVMHandlers { * Sum of res_precopy and res_postcopy is the whole amount of * pending data. */ - + /* This calculate the exact remaining data to transfer */ + void (*state_pending_exact)(void *opaque, uint64_t threshold_size, + uint64_t *rest_precopy, uint64_t *rest_pos= tcopy); + /* This estimates the remaining data to transfer */ + void (*state_pending_estimate)(void *opaque, uint64_t threshold_size, + uint64_t *rest_precopy, + uint64_t *rest_postcopy); =20 LoadStateHandler *load_state; int (*load_setup)(QEMUFile *f, void *opaque); diff --git a/migration/savevm.h b/migration/savevm.h index 98fae6f9b3..613f85e717 100644 --- a/migration/savevm.h +++ b/migration/savevm.h @@ -40,8 +40,12 @@ void qemu_savevm_state_cleanup(void); void qemu_savevm_state_complete_postcopy(QEMUFile *f); int qemu_savevm_state_complete_precopy(QEMUFile *f, bool iterable_only, bool inactivate_disks); -void qemu_savevm_state_pending(uint64_t max_size, - uint64_t *res_precopy, uint64_t *res_postco= py); +void qemu_savevm_state_pending_exact(uint64_t max_size, + uint64_t *res_precopy, + uint64_t *res_postcopy); +void qemu_savevm_state_pending_estimate(uint64_t max_size, + uint64_t *res_precopy, + uint64_t *res_postcopy); void qemu_savevm_send_ping(QEMUFile *f, uint32_t value); void qemu_savevm_send_open_return_path(QEMUFile *f); int qemu_savevm_send_packaged(QEMUFile *f, const uint8_t *buf, size_t len); diff --git a/hw/s390x/s390-stattrib.c b/hw/s390x/s390-stattrib.c index 9b74eeadf3..dfb95eb20c 100644 --- a/hw/s390x/s390-stattrib.c +++ b/hw/s390x/s390-stattrib.c @@ -182,8 +182,8 @@ static int cmma_save_setup(QEMUFile *f, void *opaque) return 0; } =20 -static void cmma_save_pending(void *opaque, uint64_t max_size, - uint64_t *res_precopy, uint64_t *res_postcop= y) +static void cmma_state_pending(void *opaque, uint64_t *res_precopy, + uint64_t *res_postcopy) { S390StAttribState *sas =3D S390_STATTRIB(opaque); S390StAttribClass *sac =3D S390_STATTRIB_GET_CLASS(sas); @@ -369,7 +369,8 @@ static SaveVMHandlers savevm_s390_stattrib_handlers =3D= { .save_setup =3D cmma_save_setup, .save_live_iterate =3D cmma_save_iterate, .save_live_complete_precopy =3D cmma_save_complete, - .save_live_pending =3D cmma_save_pending, + .state_pending_exact =3D cmma_state_pending, + .state_pending_estimate =3D cmma_state_pending, .save_cleanup =3D cmma_save_cleanup, .load_state =3D cmma_load, .is_active =3D cmma_active, diff --git a/hw/vfio/migration.c b/hw/vfio/migration.c index 8ae1bd31a8..1545498e11 100644 --- a/hw/vfio/migration.c +++ b/hw/vfio/migration.c @@ -456,8 +456,8 @@ static void vfio_save_cleanup(void *opaque) trace_vfio_save_cleanup(vbasedev->name); } =20 -static void vfio_save_pending(void *opaque, uint64_t threshold_size, - uint64_t *res_precopy, uint64_t *res_postcop= y) +static void vfio_state_pending(void *opaque, uint64_t threshold_size, + uint64_t *res_precopy, uint64_t *res_postco= py) { VFIODevice *vbasedev =3D opaque; VFIOMigration *migration =3D vbasedev->migration; @@ -470,7 +470,7 @@ static void vfio_save_pending(void *opaque, uint64_t t= hreshold_size, =20 *res_precopy +=3D migration->pending_bytes; =20 - trace_vfio_save_pending(vbasedev->name, *res_precopy, *res_postcopy); + trace_vfio_state_pending(vbasedev->name, *res_precopy, *res_postcopy); } =20 static int vfio_save_iterate(QEMUFile *f, void *opaque) @@ -681,7 +681,8 @@ static int vfio_load_state(QEMUFile *f, void *opaque, i= nt version_id) static SaveVMHandlers savevm_vfio_handlers =3D { .save_setup =3D vfio_save_setup, .save_cleanup =3D vfio_save_cleanup, - .save_live_pending =3D vfio_save_pending, + .state_pending_exact =3D vfio_state_pending, + .state_pending_estimate =3D vfio_state_pending, .save_live_iterate =3D vfio_save_iterate, .save_live_complete_precopy =3D vfio_save_complete_precopy, .save_state =3D vfio_save_state, diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c index a445bdc3c3..5b24007650 100644 --- a/migration/block-dirty-bitmap.c +++ b/migration/block-dirty-bitmap.c @@ -761,9 +761,9 @@ static int dirty_bitmap_save_complete(QEMUFile *f, void= *opaque) return 0; } =20 -static void dirty_bitmap_save_pending(void *opaque, uint64_t max_size, - uint64_t *res_precopy,=20 - uint64_t *res_postcopy) +static void dirty_bitmap_state_pending(void *opaque, uint64_t max_size, + uint64_t *res_precopy, + uint64_t *res_postcopy) { DBMSaveState *s =3D &((DBMState *)opaque)->save; SaveBitmapState *dbms; @@ -781,7 +781,7 @@ static void dirty_bitmap_save_pending(void *opaque, uin= t64_t max_size, =20 qemu_mutex_unlock_iothread(); =20 - trace_dirty_bitmap_save_pending(pending, max_size); + trace_dirty_bitmap_state_pending(pending); =20 *res_postcopy +=3D pending; } @@ -1250,7 +1250,8 @@ static SaveVMHandlers savevm_dirty_bitmap_handlers = =3D { .save_live_complete_postcopy =3D dirty_bitmap_save_complete, .save_live_complete_precopy =3D dirty_bitmap_save_complete, .has_postcopy =3D dirty_bitmap_has_postcopy, - .save_live_pending =3D dirty_bitmap_save_pending, + .state_pending_exact =3D dirty_bitmap_state_pending, + .state_pending_estimate =3D dirty_bitmap_state_pending, .save_live_iterate =3D dirty_bitmap_save_iterate, .is_active_iterate =3D dirty_bitmap_is_active_iterate, .load_state =3D dirty_bitmap_load, diff --git a/migration/block.c b/migration/block.c index 39ce4003c6..8e6ad1c468 100644 --- a/migration/block.c +++ b/migration/block.c @@ -862,9 +862,9 @@ static int block_save_complete(QEMUFile *f, void *opaqu= e) return 0; } =20 -static void block_save_pending(void *opaque, uint64_t max_size, - uint64_t *res_precopy, - uint64_t *res_postcopy) +static void block_state_pending(void *opaque, uint64_t max_size, + uint64_t *res_precopy, + uint64_t *res_postcopy) { /* Estimate pending number of bytes to send */ uint64_t pending; @@ -883,7 +883,7 @@ static void block_save_pending(void *opaque, uint64_t m= ax_size, pending =3D BLK_MIG_BLOCK_SIZE; } =20 - trace_migration_block_save_pending(pending); + trace_migration_block_state_pending(pending); /* We don't do postcopy */ *res_precopy +=3D pending; } @@ -1018,7 +1018,8 @@ static SaveVMHandlers savevm_block_handlers =3D { .save_setup =3D block_save_setup, .save_live_iterate =3D block_save_iterate, .save_live_complete_precopy =3D block_save_complete, - .save_live_pending =3D block_save_pending, + .state_pending_exact =3D block_state_pending, + .state_pending_estimate =3D block_state_pending, .load_state =3D block_load, .save_cleanup =3D block_migration_cleanup, .is_active =3D block_is_active, diff --git a/migration/migration.c b/migration/migration.c index a75a281635..9e18c911db 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -3756,13 +3756,18 @@ typedef enum { */ static MigIterateState migration_iteration_run(MigrationState *s) { - uint64_t pending_size, pend_pre, pend_post; + uint64_t pend_pre, pend_post; bool in_postcopy =3D s->state =3D=3D MIGRATION_STATUS_POSTCOPY_ACTIVE; =20 - qemu_savevm_state_pending(s->threshold_size, &pend_pre, &pend_post); - pending_size =3D pend_pre + pend_post; + qemu_savevm_state_pending_estimate(s->threshold_size, &pend_pre, &pend= _post); + uint64_t pending_size =3D pend_pre + pend_post; + trace_migrate_pending_estimate(pending_size, s->threshold_size, pend_p= re, pend_post); =20 - trace_migrate_pending(pending_size, s->threshold_size, pend_pre, pend_= post); + if (pend_pre <=3D s->threshold_size) { + qemu_savevm_state_pending_exact(s->threshold_size, &pend_pre, &pen= d_post); + pending_size =3D pend_pre + pend_post; + trace_migrate_pending_exact(pending_size, s->threshold_size, pend_= pre, pend_post); + } =20 if (pending_size && pending_size >=3D s->threshold_size) { /* Still a significant amount to transfer */ diff --git a/migration/ram.c b/migration/ram.c index 63cb6544e5..ad5a2eeadd 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -3392,17 +3392,33 @@ static int ram_save_complete(QEMUFile *f, void *opa= que) return 0; } =20 -static void ram_save_pending(void *opaque, uint64_t max_size, - uint64_t *res_precopy, uint64_t *res_postcopy) +static void ram_state_pending_estimate(void *opaque, uint64_t max_size, + uint64_t *res_precopy, + uint64_t *res_postcopy) { RAMState **temp =3D opaque; RAMState *rs =3D *temp; - uint64_t remaining_size; =20 - remaining_size =3D rs->migration_dirty_pages * TARGET_PAGE_SIZE; + uint64_t remaining_size =3D rs->migration_dirty_pages * TARGET_PAGE_SI= ZE; =20 - if (!migration_in_postcopy() && - remaining_size < max_size) { + if (migrate_postcopy_ram()) { + /* We can do postcopy, and all the data is postcopiable */ + *res_postcopy +=3D remaining_size; + } else { + *res_precopy +=3D remaining_size; + } +} + +static void ram_state_pending_exact(void *opaque, uint64_t max_size, + uint64_t *res_precopy, + uint64_t *res_postcopy) +{ + RAMState **temp =3D opaque; + RAMState *rs =3D *temp; + + uint64_t remaining_size =3D rs->migration_dirty_pages * TARGET_PAGE_SI= ZE; + + if (!migration_in_postcopy()) { qemu_mutex_lock_iothread(); WITH_RCU_READ_LOCK_GUARD() { migration_bitmap_sync_precopy(rs); @@ -4558,7 +4574,8 @@ static SaveVMHandlers savevm_ram_handlers =3D { .save_live_complete_postcopy =3D ram_save_complete, .save_live_complete_precopy =3D ram_save_complete, .has_postcopy =3D ram_has_postcopy, - .save_live_pending =3D ram_save_pending, + .state_pending_exact =3D ram_state_pending_exact, + .state_pending_estimate =3D ram_state_pending_estimate, .load_state =3D ram_load, .save_cleanup =3D ram_save_cleanup, .load_setup =3D ram_load_setup, diff --git a/migration/savevm.c b/migration/savevm.c index 9ddcbba4e3..89b9075ff1 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -1471,8 +1471,9 @@ flush: * the result is split into the amount for units that can and * for units that can't do postcopy. */ -void qemu_savevm_state_pending(uint64_t threshold_size, uint64_t *res_prec= opy, - uint64_t *res_postcopy) +void qemu_savevm_state_pending_exact(uint64_t threshold_size, + uint64_t *res_precopy, + uint64_t *res_postcopy) { SaveStateEntry *se; =20 @@ -1480,7 +1481,7 @@ void qemu_savevm_state_pending(uint64_t threshold_siz= e, uint64_t *res_precopy, *res_postcopy =3D 0; =20 QTAILQ_FOREACH(se, &savevm_state.handlers, entry) { - if (!se->ops || !se->ops->save_live_pending) { + if (!se->ops || !se->ops->state_pending_exact) { continue; } if (se->ops->is_active) { @@ -1488,8 +1489,31 @@ void qemu_savevm_state_pending(uint64_t threshold_si= ze, uint64_t *res_precopy, continue; } } - se->ops->save_live_pending(se->opaque, threshold_size, - res_precopy, res_postcopy); + se->ops->state_pending_exact(se->opaque, threshold_size, + res_precopy, res_postcopy); + } +} + +void qemu_savevm_state_pending_estimate(uint64_t threshold_size, + uint64_t *res_precopy, + uint64_t *res_postcopy) +{ + SaveStateEntry *se; + + *res_precopy =3D 0; + *res_postcopy =3D 0; + + QTAILQ_FOREACH(se, &savevm_state.handlers, entry) { + if (!se->ops || !se->ops->state_pending_estimate) { + continue; + } + if (se->ops->is_active) { + if (!se->ops->is_active(se->opaque)) { + continue; + } + } + se->ops->state_pending_estimate(se->opaque, threshold_size, + res_precopy, res_postcopy); } } =20 diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events index a21cbd2a56..90a8aecb37 100644 --- a/hw/vfio/trace-events +++ b/hw/vfio/trace-events @@ -157,7 +157,7 @@ vfio_save_cleanup(const char *name) " (%s)" vfio_save_buffer(const char *name, uint64_t data_offset, uint64_t data_siz= e, uint64_t pending) " (%s) Offset 0x%"PRIx64" size 0x%"PRIx64" pending 0x%= "PRIx64 vfio_update_pending(const char *name, uint64_t pending) " (%s) pending 0x%= "PRIx64 vfio_save_device_config_state(const char *name) " (%s)" -vfio_save_pending(const char *name, uint64_t precopy, uint64_t postcopy) "= (%s) precopy 0x%"PRIx64" postcopy 0x%"PRIx64 +vfio_state_pending(const char *name, uint64_t precopy, uint64_t postcopy) = " (%s) precopy 0x%"PRIx64" postcopy 0x%"PRIx64 vfio_save_iterate(const char *name, int data_size) " (%s) data_size %d" vfio_save_complete_precopy(const char *name) " (%s)" vfio_load_device_config_state(const char *name) " (%s)" diff --git a/migration/trace-events b/migration/trace-events index f2a873fd6c..84352f310a 100644 --- a/migration/trace-events +++ b/migration/trace-events @@ -150,7 +150,8 @@ migrate_fd_cleanup(void) "" migrate_fd_error(const char *error_desc) "error=3D%s" migrate_fd_cancel(void) "" migrate_handle_rp_req_pages(const char *rbname, size_t start, size_t len) = "in %s at 0x%zx len 0x%zx" -migrate_pending(uint64_t size, uint64_t max, uint64_t pre, uint64_t post) = "pending size %" PRIu64 " max %" PRIu64 " (pre =3D %" PRIu64 " post=3D%" PR= Iu64 ")" +migrate_pending_estimate(uint64_t size, uint64_t max, uint64_t pre, uint64= _t post) "pending size %" PRIu64 " max %" PRIu64 " (pre =3D %" PRIu64 " pos= t=3D%" PRIu64 ")" +migrate_pending_exact(uint64_t size, uint64_t max, uint64_t pre, uint64_t = post) "pending size %" PRIu64 " max %" PRIu64 " (pre =3D %" PRIu64 " post= =3D%" PRIu64 ")" migrate_send_rp_message(int msg_type, uint16_t len) "%d: len %d" migrate_send_rp_recv_bitmap(char *name, int64_t size) "block '%s' size 0x%= "PRIi64 migration_completion_file_err(void) "" @@ -330,7 +331,7 @@ send_bitmap_bits(uint32_t flags, uint64_t start_sector,= uint32_t nr_sectors, uin dirty_bitmap_save_iterate(int in_postcopy) "in postcopy: %d" dirty_bitmap_save_complete_enter(void) "" dirty_bitmap_save_complete_finish(void) "" -dirty_bitmap_save_pending(uint64_t pending, uint64_t max_size) "pending %"= PRIu64 " max: %" PRIu64 +dirty_bitmap_state_pending(uint64_t pending) "pending %" PRIu64 dirty_bitmap_load_complete(void) "" dirty_bitmap_load_bits_enter(uint64_t first_sector, uint32_t nr_sectors) "= chunk: %" PRIu64 " %" PRIu32 dirty_bitmap_load_bits_zeroes(void) "" @@ -355,7 +356,7 @@ migration_block_save_device_dirty(int64_t sector) "Erro= r reading sector %" PRId6 migration_block_flush_blks(const char *action, int submitted, int read_don= e, int transferred) "%s submitted %d read_done %d transferred %d" migration_block_save(const char *mig_stage, int submitted, int transferred= ) "Enter save live %s submitted %d transferred %d" migration_block_save_complete(void) "Block migration completed" -migration_block_save_pending(uint64_t pending) "Enter save live pending %= " PRIu64 +migration_block_state_pending(uint64_t pending) "Enter save live pending = %" PRIu64 =20 # page_cache.c migration_pagecache_init(int64_t max_num_items) "Setting cache buckets to = %" PRId64 --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670236820; cv=none; d=zohomail.com; s=zohoarc; b=Uk/RffbGETOIBlKEW7Xvtp8PtrqGcanu7pSPwZ51BmcRsXE6ggMPLLCzpV/7qttXgcNnzcVyzlxuAH1e3KyyQtz/4JFVlkksDbLfjcWotsDYP5aZHs9CyJ19+f+MuHGaGtqiEdkL80mVwzPttIP3eOmSOcqTy8gF8IH8bKtr2p8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670236820; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=aVA2ExIvUYYnRwSS5NgfSR0yZwp2UOeIEJlbVzJFJzk=; b=AsLg00X5YGpO9E1OAvLqh8bl5g2REIxXiQkfZ0iNRpqg0wmI2UyL6lGsL0Jsag9XS8nMs1hS7KFIO8J+aYCKFme20XK6QNOsoTjcx8P+RGGk8M6Zp+sSieF/KCaldZbkVAogpH0+9bcqul95Dyl0ST9ACK6W5xVfA5g/BpcOCRk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670236820476455.0919728957165; Mon, 5 Dec 2022 02:40:20 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28GL-00075F-86; Mon, 05 Dec 2022 04:59:49 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28GC-0006zD-QJ for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:59:42 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28G3-0008GG-CX for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:59:36 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-427-U0U7Wxn0PFiNrtkvAwFA_g-1; Mon, 05 Dec 2022 04:59:13 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id AAC7E800B23; Mon, 5 Dec 2022 09:59:11 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3681B2166B29; Mon, 5 Dec 2022 09:59:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234360; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=aVA2ExIvUYYnRwSS5NgfSR0yZwp2UOeIEJlbVzJFJzk=; b=dTp2bQGr8R0SNQuUQXW/SpHK8EfNWHierUf2D/njpTlAPEC3kWbcUfB6EazjkRYzkVpZVS keq3DiqZEOLz97g+ZnWOQRN73EfSDfoBwO2nV5ybhPRAvAEIv5ILan+MJM/Op8zem/BKo3 anAxEbhGGliqs205BzWtEG3oaFp2NU8= X-MC-Unique: U0U7Wxn0PFiNrtkvAwFA_g-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz Subject: [PATCH v2 50/51] migration: Remove unused threshold_size parameter Date: Mon, 5 Dec 2022 10:52:27 +0100 Message-Id: <20221205095228.1314-51-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670236821037100001 Content-Type: text/plain; charset="utf-8" Until previous commit, save_live_pending() was used for ram. Now with the split into state_pending_estimate() and state_pending_exact() it is not needed anymore, so remove them. Signed-off-by: Juan Quintela --- include/migration/register.h | 7 +++---- migration/savevm.h | 6 ++---- hw/vfio/migration.c | 6 +++--- migration/block-dirty-bitmap.c | 3 +-- migration/block.c | 3 +-- migration/migration.c | 4 ++-- migration/ram.c | 6 ++---- migration/savevm.c | 12 ++++-------- 8 files changed, 18 insertions(+), 29 deletions(-) diff --git a/include/migration/register.h b/include/migration/register.h index 313b8e1c3b..5f08204fb2 100644 --- a/include/migration/register.h +++ b/include/migration/register.h @@ -58,11 +58,10 @@ typedef struct SaveVMHandlers { * pending data. */ /* This calculate the exact remaining data to transfer */ - void (*state_pending_exact)(void *opaque, uint64_t threshold_size, - uint64_t *rest_precopy, uint64_t *rest_pos= tcopy); + void (*state_pending_exact)(void *opaque, uint64_t *rest_precopy, + uint64_t *rest_postcopy); /* This estimates the remaining data to transfer */ - void (*state_pending_estimate)(void *opaque, uint64_t threshold_size, - uint64_t *rest_precopy, + void (*state_pending_estimate)(void *opaque, uint64_t *rest_precopy, uint64_t *rest_postcopy); =20 LoadStateHandler *load_state; diff --git a/migration/savevm.h b/migration/savevm.h index 613f85e717..24f2d2a28b 100644 --- a/migration/savevm.h +++ b/migration/savevm.h @@ -40,11 +40,9 @@ void qemu_savevm_state_cleanup(void); void qemu_savevm_state_complete_postcopy(QEMUFile *f); int qemu_savevm_state_complete_precopy(QEMUFile *f, bool iterable_only, bool inactivate_disks); -void qemu_savevm_state_pending_exact(uint64_t max_size, - uint64_t *res_precopy, +void qemu_savevm_state_pending_exact(uint64_t *res_precopy, uint64_t *res_postcopy); -void qemu_savevm_state_pending_estimate(uint64_t max_size, - uint64_t *res_precopy, +void qemu_savevm_state_pending_estimate(uint64_t *res_precopy, uint64_t *res_postcopy); void qemu_savevm_send_ping(QEMUFile *f, uint32_t value); void qemu_savevm_send_open_return_path(QEMUFile *f); diff --git a/hw/vfio/migration.c b/hw/vfio/migration.c index 1545498e11..8dbbfa2c56 100644 --- a/hw/vfio/migration.c +++ b/hw/vfio/migration.c @@ -456,8 +456,8 @@ static void vfio_save_cleanup(void *opaque) trace_vfio_save_cleanup(vbasedev->name); } =20 -static void vfio_state_pending(void *opaque, uint64_t threshold_size, - uint64_t *res_precopy, uint64_t *res_postco= py) +static void vfio_state_pending(void *opaque, uint64_t *res_precopy, + uint64_t *res_postcopy) { VFIODevice *vbasedev =3D opaque; VFIOMigration *migration =3D vbasedev->migration; @@ -511,7 +511,7 @@ static int vfio_save_iterate(QEMUFile *f, void *opaque) } =20 /* - * Reset pending_bytes as .save_live_pending is not called during save= vm or + * Reset pending_bytes as .state_pending_* is not called during savevm= or * snapshot case, in such case vfio_update_pending() at the start of t= his * function updates pending_bytes. */ diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c index 5b24007650..8a11577252 100644 --- a/migration/block-dirty-bitmap.c +++ b/migration/block-dirty-bitmap.c @@ -761,8 +761,7 @@ static int dirty_bitmap_save_complete(QEMUFile *f, void= *opaque) return 0; } =20 -static void dirty_bitmap_state_pending(void *opaque, uint64_t max_size, - uint64_t *res_precopy, +static void dirty_bitmap_state_pending(void *opaque, uint64_t *res_precopy, uint64_t *res_postcopy) { DBMSaveState *s =3D &((DBMState *)opaque)->save; diff --git a/migration/block.c b/migration/block.c index 8e6ad1c468..4f1f7c0f8d 100644 --- a/migration/block.c +++ b/migration/block.c @@ -862,8 +862,7 @@ static int block_save_complete(QEMUFile *f, void *opaqu= e) return 0; } =20 -static void block_state_pending(void *opaque, uint64_t max_size, - uint64_t *res_precopy, +static void block_state_pending(void *opaque, uint64_t *res_precopy, uint64_t *res_postcopy) { /* Estimate pending number of bytes to send */ diff --git a/migration/migration.c b/migration/migration.c index 9e18c911db..b54e4657ce 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -3759,12 +3759,12 @@ static MigIterateState migration_iteration_run(Migr= ationState *s) uint64_t pend_pre, pend_post; bool in_postcopy =3D s->state =3D=3D MIGRATION_STATUS_POSTCOPY_ACTIVE; =20 - qemu_savevm_state_pending_estimate(s->threshold_size, &pend_pre, &pend= _post); + qemu_savevm_state_pending_estimate(&pend_pre, &pend_post); uint64_t pending_size =3D pend_pre + pend_post; trace_migrate_pending_estimate(pending_size, s->threshold_size, pend_p= re, pend_post); =20 if (pend_pre <=3D s->threshold_size) { - qemu_savevm_state_pending_exact(s->threshold_size, &pend_pre, &pen= d_post); + qemu_savevm_state_pending_exact(&pend_pre, &pend_post); pending_size =3D pend_pre + pend_post; trace_migrate_pending_exact(pending_size, s->threshold_size, pend_= pre, pend_post); } diff --git a/migration/ram.c b/migration/ram.c index ad5a2eeadd..48378ee57e 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -3392,8 +3392,7 @@ static int ram_save_complete(QEMUFile *f, void *opaqu= e) return 0; } =20 -static void ram_state_pending_estimate(void *opaque, uint64_t max_size, - uint64_t *res_precopy, +static void ram_state_pending_estimate(void *opaque, uint64_t *res_precopy, uint64_t *res_postcopy) { RAMState **temp =3D opaque; @@ -3409,8 +3408,7 @@ static void ram_state_pending_estimate(void *opaque, = uint64_t max_size, } } =20 -static void ram_state_pending_exact(void *opaque, uint64_t max_size, - uint64_t *res_precopy, +static void ram_state_pending_exact(void *opaque, uint64_t *res_precopy, uint64_t *res_postcopy) { RAMState **temp =3D opaque; diff --git a/migration/savevm.c b/migration/savevm.c index 89b9075ff1..5ad94f0be9 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -1471,8 +1471,7 @@ flush: * the result is split into the amount for units that can and * for units that can't do postcopy. */ -void qemu_savevm_state_pending_exact(uint64_t threshold_size, - uint64_t *res_precopy, +void qemu_savevm_state_pending_exact(uint64_t *res_precopy, uint64_t *res_postcopy) { SaveStateEntry *se; @@ -1489,13 +1488,11 @@ void qemu_savevm_state_pending_exact(uint64_t thres= hold_size, continue; } } - se->ops->state_pending_exact(se->opaque, threshold_size, - res_precopy, res_postcopy); + se->ops->state_pending_exact(se->opaque, res_precopy, res_postcopy= ); } } =20 -void qemu_savevm_state_pending_estimate(uint64_t threshold_size, - uint64_t *res_precopy, +void qemu_savevm_state_pending_estimate(uint64_t *res_precopy, uint64_t *res_postcopy) { SaveStateEntry *se; @@ -1512,8 +1509,7 @@ void qemu_savevm_state_pending_estimate(uint64_t thre= shold_size, continue; } } - se->ops->state_pending_estimate(se->opaque, threshold_size, - res_precopy, res_postcopy); + se->ops->state_pending_estimate(se->opaque, res_precopy, res_postc= opy); } } =20 --=20 2.38.1 From nobody Tue May 14 15:22:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1670236918; cv=none; d=zohomail.com; s=zohoarc; b=XoJI/NEwExbgRUSSx1AYmyCGoVDl+03uk6/FoCxcmjn1j8/XZjyS4QpFx/n9jIDA+/1O8YTFJZPvXMntdEvXzWWPy4cpGFJwbJcWyL3ELnJC7s066MtMfwnrju7laOTbcYl1ztdRWCpFfHvAHu4S+vqEY66Wi32MZDTmjA2l50c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1670236918; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=JsXt0Mo+YraOe+nVpUCs7+EEHIwsfkziC7U7eKyeVHo=; b=T+8ekvwQJ22j0qGq95GVjJFsuAK4Yp101FAqigSRle3FnsbZn67e1WHrGQiFSOWWNmrnQX7g8Nd1HOYYKS/VyrdyZFD8wlD8bzqGNjjFskNVk2ilhE3VLWZtLzamb/SNCRrZdipY3LDjZAiC5qLXHAJLGyGmEgocecAHIVxaZ98= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1670236918798556.498480524572; Mon, 5 Dec 2022 02:41:58 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p28GL-00077H-Vb; Mon, 05 Dec 2022 04:59:50 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28GE-0006zN-3o for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:59:42 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p28G6-0008Jk-EV for qemu-devel@nongnu.org; Mon, 05 Dec 2022 04:59:39 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-563-GxyJAN8aPheGjp7hlT7Stg-1; Mon, 05 Dec 2022 04:59:22 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 10C38185A794; Mon, 5 Dec 2022 09:59:21 +0000 (UTC) Received: from secure.mitica (unknown [10.39.194.135]) by smtp.corp.redhat.com (Postfix) with ESMTP id 15D182166B29; Mon, 5 Dec 2022 09:59:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670234370; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JsXt0Mo+YraOe+nVpUCs7+EEHIwsfkziC7U7eKyeVHo=; b=iNFeRrp5GxnrylrGo5sCJHe2BL5JMTAZpStE9b7fSH9KFm0OEZVXWbUrpNdQJzNRFxtv0E Z378E/0HtsHu6hLDVd5bXdLO+VNOuIS5t0AYH+zNpFJEjS1mamRKk6DVRAABNdD+wTIvKY bogZ5n7WOsCduGkjCfX9EogWxgsN5GU= X-MC-Unique: GxyJAN8aPheGjp7hlT7Stg-1 From: Juan Quintela To: qemu-devel@nongnu.org Cc: Fam Zheng , Thomas Huth , Viresh Kumar , Kevin Wolf , Mathieu Poirier , Laurent Vivier , Eric Blake , Richard Henderson , Raphael Norwitz , Stefan Hajnoczi , Juan Quintela , virtio-fs@redhat.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Christian Borntraeger , "Gonglei (Arei)" , qemu-block@nongnu.org, Xiaojuan Yang , Thomas Huth , Ilya Leoshkevich , Eduardo Habkost , Gerd Hoffmann , "Dr. David Alan Gilbert" , Alex Williamson , Eric Farman , Halil Pasic , Peter Maydell , Vladimir Sementsov-Ogievskiy , Jason Wang , Laurent Vivier , Song Gao , qemu-s390x@nongnu.org, Pavel Dovgalyuk , Klaus Jensen , John Snow , Michael Tokarev , qemu-arm@nongnu.org, Paolo Bonzini , "Michael S. Tsirkin" , Keith Busch , David Hildenbrand , qemu-trivial@nongnu.org, Hanna Reitz Subject: [PATCH v2 51/51] migration: simplify migration_iteration_run() Date: Mon, 5 Dec 2022 10:52:28 +0100 Message-Id: <20221205095228.1314-52-quintela@redhat.com> In-Reply-To: <20221205095228.1314-1-quintela@redhat.com> References: <20221205095228.1314-1-quintela@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=quintela@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1670236919338100001 Content-Type: text/plain; charset="utf-8" Signed-off-by: Juan Quintela Reviewed-by: Dr. David Alan Gilbert --- migration/migration.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/migration/migration.c b/migration/migration.c index b54e4657ce..b2c974f166 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -3769,23 +3769,23 @@ static MigIterateState migration_iteration_run(Migr= ationState *s) trace_migrate_pending_exact(pending_size, s->threshold_size, pend_= pre, pend_post); } =20 - if (pending_size && pending_size >=3D s->threshold_size) { - /* Still a significant amount to transfer */ - if (!in_postcopy && pend_pre <=3D s->threshold_size && - qatomic_read(&s->start_postcopy)) { - if (postcopy_start(s)) { - error_report("%s: postcopy failed to start", __func__); - } - return MIG_ITERATE_SKIP; - } - /* Just another iteration step */ - qemu_savevm_state_iterate(s->to_dst_file, in_postcopy); - } else { + if (pending_size < s->threshold_size) { trace_migration_thread_low_pending(pending_size); migration_completion(s); return MIG_ITERATE_BREAK; } =20 + /* Still a significant amount to transfer */ + if (!in_postcopy && pend_pre <=3D s->threshold_size && + qatomic_read(&s->start_postcopy)) { + if (postcopy_start(s)) { + error_report("%s: postcopy failed to start", __func__); + } + return MIG_ITERATE_SKIP; + } + + /* Just another iteration step */ + qemu_savevm_state_iterate(s->to_dst_file, in_postcopy); return MIG_ITERATE_RESUME; } =20 --=20 2.38.1