* Mon Feb 14 2022 Miroslav Rezanina <mrezanin@redhat.com> - 6.2.0-8
- kvm-numa-Enable-numa-for-SGX-EPC-sections.patch [bz#2033708] - kvm-numa-Support-SGX-numa-in-the-monitor-and-Libvirt-int.patch [bz#2033708] - kvm-doc-Add-the-SGX-numa-description.patch [bz#2033708] - kvm-Enable-SGX-RH-Only.patch [bz#2033708] - kvm-qapi-Cleanup-SGX-related-comments-and-restore-sectio.patch [bz#2033708] - kvm-block-io-Update-BSC-only-if-want_zero-is-true.patch [bz#2041461] - kvm-iotests-block-status-cache-New-test.patch [bz#2041461] - kvm-iotests-Test-qemu-img-convert-of-zeroed-data-cluster.patch [bz#1882917] - kvm-qemu-img-make-is_allocated_sectors-more-efficient.patch [bz#1882917] - kvm-block-backend-prevent-dangling-BDS-pointers-across-a.patch [bz#2040123] - kvm-iotests-stream-error-on-reset-New-test.patch [bz#2040123] - kvm-hw-arm-smmuv3-Fix-device-reset.patch [bz#2042481] - Resolves: bz#2033708 ([Intel 9.0 Feat] qemu-kvm: SGX 1.5 (SGX1 + Flexible Launch Control) support) - Resolves: bz#2041461 (Inconsistent block status reply in qemu-nbd) - Resolves: bz#1882917 (the target image size is incorrect when converting a badly fragmented file) - Resolves: bz#2040123 (Qemu core dumped when do block-stream to a snapshot node on non-enough space storage) - Resolves: bz#2042481 ([aarch64] Launch guest with "default-bus-bypass-iommu=off,iommu=smmuv3" and "iommu_platform=on", guest hangs after system_reset)
This commit is contained in:
parent
9769489cb1
commit
0daf0004a7
28
kvm-Enable-SGX-RH-Only.patch
Normal file
28
kvm-Enable-SGX-RH-Only.patch
Normal file
@ -0,0 +1,28 @@
|
||||
From f4f7c62a4658a570d3ad694b64463665fa4b80a7 Mon Sep 17 00:00:00 2001
|
||||
From: Paul Lai <plai@redhat.com>
|
||||
Date: Fri, 21 Jan 2022 13:14:42 -0500
|
||||
Subject: [PATCH 04/12] Enable SGX -- RH Only
|
||||
|
||||
RH-Author: Paul Lai <plai@redhat.com>
|
||||
RH-MergeRequest: 65: Enable SGX and add SGX Numa support
|
||||
RH-Commit: [4/5] 2cd4ee4a429f5e7b1c32e83a10bf488503603795
|
||||
RH-Bugzilla: 2033708
|
||||
RH-Acked-by: Paolo Bonzini <None>
|
||||
RH-Acked-by: Bandan Das <None>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
---
|
||||
configs/devices/x86_64-softmmu/x86_64-rh-devices.mak | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak b/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
|
||||
index dc03fbb671..327b1bee62 100644
|
||||
--- a/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
|
||||
+++ b/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
|
||||
@@ -101,3 +101,4 @@ CONFIG_TPM=y
|
||||
CONFIG_TPM_CRB=y
|
||||
CONFIG_TPM_TIS_ISA=y
|
||||
CONFIG_TPM_EMULATOR=y
|
||||
+CONFIG_SGX=y
|
||||
--
|
||||
2.27.0
|
||||
|
129
kvm-block-backend-prevent-dangling-BDS-pointers-across-a.patch
Normal file
129
kvm-block-backend-prevent-dangling-BDS-pointers-across-a.patch
Normal file
@ -0,0 +1,129 @@
|
||||
From 87f3b10dc600ac12272ee6cdc67571910ea722f6 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Date: Tue, 11 Jan 2022 15:36:12 +0000
|
||||
Subject: [PATCH 10/12] block-backend: prevent dangling BDS pointers across
|
||||
aio_poll()
|
||||
|
||||
RH-Author: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-MergeRequest: 71: block-backend: prevent dangling BDS pointers across aio_poll()
|
||||
RH-Commit: [1/2] 1b4cab39bf8c933ab910293a29bfceaa9e821068 (hreitz/qemu-kvm-c-9-s)
|
||||
RH-Bugzilla: 2040123
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
|
||||
|
||||
The BlockBackend root child can change when aio_poll() is invoked. This
|
||||
happens when a temporary filter node is removed upon blockjob
|
||||
completion, for example.
|
||||
|
||||
Functions in block/block-backend.c must be aware of this when using a
|
||||
blk_bs() pointer across aio_poll() because the BlockDriverState refcnt
|
||||
may reach 0, resulting in a stale pointer.
|
||||
|
||||
One example is scsi_device_purge_requests(), which calls blk_drain() to
|
||||
wait for in-flight requests to cancel. If the backup blockjob is active,
|
||||
then the BlockBackend root child is a temporary filter BDS owned by the
|
||||
blockjob. The blockjob can complete during bdrv_drained_begin() and the
|
||||
last reference to the BDS is released when the temporary filter node is
|
||||
removed. This results in a use-after-free when blk_drain() calls
|
||||
bdrv_drained_end(bs) on the dangling pointer.
|
||||
|
||||
Explicitly hold a reference to bs across block APIs that invoke
|
||||
aio_poll().
|
||||
|
||||
Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2021778
|
||||
Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2036178
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-Id: <20220111153613.25453-2-stefanha@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 1e3552dbd28359d35967b7c28dc86cde1bc29205)
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
---
|
||||
block/block-backend.c | 19 +++++++++++++++++--
|
||||
1 file changed, 17 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/block/block-backend.c b/block/block-backend.c
|
||||
index 12ef80ea17..23e727199b 100644
|
||||
--- a/block/block-backend.c
|
||||
+++ b/block/block-backend.c
|
||||
@@ -822,16 +822,22 @@ BlockBackend *blk_by_public(BlockBackendPublic *public)
|
||||
void blk_remove_bs(BlockBackend *blk)
|
||||
{
|
||||
ThrottleGroupMember *tgm = &blk->public.throttle_group_member;
|
||||
- BlockDriverState *bs;
|
||||
BdrvChild *root;
|
||||
|
||||
notifier_list_notify(&blk->remove_bs_notifiers, blk);
|
||||
if (tgm->throttle_state) {
|
||||
- bs = blk_bs(blk);
|
||||
+ BlockDriverState *bs = blk_bs(blk);
|
||||
+
|
||||
+ /*
|
||||
+ * Take a ref in case blk_bs() changes across bdrv_drained_begin(), for
|
||||
+ * example, if a temporary filter node is removed by a blockjob.
|
||||
+ */
|
||||
+ bdrv_ref(bs);
|
||||
bdrv_drained_begin(bs);
|
||||
throttle_group_detach_aio_context(tgm);
|
||||
throttle_group_attach_aio_context(tgm, qemu_get_aio_context());
|
||||
bdrv_drained_end(bs);
|
||||
+ bdrv_unref(bs);
|
||||
}
|
||||
|
||||
blk_update_root_state(blk);
|
||||
@@ -1705,6 +1711,7 @@ void blk_drain(BlockBackend *blk)
|
||||
BlockDriverState *bs = blk_bs(blk);
|
||||
|
||||
if (bs) {
|
||||
+ bdrv_ref(bs);
|
||||
bdrv_drained_begin(bs);
|
||||
}
|
||||
|
||||
@@ -1714,6 +1721,7 @@ void blk_drain(BlockBackend *blk)
|
||||
|
||||
if (bs) {
|
||||
bdrv_drained_end(bs);
|
||||
+ bdrv_unref(bs);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2044,10 +2052,13 @@ static int blk_do_set_aio_context(BlockBackend *blk, AioContext *new_context,
|
||||
int ret;
|
||||
|
||||
if (bs) {
|
||||
+ bdrv_ref(bs);
|
||||
+
|
||||
if (update_root_node) {
|
||||
ret = bdrv_child_try_set_aio_context(bs, new_context, blk->root,
|
||||
errp);
|
||||
if (ret < 0) {
|
||||
+ bdrv_unref(bs);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
@@ -2057,6 +2068,8 @@ static int blk_do_set_aio_context(BlockBackend *blk, AioContext *new_context,
|
||||
throttle_group_attach_aio_context(tgm, new_context);
|
||||
bdrv_drained_end(bs);
|
||||
}
|
||||
+
|
||||
+ bdrv_unref(bs);
|
||||
}
|
||||
|
||||
blk->ctx = new_context;
|
||||
@@ -2326,11 +2339,13 @@ void blk_io_limits_disable(BlockBackend *blk)
|
||||
ThrottleGroupMember *tgm = &blk->public.throttle_group_member;
|
||||
assert(tgm->throttle_state);
|
||||
if (bs) {
|
||||
+ bdrv_ref(bs);
|
||||
bdrv_drained_begin(bs);
|
||||
}
|
||||
throttle_group_unregister_tgm(tgm);
|
||||
if (bs) {
|
||||
bdrv_drained_end(bs);
|
||||
+ bdrv_unref(bs);
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.27.0
|
||||
|
56
kvm-block-io-Update-BSC-only-if-want_zero-is-true.patch
Normal file
56
kvm-block-io-Update-BSC-only-if-want_zero-is-true.patch
Normal file
@ -0,0 +1,56 @@
|
||||
From a6b472de71f6ebbe44025e1348c90e6f1f2b2326 Mon Sep 17 00:00:00 2001
|
||||
From: Hanna Reitz <hreitz@redhat.com>
|
||||
Date: Tue, 18 Jan 2022 17:59:59 +0100
|
||||
Subject: [PATCH 06/12] block/io: Update BSC only if want_zero is true
|
||||
|
||||
RH-Author: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-MergeRequest: 69: block/io: Update BSC only if want_zero is true
|
||||
RH-Commit: [1/2] ad19ff86c3420cafe5a9e785ee210e482fbc8cd7 (hreitz/qemu-kvm-c-9-s)
|
||||
RH-Bugzilla: 2041461
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
|
||||
We update the block-status cache whenever we get new information from a
|
||||
bdrv_co_block_status() call to the block driver. However, if we have
|
||||
passed want_zero=false to that call, it may flag areas containing zeroes
|
||||
as data, and so we would update the block-status cache with wrong
|
||||
information.
|
||||
|
||||
Therefore, we should not update the cache with want_zero=false.
|
||||
|
||||
Reported-by: Nir Soffer <nsoffer@redhat.com>
|
||||
Fixes: 0bc329fbb00 ("block: block-status cache for data regions")
|
||||
Reviewed-by: Nir Soffer <nsoffer@redhat.com>
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
Message-Id: <20220118170000.49423-2-hreitz@redhat.com>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
(cherry picked from commit 113b727ce788335cf76f65355d670c9bc130fd75)
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
---
|
||||
block/io.c | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/io.c b/block/io.c
|
||||
index bb0a254def..4e4cb556c5 100644
|
||||
--- a/block/io.c
|
||||
+++ b/block/io.c
|
||||
@@ -2497,8 +2497,12 @@ static int coroutine_fn bdrv_co_block_status(BlockDriverState *bs,
|
||||
* non-protocol nodes, and then it is never used. However, filling
|
||||
* the cache requires an RCU update, so double check here to avoid
|
||||
* such an update if possible.
|
||||
+ *
|
||||
+ * Check want_zero, because we only want to update the cache when we
|
||||
+ * have accurate information about what is zero and what is data.
|
||||
*/
|
||||
- if (ret == (BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID) &&
|
||||
+ if (want_zero &&
|
||||
+ ret == (BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID) &&
|
||||
QLIST_EMPTY(&bs->children))
|
||||
{
|
||||
/*
|
||||
--
|
||||
2.27.0
|
||||
|
77
kvm-doc-Add-the-SGX-numa-description.patch
Normal file
77
kvm-doc-Add-the-SGX-numa-description.patch
Normal file
@ -0,0 +1,77 @@
|
||||
From eb88a12ab1ecfe77bcc0d0067c96fce27a3bde01 Mon Sep 17 00:00:00 2001
|
||||
From: Yang Zhong <yang.zhong@intel.com>
|
||||
Date: Mon, 1 Nov 2021 12:20:08 -0400
|
||||
Subject: [PATCH 03/12] doc: Add the SGX numa description
|
||||
|
||||
RH-Author: Paul Lai <plai@redhat.com>
|
||||
RH-MergeRequest: 65: Enable SGX and add SGX Numa support
|
||||
RH-Commit: [3/5] c27b3f6976cbe92cc3c0e1dab0191cdd25de596a
|
||||
RH-Bugzilla: 2033708
|
||||
RH-Acked-by: Paolo Bonzini <None>
|
||||
RH-Acked-by: Bandan Das <None>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
|
||||
Add the SGX numa reference command and how to check if
|
||||
SGX numa is support or not with multiple EPC sections.
|
||||
|
||||
Signed-off-by: Yang Zhong <yang.zhong@intel.com>
|
||||
Message-Id: <20211101162009.62161-5-yang.zhong@intel.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit d1889b36098c79e2e6ac90faf3d0dc5ec0057677)
|
||||
Signed-off-by: Paul Lai <plai@redhat.com>
|
||||
---
|
||||
docs/system/i386/sgx.rst | 31 +++++++++++++++++++++++++++----
|
||||
1 file changed, 27 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/docs/system/i386/sgx.rst b/docs/system/i386/sgx.rst
|
||||
index f8fade5ac2..0f0a73f758 100644
|
||||
--- a/docs/system/i386/sgx.rst
|
||||
+++ b/docs/system/i386/sgx.rst
|
||||
@@ -141,8 +141,7 @@ To launch a SGX guest:
|
||||
|qemu_system_x86| \\
|
||||
-cpu host,+sgx-provisionkey \\
|
||||
-object memory-backend-epc,id=mem1,size=64M,prealloc=on \\
|
||||
- -object memory-backend-epc,id=mem2,size=28M \\
|
||||
- -M sgx-epc.0.memdev=mem1,sgx-epc.1.memdev=mem2
|
||||
+ -M sgx-epc.0.memdev=mem1,sgx-epc.0.node=0
|
||||
|
||||
Utilizing SGX in the guest requires a kernel/OS with SGX support.
|
||||
The support can be determined in guest by::
|
||||
@@ -152,8 +151,32 @@ The support can be determined in guest by::
|
||||
and SGX epc info by::
|
||||
|
||||
$ dmesg | grep sgx
|
||||
- [ 1.242142] sgx: EPC section 0x180000000-0x181bfffff
|
||||
- [ 1.242319] sgx: EPC section 0x181c00000-0x1837fffff
|
||||
+ [ 0.182807] sgx: EPC section 0x140000000-0x143ffffff
|
||||
+ [ 0.183695] sgx: [Firmware Bug]: Unable to map EPC section to online node. Fallback to the NUMA node 0.
|
||||
+
|
||||
+To launch a SGX numa guest:
|
||||
+
|
||||
+.. parsed-literal::
|
||||
+
|
||||
+ |qemu_system_x86| \\
|
||||
+ -cpu host,+sgx-provisionkey \\
|
||||
+ -object memory-backend-ram,size=2G,host-nodes=0,policy=bind,id=node0 \\
|
||||
+ -object memory-backend-epc,id=mem0,size=64M,prealloc=on,host-nodes=0,policy=bind \\
|
||||
+ -numa node,nodeid=0,cpus=0-1,memdev=node0 \\
|
||||
+ -object memory-backend-ram,size=2G,host-nodes=1,policy=bind,id=node1 \\
|
||||
+ -object memory-backend-epc,id=mem1,size=28M,prealloc=on,host-nodes=1,policy=bind \\
|
||||
+ -numa node,nodeid=1,cpus=2-3,memdev=node1 \\
|
||||
+ -M sgx-epc.0.memdev=mem0,sgx-epc.0.node=0,sgx-epc.1.memdev=mem1,sgx-epc.1.node=1
|
||||
+
|
||||
+and SGX epc numa info by::
|
||||
+
|
||||
+ $ dmesg | grep sgx
|
||||
+ [ 0.369937] sgx: EPC section 0x180000000-0x183ffffff
|
||||
+ [ 0.370259] sgx: EPC section 0x184000000-0x185bfffff
|
||||
+
|
||||
+ $ dmesg | grep SRAT
|
||||
+ [ 0.009981] ACPI: SRAT: Node 0 PXM 0 [mem 0x180000000-0x183ffffff]
|
||||
+ [ 0.009982] ACPI: SRAT: Node 1 PXM 1 [mem 0x184000000-0x185bfffff]
|
||||
|
||||
References
|
||||
----------
|
||||
--
|
||||
2.27.0
|
||||
|
61
kvm-hw-arm-smmuv3-Fix-device-reset.patch
Normal file
61
kvm-hw-arm-smmuv3-Fix-device-reset.patch
Normal file
@ -0,0 +1,61 @@
|
||||
From c08c3fbb2bb8494738fd34ec8fc9dc434ce82f4b Mon Sep 17 00:00:00 2001
|
||||
From: Eric Auger <eric.auger@redhat.com>
|
||||
Date: Wed, 2 Feb 2022 12:16:02 +0100
|
||||
Subject: [PATCH 12/12] hw/arm/smmuv3: Fix device reset
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 72: hw/arm/smmuv3: Fix device reset
|
||||
RH-Commit: [1/1] 2cfee2f7a03692681224fed96bb4f28406bf460a (eauger1/centos-qemu-kvm)
|
||||
RH-Bugzilla: 2042481
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: Andrew Jones <drjones@redhat.com>
|
||||
|
||||
branch: c9s
|
||||
Brew: 42958737
|
||||
Upstream: yes
|
||||
|
||||
We currently miss a bunch of register resets in the device reset
|
||||
function. This sometimes prevents the guest from rebooting after
|
||||
a system_reset (with virtio-blk-pci). For instance, we may get
|
||||
the following errors:
|
||||
|
||||
invalid STE
|
||||
smmuv3-iommu-memory-region-0-0 translation failed for iova=0x13a9d2000(SMMU_EVT_C_BAD_STE)
|
||||
Invalid read at addr 0x13A9D2000, size 2, region '(null)', reason: rejected
|
||||
invalid STE
|
||||
smmuv3-iommu-memory-region-0-0 translation failed for iova=0x13a9d2000(SMMU_EVT_C_BAD_STE)
|
||||
Invalid write at addr 0x13A9D2000, size 2, region '(null)', reason: rejected
|
||||
invalid STE
|
||||
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
Message-id: 20220202111602.627429-1-eric.auger@redhat.com
|
||||
Fixes: 10a83cb988 ("hw/arm/smmuv3: Skeleton")
|
||||
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
(cherry picked from commit 43530095e18fd16dcd51a4b385ad2a22c36f5698)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/arm/smmuv3.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
|
||||
index 01b60bee49..1b5640bb98 100644
|
||||
--- a/hw/arm/smmuv3.c
|
||||
+++ b/hw/arm/smmuv3.c
|
||||
@@ -276,6 +276,12 @@ static void smmuv3_init_regs(SMMUv3State *s)
|
||||
s->features = 0;
|
||||
s->sid_split = 0;
|
||||
s->aidr = 0x1;
|
||||
+ s->cr[0] = 0;
|
||||
+ s->cr0ack = 0;
|
||||
+ s->irq_ctrl = 0;
|
||||
+ s->gerror = 0;
|
||||
+ s->gerrorn = 0;
|
||||
+ s->statusr = 0;
|
||||
}
|
||||
|
||||
static int smmu_get_ste(SMMUv3State *s, dma_addr_t addr, STE *buf,
|
||||
--
|
||||
2.27.0
|
||||
|
@ -0,0 +1,81 @@
|
||||
From 51f691acd8042351d005873996d7bf4c7b045508 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Fri, 17 Dec 2021 17:46:53 +0100
|
||||
Subject: [PATCH 08/12] iotests: Test qemu-img convert of zeroed data cluster
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 70: qemu-img convert: Fix sparseness of output image
|
||||
RH-Commit: [1/2] 0770582c553ac6b0f18c035f9a0238599d4763cc (kmwolf/centos-qemu-kvm)
|
||||
RH-Bugzilla: 1882917
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Hanna Reitz <hreitz@redhat.com>
|
||||
|
||||
This demonstrates what happens when the block status changes in
|
||||
sub-min_sparse granularity, but all of the parts are zeroed out. The
|
||||
alignment logic in is_allocated_sectors() prevents that the target image
|
||||
remains fully sparse as expected, but turns it into a data cluster of
|
||||
explicit zeros.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Message-Id: <20211217164654.1184218-2-vsementsov@virtuozzo.com>
|
||||
Tested-by: Peter Lieven <pl@kamp.de>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 51cd8bddd63540514d44808f7920811439baa253)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/122 | 1 +
|
||||
tests/qemu-iotests/122.out | 10 ++++++++--
|
||||
2 files changed, 9 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/tests/qemu-iotests/122 b/tests/qemu-iotests/122
|
||||
index efb260d822..be0f6b79e5 100755
|
||||
--- a/tests/qemu-iotests/122
|
||||
+++ b/tests/qemu-iotests/122
|
||||
@@ -251,6 +251,7 @@ $QEMU_IO -c "write -P 0 0 64k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_test
|
||||
$QEMU_IO -c "write 0 1k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
|
||||
$QEMU_IO -c "write 8k 1k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
|
||||
$QEMU_IO -c "write 17k 1k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
|
||||
+$QEMU_IO -c "write -P 0 65k 1k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
|
||||
|
||||
for min_sparse in 4k 8k; do
|
||||
echo
|
||||
diff --git a/tests/qemu-iotests/122.out b/tests/qemu-iotests/122.out
|
||||
index 8fbdac2b39..69b8e8b803 100644
|
||||
--- a/tests/qemu-iotests/122.out
|
||||
+++ b/tests/qemu-iotests/122.out
|
||||
@@ -192,6 +192,8 @@ wrote 1024/1024 bytes at offset 8192
|
||||
1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
wrote 1024/1024 bytes at offset 17408
|
||||
1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
+wrote 1024/1024 bytes at offset 66560
|
||||
+1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
|
||||
convert -S 4k
|
||||
[{ "start": 0, "length": 4096, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
|
||||
@@ -199,7 +201,9 @@ convert -S 4k
|
||||
{ "start": 8192, "length": 4096, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
|
||||
{ "start": 12288, "length": 4096, "depth": 0, "present": false, "zero": true, "data": false},
|
||||
{ "start": 16384, "length": 4096, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
|
||||
-{ "start": 20480, "length": 67088384, "depth": 0, "present": false, "zero": true, "data": false}]
|
||||
+{ "start": 20480, "length": 46080, "depth": 0, "present": false, "zero": true, "data": false},
|
||||
+{ "start": 66560, "length": 1024, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
|
||||
+{ "start": 67584, "length": 67041280, "depth": 0, "present": false, "zero": true, "data": false}]
|
||||
|
||||
convert -c -S 4k
|
||||
[{ "start": 0, "length": 1024, "depth": 0, "present": true, "zero": false, "data": true},
|
||||
@@ -211,7 +215,9 @@ convert -c -S 4k
|
||||
|
||||
convert -S 8k
|
||||
[{ "start": 0, "length": 24576, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
|
||||
-{ "start": 24576, "length": 67084288, "depth": 0, "present": false, "zero": true, "data": false}]
|
||||
+{ "start": 24576, "length": 41984, "depth": 0, "present": false, "zero": true, "data": false},
|
||||
+{ "start": 66560, "length": 1024, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
|
||||
+{ "start": 67584, "length": 67041280, "depth": 0, "present": false, "zero": true, "data": false}]
|
||||
|
||||
convert -c -S 8k
|
||||
[{ "start": 0, "length": 1024, "depth": 0, "present": true, "zero": false, "data": true},
|
||||
--
|
||||
2.27.0
|
||||
|
197
kvm-iotests-block-status-cache-New-test.patch
Normal file
197
kvm-iotests-block-status-cache-New-test.patch
Normal file
@ -0,0 +1,197 @@
|
||||
From 89fe89491f89a7526ba864a9d94d3de930261d69 Mon Sep 17 00:00:00 2001
|
||||
From: Hanna Reitz <hreitz@redhat.com>
|
||||
Date: Tue, 18 Jan 2022 18:00:00 +0100
|
||||
Subject: [PATCH 07/12] iotests/block-status-cache: New test
|
||||
|
||||
RH-Author: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-MergeRequest: 69: block/io: Update BSC only if want_zero is true
|
||||
RH-Commit: [2/2] 3c5a55aca1ac7a71c175a124d63bcf7a4430a022 (hreitz/qemu-kvm-c-9-s)
|
||||
RH-Bugzilla: 2041461
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
|
||||
Add a new test to verify that want_zero=false block-status calls do not
|
||||
pollute the block-status cache for want_zero=true calls.
|
||||
|
||||
We check want_zero=true calls and their results using `qemu-img map`
|
||||
(over NBD), and want_zero=false calls also using `qemu-img map` over
|
||||
NBD, but using the qemu:allocation-depth context.
|
||||
|
||||
(This test case cannot be integrated into nbd-qemu-allocation, because
|
||||
that is a qcow2 test, and this is a raw test.)
|
||||
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
Message-Id: <20220118170000.49423-3-hreitz@redhat.com>
|
||||
Reviewed-by: Nir Soffer <nsoffer@redhat.com>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Tested-by: Eric Blake <eblake@redhat.com>
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
(cherry picked from commit 6384dd534d742123d26c008d9794b20bc41359d5)
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
---
|
||||
tests/qemu-iotests/tests/block-status-cache | 139 ++++++++++++++++++
|
||||
.../qemu-iotests/tests/block-status-cache.out | 5 +
|
||||
2 files changed, 144 insertions(+)
|
||||
create mode 100755 tests/qemu-iotests/tests/block-status-cache
|
||||
create mode 100644 tests/qemu-iotests/tests/block-status-cache.out
|
||||
|
||||
diff --git a/tests/qemu-iotests/tests/block-status-cache b/tests/qemu-iotests/tests/block-status-cache
|
||||
new file mode 100755
|
||||
index 0000000000..6fa10bb8f8
|
||||
--- /dev/null
|
||||
+++ b/tests/qemu-iotests/tests/block-status-cache
|
||||
@@ -0,0 +1,139 @@
|
||||
+#!/usr/bin/env python3
|
||||
+# group: rw quick
|
||||
+#
|
||||
+# Test cases for the block-status cache.
|
||||
+#
|
||||
+# Copyright (C) 2022 Red Hat, Inc.
|
||||
+#
|
||||
+# This program is free software; you can redistribute it and/or modify
|
||||
+# it under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation; either version 2 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+#
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+#
|
||||
+
|
||||
+import os
|
||||
+import signal
|
||||
+import iotests
|
||||
+from iotests import qemu_img_create, qemu_img_pipe, qemu_nbd
|
||||
+
|
||||
+
|
||||
+image_size = 1 * 1024 * 1024
|
||||
+test_img = os.path.join(iotests.test_dir, 'test.img')
|
||||
+
|
||||
+nbd_pidfile = os.path.join(iotests.test_dir, 'nbd.pid')
|
||||
+nbd_sock = os.path.join(iotests.sock_dir, 'nbd.sock')
|
||||
+
|
||||
+
|
||||
+class TestBscWithNbd(iotests.QMPTestCase):
|
||||
+ def setUp(self) -> None:
|
||||
+ """Just create an empty image with a read-only NBD server on it"""
|
||||
+ assert qemu_img_create('-f', iotests.imgfmt, test_img,
|
||||
+ str(image_size)) == 0
|
||||
+
|
||||
+ # Pass --allocation-depth to enable the qemu:allocation-depth context,
|
||||
+ # which we are going to query to provoke a block-status inquiry with
|
||||
+ # want_zero=false.
|
||||
+ assert qemu_nbd(f'--socket={nbd_sock}',
|
||||
+ f'--format={iotests.imgfmt}',
|
||||
+ '--persistent',
|
||||
+ '--allocation-depth',
|
||||
+ '--read-only',
|
||||
+ f'--pid-file={nbd_pidfile}',
|
||||
+ test_img) \
|
||||
+ == 0
|
||||
+
|
||||
+ def tearDown(self) -> None:
|
||||
+ with open(nbd_pidfile, encoding='utf-8') as f:
|
||||
+ pid = int(f.read())
|
||||
+ os.kill(pid, signal.SIGTERM)
|
||||
+ os.remove(nbd_pidfile)
|
||||
+ os.remove(test_img)
|
||||
+
|
||||
+ def test_with_zero_bug(self) -> None:
|
||||
+ """
|
||||
+ Verify that the block-status cache is not corrupted by a
|
||||
+ want_zero=false call.
|
||||
+ We can provoke a want_zero=false call with `qemu-img map` over NBD with
|
||||
+ x-dirty-bitmap=qemu:allocation-depth, so we first run a normal `map`
|
||||
+ (which results in want_zero=true), then using said
|
||||
+ qemu:allocation-depth context, and finally another normal `map` to
|
||||
+ verify that the cache has not been corrupted.
|
||||
+ """
|
||||
+
|
||||
+ nbd_img_opts = f'driver=nbd,server.type=unix,server.path={nbd_sock}'
|
||||
+ nbd_img_opts_alloc_depth = nbd_img_opts + \
|
||||
+ ',x-dirty-bitmap=qemu:allocation-depth'
|
||||
+
|
||||
+ # Normal map, results in want_zero=true.
|
||||
+ # This will probably detect an allocated data sector first (qemu likes
|
||||
+ # to allocate the first sector to facilitate alignment probing), and
|
||||
+ # then the rest to be zero. The BSC will thus contain (if anything)
|
||||
+ # one range covering the first sector.
|
||||
+ map_pre = qemu_img_pipe('map', '--output=json', '--image-opts',
|
||||
+ nbd_img_opts)
|
||||
+
|
||||
+ # qemu:allocation-depth maps for want_zero=false.
|
||||
+ # want_zero=false should (with the file driver, which the server is
|
||||
+ # using) report everything as data. While this is sufficient for
|
||||
+ # want_zero=false, this is nothing that should end up in the
|
||||
+ # block-status cache.
|
||||
+ # Due to a bug, this information did end up in the cache, though, and
|
||||
+ # this would lead to wrong information being returned on subsequent
|
||||
+ # want_zero=true calls.
|
||||
+ #
|
||||
+ # We need to run this map twice: On the first call, we probably still
|
||||
+ # have the first sector in the cache, and so this will be served from
|
||||
+ # the cache; and only the subsequent range will be queried from the
|
||||
+ # block driver. This subsequent range will then be entered into the
|
||||
+ # cache.
|
||||
+ # If we did a want_zero=true call at this point, we would thus get
|
||||
+ # correct information: The first sector is not covered by the cache, so
|
||||
+ # we would get fresh block-status information from the driver, which
|
||||
+ # would return a data range, and this would then go into the cache,
|
||||
+ # evicting the wrong range from the want_zero=false call before.
|
||||
+ #
|
||||
+ # Therefore, we need a second want_zero=false map to reproduce:
|
||||
+ # Since the first sector is not in the cache, the query for its status
|
||||
+ # will go to the driver, which will return a result that reports the
|
||||
+ # whole image to be a single data area. This result will then go into
|
||||
+ # the cache, and so the cache will then report the whole image to
|
||||
+ # contain data.
|
||||
+ #
|
||||
+ # Note that once the cache reports the whole image to contain data, any
|
||||
+ # subsequent map operation will be served from the cache, and so we can
|
||||
+ # never loop too many times here.
|
||||
+ for _ in range(2):
|
||||
+ # (Ignore the result, this is just to contaminate the cache)
|
||||
+ qemu_img_pipe('map', '--output=json', '--image-opts',
|
||||
+ nbd_img_opts_alloc_depth)
|
||||
+
|
||||
+ # Now let's see whether the cache reports everything as data, or
|
||||
+ # whether we get correct information (i.e. the same as we got on our
|
||||
+ # first attempt).
|
||||
+ map_post = qemu_img_pipe('map', '--output=json', '--image-opts',
|
||||
+ nbd_img_opts)
|
||||
+
|
||||
+ if map_pre != map_post:
|
||||
+ print('ERROR: Map information differs before and after querying ' +
|
||||
+ 'qemu:allocation-depth')
|
||||
+ print('Before:')
|
||||
+ print(map_pre)
|
||||
+ print('After:')
|
||||
+ print(map_post)
|
||||
+
|
||||
+ self.fail("Map information differs")
|
||||
+
|
||||
+
|
||||
+if __name__ == '__main__':
|
||||
+ # The block-status cache only works on the protocol layer, so to test it,
|
||||
+ # we can only use the raw format
|
||||
+ iotests.main(supported_fmts=['raw'],
|
||||
+ supported_protocols=['file'])
|
||||
diff --git a/tests/qemu-iotests/tests/block-status-cache.out b/tests/qemu-iotests/tests/block-status-cache.out
|
||||
new file mode 100644
|
||||
index 0000000000..ae1213e6f8
|
||||
--- /dev/null
|
||||
+++ b/tests/qemu-iotests/tests/block-status-cache.out
|
||||
@@ -0,0 +1,5 @@
|
||||
+.
|
||||
+----------------------------------------------------------------------
|
||||
+Ran 1 tests
|
||||
+
|
||||
+OK
|
||||
--
|
||||
2.27.0
|
||||
|
196
kvm-iotests-stream-error-on-reset-New-test.patch
Normal file
196
kvm-iotests-stream-error-on-reset-New-test.patch
Normal file
@ -0,0 +1,196 @@
|
||||
From 300f912d4a5afe4ecca9c68a71429fbc9966ec34 Mon Sep 17 00:00:00 2001
|
||||
From: Hanna Reitz <hreitz@redhat.com>
|
||||
Date: Tue, 11 Jan 2022 15:36:13 +0000
|
||||
Subject: [PATCH 11/12] iotests/stream-error-on-reset: New test
|
||||
|
||||
RH-Author: Hanna Reitz <hreitz@redhat.com>
|
||||
RH-MergeRequest: 71: block-backend: prevent dangling BDS pointers across aio_poll()
|
||||
RH-Commit: [2/2] 3167f31b91eb433f338564201f4ef336e39f7f7d (hreitz/qemu-kvm-c-9-s)
|
||||
RH-Bugzilla: 2040123
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
|
||||
|
||||
Test the following scenario:
|
||||
- Simple stream block in two-layer backing chain (base and top)
|
||||
- The job is drained via blk_drain(), then an error occurs while the job
|
||||
settles the ongoing request
|
||||
- And so the job completes while in blk_drain()
|
||||
|
||||
This was reported as a segfault, but is fixed by "block-backend: prevent
|
||||
dangling BDS pointers across aio_poll()".
|
||||
|
||||
Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2036178
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-Id: <20220111153613.25453-3-stefanha@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 2ca1d5d6b91f8a52a5c651f660b2f58c94bf97ba)
|
||||
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
||||
---
|
||||
.../qemu-iotests/tests/stream-error-on-reset | 140 ++++++++++++++++++
|
||||
.../tests/stream-error-on-reset.out | 5 +
|
||||
2 files changed, 145 insertions(+)
|
||||
create mode 100755 tests/qemu-iotests/tests/stream-error-on-reset
|
||||
create mode 100644 tests/qemu-iotests/tests/stream-error-on-reset.out
|
||||
|
||||
diff --git a/tests/qemu-iotests/tests/stream-error-on-reset b/tests/qemu-iotests/tests/stream-error-on-reset
|
||||
new file mode 100755
|
||||
index 0000000000..7eaedb24d7
|
||||
--- /dev/null
|
||||
+++ b/tests/qemu-iotests/tests/stream-error-on-reset
|
||||
@@ -0,0 +1,140 @@
|
||||
+#!/usr/bin/env python3
|
||||
+# group: rw quick
|
||||
+#
|
||||
+# Test what happens when a stream job completes in a blk_drain().
|
||||
+#
|
||||
+# Copyright (C) 2022 Red Hat, Inc.
|
||||
+#
|
||||
+# This program is free software; you can redistribute it and/or modify
|
||||
+# it under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation; either version 2 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+#
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+#
|
||||
+
|
||||
+import os
|
||||
+import iotests
|
||||
+from iotests import imgfmt, qemu_img_create, qemu_io_silent, QMPTestCase
|
||||
+
|
||||
+
|
||||
+image_size = 1 * 1024 * 1024
|
||||
+data_size = 64 * 1024
|
||||
+base = os.path.join(iotests.test_dir, 'base.img')
|
||||
+top = os.path.join(iotests.test_dir, 'top.img')
|
||||
+
|
||||
+
|
||||
+# We want to test completing a stream job in a blk_drain().
|
||||
+#
|
||||
+# The blk_drain() we are going to use is a virtio-scsi device resetting,
|
||||
+# which we can trigger by resetting the system.
|
||||
+#
|
||||
+# In order to have the block job complete on drain, we (1) throttle its
|
||||
+# base image so we can start the drain after it has begun, but before it
|
||||
+# completes, and (2) make it encounter an I/O error on the ensuing write.
|
||||
+# (If it completes regularly, the completion happens after the drain for
|
||||
+# some reason.)
|
||||
+
|
||||
+class TestStreamErrorOnReset(QMPTestCase):
|
||||
+ def setUp(self) -> None:
|
||||
+ """
|
||||
+ Create two images:
|
||||
+ - base image {base} with {data_size} bytes allocated
|
||||
+ - top image {top} without any data allocated
|
||||
+
|
||||
+ And the following VM configuration:
|
||||
+ - base image throttled to {data_size}
|
||||
+ - top image with a blkdebug configuration so the first write access
|
||||
+ to it will result in an error
|
||||
+ - top image is attached to a virtio-scsi device
|
||||
+ """
|
||||
+ assert qemu_img_create('-f', imgfmt, base, str(image_size)) == 0
|
||||
+ assert qemu_io_silent('-c', f'write 0 {data_size}', base) == 0
|
||||
+ assert qemu_img_create('-f', imgfmt, top, str(image_size)) == 0
|
||||
+
|
||||
+ self.vm = iotests.VM()
|
||||
+ self.vm.add_args('-accel', 'tcg') # Make throttling work properly
|
||||
+ self.vm.add_object(self.vm.qmp_to_opts({
|
||||
+ 'qom-type': 'throttle-group',
|
||||
+ 'id': 'thrgr',
|
||||
+ 'x-bps-total': str(data_size)
|
||||
+ }))
|
||||
+ self.vm.add_blockdev(self.vm.qmp_to_opts({
|
||||
+ 'driver': imgfmt,
|
||||
+ 'node-name': 'base',
|
||||
+ 'file': {
|
||||
+ 'driver': 'throttle',
|
||||
+ 'throttle-group': 'thrgr',
|
||||
+ 'file': {
|
||||
+ 'driver': 'file',
|
||||
+ 'filename': base
|
||||
+ }
|
||||
+ }
|
||||
+ }))
|
||||
+ self.vm.add_blockdev(self.vm.qmp_to_opts({
|
||||
+ 'driver': imgfmt,
|
||||
+ 'node-name': 'top',
|
||||
+ 'file': {
|
||||
+ 'driver': 'blkdebug',
|
||||
+ 'node-name': 'top-blkdebug',
|
||||
+ 'inject-error': [{
|
||||
+ 'event': 'pwritev',
|
||||
+ 'immediately': 'true',
|
||||
+ 'once': 'true'
|
||||
+ }],
|
||||
+ 'image': {
|
||||
+ 'driver': 'file',
|
||||
+ 'filename': top
|
||||
+ }
|
||||
+ },
|
||||
+ 'backing': 'base'
|
||||
+ }))
|
||||
+ self.vm.add_device(self.vm.qmp_to_opts({
|
||||
+ 'driver': 'virtio-scsi',
|
||||
+ 'id': 'vscsi'
|
||||
+ }))
|
||||
+ self.vm.add_device(self.vm.qmp_to_opts({
|
||||
+ 'driver': 'scsi-hd',
|
||||
+ 'bus': 'vscsi.0',
|
||||
+ 'drive': 'top'
|
||||
+ }))
|
||||
+ self.vm.launch()
|
||||
+
|
||||
+ def tearDown(self) -> None:
|
||||
+ self.vm.shutdown()
|
||||
+ os.remove(top)
|
||||
+ os.remove(base)
|
||||
+
|
||||
+ def test_stream_error_on_reset(self) -> None:
|
||||
+ # Launch a stream job, which will take at least a second to
|
||||
+ # complete, because the base image is throttled (so we can
|
||||
+ # get in between it having started and it having completed)
|
||||
+ res = self.vm.qmp('block-stream', job_id='stream', device='top')
|
||||
+ self.assert_qmp(res, 'return', {})
|
||||
+
|
||||
+ while True:
|
||||
+ ev = self.vm.event_wait('JOB_STATUS_CHANGE')
|
||||
+ if ev['data']['status'] == 'running':
|
||||
+ # Once the stream job is running, reset the system, which
|
||||
+ # forces the virtio-scsi device to be reset, thus draining
|
||||
+ # the stream job, and making it complete. Completing
|
||||
+ # inside of that drain should not result in a segfault.
|
||||
+ res = self.vm.qmp('system_reset')
|
||||
+ self.assert_qmp(res, 'return', {})
|
||||
+ elif ev['data']['status'] == 'null':
|
||||
+ # The test is done once the job is gone
|
||||
+ break
|
||||
+
|
||||
+
|
||||
+if __name__ == '__main__':
|
||||
+ # Passes with any format with backing file support, but qed and
|
||||
+ # qcow1 do not seem to exercise the used-to-be problematic code
|
||||
+ # path, so there is no point in having them in this list
|
||||
+ iotests.main(supported_fmts=['qcow2', 'vmdk'],
|
||||
+ supported_protocols=['file'])
|
||||
diff --git a/tests/qemu-iotests/tests/stream-error-on-reset.out b/tests/qemu-iotests/tests/stream-error-on-reset.out
|
||||
new file mode 100644
|
||||
index 0000000000..ae1213e6f8
|
||||
--- /dev/null
|
||||
+++ b/tests/qemu-iotests/tests/stream-error-on-reset.out
|
||||
@@ -0,0 +1,5 @@
|
||||
+.
|
||||
+----------------------------------------------------------------------
|
||||
+Ran 1 tests
|
||||
+
|
||||
+OK
|
||||
--
|
||||
2.27.0
|
||||
|
287
kvm-numa-Enable-numa-for-SGX-EPC-sections.patch
Normal file
287
kvm-numa-Enable-numa-for-SGX-EPC-sections.patch
Normal file
@ -0,0 +1,287 @@
|
||||
From 6274a2a09a8931188889467b104bf2e2fc39cb54 Mon Sep 17 00:00:00 2001
|
||||
From: Yang Zhong <yang.zhong@intel.com>
|
||||
Date: Mon, 1 Nov 2021 12:20:05 -0400
|
||||
Subject: [PATCH 01/12] numa: Enable numa for SGX EPC sections
|
||||
|
||||
RH-Author: Paul Lai <plai@redhat.com>
|
||||
RH-MergeRequest: 65: Enable SGX and add SGX Numa support
|
||||
RH-Commit: [1/5] ff69d138c3f5903096388ec7ccf8dc5e6c6c6ffb
|
||||
RH-Bugzilla: 2033708
|
||||
RH-Acked-by: Paolo Bonzini <None>
|
||||
RH-Acked-by: Bandan Das <None>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
|
||||
The basic SGX did not enable numa for SGX EPC sections, which
|
||||
result in all EPC sections located in numa node 0. This patch
|
||||
enable SGX numa function in the guest and the EPC section can
|
||||
work with RAM as one numa node.
|
||||
|
||||
The Guest kernel related log:
|
||||
[ 0.009981] ACPI: SRAT: Node 0 PXM 0 [mem 0x180000000-0x183ffffff]
|
||||
[ 0.009982] ACPI: SRAT: Node 1 PXM 1 [mem 0x184000000-0x185bfffff]
|
||||
The SRAT table can normally show SGX EPC sections menory info in different
|
||||
numa nodes.
|
||||
|
||||
The SGX EPC numa related command:
|
||||
......
|
||||
-m 4G,maxmem=20G \
|
||||
-smp sockets=2,cores=2 \
|
||||
-cpu host,+sgx-provisionkey \
|
||||
-object memory-backend-ram,size=2G,host-nodes=0,policy=bind,id=node0 \
|
||||
-object memory-backend-epc,id=mem0,size=64M,prealloc=on,host-nodes=0,policy=bind \
|
||||
-numa node,nodeid=0,cpus=0-1,memdev=node0 \
|
||||
-object memory-backend-ram,size=2G,host-nodes=1,policy=bind,id=node1 \
|
||||
-object memory-backend-epc,id=mem1,size=28M,prealloc=on,host-nodes=1,policy=bind \
|
||||
-numa node,nodeid=1,cpus=2-3,memdev=node1 \
|
||||
-M sgx-epc.0.memdev=mem0,sgx-epc.0.node=0,sgx-epc.1.memdev=mem1,sgx-epc.1.node=1 \
|
||||
......
|
||||
|
||||
Signed-off-by: Yang Zhong <yang.zhong@intel.com>
|
||||
Message-Id: <20211101162009.62161-2-yang.zhong@intel.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 1105812382e1126d86dddc16b3700f8c79dc93d1)
|
||||
Signed-off-by: Paul Lai <plai@redhat.com>
|
||||
---
|
||||
hw/core/numa.c | 5 ++---
|
||||
hw/i386/acpi-build.c | 2 ++
|
||||
hw/i386/sgx-epc.c | 3 +++
|
||||
hw/i386/sgx-stub.c | 4 ++++
|
||||
hw/i386/sgx.c | 44 +++++++++++++++++++++++++++++++++++++++
|
||||
include/hw/i386/sgx-epc.h | 3 +++
|
||||
monitor/hmp-cmds.c | 1 +
|
||||
qapi/machine.json | 10 ++++++++-
|
||||
qemu-options.hx | 4 ++--
|
||||
9 files changed, 70 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/hw/core/numa.c b/hw/core/numa.c
|
||||
index e6050b2273..1aa05dcf42 100644
|
||||
--- a/hw/core/numa.c
|
||||
+++ b/hw/core/numa.c
|
||||
@@ -784,9 +784,8 @@ static void numa_stat_memory_devices(NumaNodeMem node_mem[])
|
||||
break;
|
||||
case MEMORY_DEVICE_INFO_KIND_SGX_EPC:
|
||||
se = value->u.sgx_epc.data;
|
||||
- /* TODO: once we support numa, assign to right node */
|
||||
- node_mem[0].node_mem += se->size;
|
||||
- node_mem[0].node_plugged_mem += se->size;
|
||||
+ node_mem[se->node].node_mem += se->size;
|
||||
+ node_mem[se->node].node_plugged_mem = 0;
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
|
||||
index a99c6e4fe3..8383b83ee3 100644
|
||||
--- a/hw/i386/acpi-build.c
|
||||
+++ b/hw/i386/acpi-build.c
|
||||
@@ -2068,6 +2068,8 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
|
||||
nvdimm_build_srat(table_data);
|
||||
}
|
||||
|
||||
+ sgx_epc_build_srat(table_data);
|
||||
+
|
||||
/*
|
||||
* TODO: this part is not in ACPI spec and current linux kernel boots fine
|
||||
* without these entries. But I recall there were issues the last time I
|
||||
diff --git a/hw/i386/sgx-epc.c b/hw/i386/sgx-epc.c
|
||||
index e508827e78..96b2940d75 100644
|
||||
--- a/hw/i386/sgx-epc.c
|
||||
+++ b/hw/i386/sgx-epc.c
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
static Property sgx_epc_properties[] = {
|
||||
DEFINE_PROP_UINT64(SGX_EPC_ADDR_PROP, SGXEPCDevice, addr, 0),
|
||||
+ DEFINE_PROP_UINT32(SGX_EPC_NUMA_NODE_PROP, SGXEPCDevice, node, 0),
|
||||
DEFINE_PROP_LINK(SGX_EPC_MEMDEV_PROP, SGXEPCDevice, hostmem,
|
||||
TYPE_MEMORY_BACKEND_EPC, HostMemoryBackendEpc *),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
@@ -139,6 +140,8 @@ static void sgx_epc_md_fill_device_info(const MemoryDeviceState *md,
|
||||
se->memaddr = epc->addr;
|
||||
se->size = object_property_get_uint(OBJECT(epc), SGX_EPC_SIZE_PROP,
|
||||
NULL);
|
||||
+ se->node = object_property_get_uint(OBJECT(epc), SGX_EPC_NUMA_NODE_PROP,
|
||||
+ NULL);
|
||||
se->memdev = object_get_canonical_path(OBJECT(epc->hostmem));
|
||||
|
||||
info->u.sgx_epc.data = se;
|
||||
diff --git a/hw/i386/sgx-stub.c b/hw/i386/sgx-stub.c
|
||||
index c9b379e665..26833eb233 100644
|
||||
--- a/hw/i386/sgx-stub.c
|
||||
+++ b/hw/i386/sgx-stub.c
|
||||
@@ -6,6 +6,10 @@
|
||||
#include "qapi/error.h"
|
||||
#include "qapi/qapi-commands-misc-target.h"
|
||||
|
||||
+void sgx_epc_build_srat(GArray *table_data)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
SGXInfo *qmp_query_sgx(Error **errp)
|
||||
{
|
||||
error_setg(errp, "SGX support is not compiled in");
|
||||
diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c
|
||||
index 8fef3dd8fa..d04299904a 100644
|
||||
--- a/hw/i386/sgx.c
|
||||
+++ b/hw/i386/sgx.c
|
||||
@@ -23,6 +23,7 @@
|
||||
#include "sysemu/hw_accel.h"
|
||||
#include "sysemu/reset.h"
|
||||
#include <sys/ioctl.h>
|
||||
+#include "hw/acpi/aml-build.h"
|
||||
|
||||
#define SGX_MAX_EPC_SECTIONS 8
|
||||
#define SGX_CPUID_EPC_INVALID 0x0
|
||||
@@ -36,6 +37,46 @@
|
||||
|
||||
#define RETRY_NUM 2
|
||||
|
||||
+static int sgx_epc_device_list(Object *obj, void *opaque)
|
||||
+{
|
||||
+ GSList **list = opaque;
|
||||
+
|
||||
+ if (object_dynamic_cast(obj, TYPE_SGX_EPC)) {
|
||||
+ *list = g_slist_append(*list, DEVICE(obj));
|
||||
+ }
|
||||
+
|
||||
+ object_child_foreach(obj, sgx_epc_device_list, opaque);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static GSList *sgx_epc_get_device_list(void)
|
||||
+{
|
||||
+ GSList *list = NULL;
|
||||
+
|
||||
+ object_child_foreach(qdev_get_machine(), sgx_epc_device_list, &list);
|
||||
+ return list;
|
||||
+}
|
||||
+
|
||||
+void sgx_epc_build_srat(GArray *table_data)
|
||||
+{
|
||||
+ GSList *device_list = sgx_epc_get_device_list();
|
||||
+
|
||||
+ for (; device_list; device_list = device_list->next) {
|
||||
+ DeviceState *dev = device_list->data;
|
||||
+ Object *obj = OBJECT(dev);
|
||||
+ uint64_t addr, size;
|
||||
+ int node;
|
||||
+
|
||||
+ node = object_property_get_uint(obj, SGX_EPC_NUMA_NODE_PROP,
|
||||
+ &error_abort);
|
||||
+ addr = object_property_get_uint(obj, SGX_EPC_ADDR_PROP, &error_abort);
|
||||
+ size = object_property_get_uint(obj, SGX_EPC_SIZE_PROP, &error_abort);
|
||||
+
|
||||
+ build_srat_memory(table_data, addr, size, node, MEM_AFFINITY_ENABLED);
|
||||
+ }
|
||||
+ g_slist_free(device_list);
|
||||
+}
|
||||
+
|
||||
static uint64_t sgx_calc_section_metric(uint64_t low, uint64_t high)
|
||||
{
|
||||
return (low & MAKE_64BIT_MASK(12, 20)) +
|
||||
@@ -226,6 +267,9 @@ void pc_machine_init_sgx_epc(PCMachineState *pcms)
|
||||
/* set the memdev link with memory backend */
|
||||
object_property_parse(obj, SGX_EPC_MEMDEV_PROP, list->value->memdev,
|
||||
&error_fatal);
|
||||
+ /* set the numa node property for sgx epc object */
|
||||
+ object_property_set_uint(obj, SGX_EPC_NUMA_NODE_PROP, list->value->node,
|
||||
+ &error_fatal);
|
||||
object_property_set_bool(obj, "realized", true, &error_fatal);
|
||||
object_unref(obj);
|
||||
}
|
||||
diff --git a/include/hw/i386/sgx-epc.h b/include/hw/i386/sgx-epc.h
|
||||
index a6a65be854..581fac389a 100644
|
||||
--- a/include/hw/i386/sgx-epc.h
|
||||
+++ b/include/hw/i386/sgx-epc.h
|
||||
@@ -25,6 +25,7 @@
|
||||
#define SGX_EPC_ADDR_PROP "addr"
|
||||
#define SGX_EPC_SIZE_PROP "size"
|
||||
#define SGX_EPC_MEMDEV_PROP "memdev"
|
||||
+#define SGX_EPC_NUMA_NODE_PROP "node"
|
||||
|
||||
/**
|
||||
* SGXEPCDevice:
|
||||
@@ -38,6 +39,7 @@ typedef struct SGXEPCDevice {
|
||||
|
||||
/* public */
|
||||
uint64_t addr;
|
||||
+ uint32_t node;
|
||||
HostMemoryBackendEpc *hostmem;
|
||||
} SGXEPCDevice;
|
||||
|
||||
@@ -56,6 +58,7 @@ typedef struct SGXEPCState {
|
||||
} SGXEPCState;
|
||||
|
||||
bool sgx_epc_get_section(int section_nr, uint64_t *addr, uint64_t *size);
|
||||
+void sgx_epc_build_srat(GArray *table_data);
|
||||
|
||||
static inline uint64_t sgx_epc_above_4g_end(SGXEPCState *sgx_epc)
|
||||
{
|
||||
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
|
||||
index 9c91bf93e9..2669156b28 100644
|
||||
--- a/monitor/hmp-cmds.c
|
||||
+++ b/monitor/hmp-cmds.c
|
||||
@@ -1810,6 +1810,7 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
|
||||
se->id ? se->id : "");
|
||||
monitor_printf(mon, " memaddr: 0x%" PRIx64 "\n", se->memaddr);
|
||||
monitor_printf(mon, " size: %" PRIu64 "\n", se->size);
|
||||
+ monitor_printf(mon, " node: %" PRId64 "\n", se->node);
|
||||
monitor_printf(mon, " memdev: %s\n", se->memdev);
|
||||
break;
|
||||
default:
|
||||
diff --git a/qapi/machine.json b/qapi/machine.json
|
||||
index 067e3f5378..16e771affc 100644
|
||||
--- a/qapi/machine.json
|
||||
+++ b/qapi/machine.json
|
||||
@@ -1207,12 +1207,15 @@
|
||||
#
|
||||
# @memdev: memory backend linked with device
|
||||
#
|
||||
+# @node: the numa node
|
||||
+#
|
||||
# Since: 6.2
|
||||
##
|
||||
{ 'struct': 'SgxEPCDeviceInfo',
|
||||
'data': { '*id': 'str',
|
||||
'memaddr': 'size',
|
||||
'size': 'size',
|
||||
+ 'node': 'int',
|
||||
'memdev': 'str'
|
||||
}
|
||||
}
|
||||
@@ -1285,10 +1288,15 @@
|
||||
#
|
||||
# @memdev: memory backend linked with device
|
||||
#
|
||||
+# @node: the numa node
|
||||
+#
|
||||
# Since: 6.2
|
||||
##
|
||||
{ 'struct': 'SgxEPC',
|
||||
- 'data': { 'memdev': 'str' } }
|
||||
+ 'data': { 'memdev': 'str',
|
||||
+ 'node': 'int'
|
||||
+ }
|
||||
+}
|
||||
|
||||
##
|
||||
# @SgxEPCProperties:
|
||||
diff --git a/qemu-options.hx b/qemu-options.hx
|
||||
index 94c4a8dbaf..4b7798088b 100644
|
||||
--- a/qemu-options.hx
|
||||
+++ b/qemu-options.hx
|
||||
@@ -127,11 +127,11 @@ SRST
|
||||
ERST
|
||||
|
||||
DEF("M", HAS_ARG, QEMU_OPTION_M,
|
||||
- " sgx-epc.0.memdev=memid\n",
|
||||
+ " sgx-epc.0.memdev=memid,sgx-epc.0.node=numaid\n",
|
||||
QEMU_ARCH_ALL)
|
||||
|
||||
SRST
|
||||
-``sgx-epc.0.memdev=@var{memid}``
|
||||
+``sgx-epc.0.memdev=@var{memid},sgx-epc.0.node=@var{numaid}``
|
||||
Define an SGX EPC section.
|
||||
ERST
|
||||
|
||||
--
|
||||
2.27.0
|
||||
|
210
kvm-numa-Support-SGX-numa-in-the-monitor-and-Libvirt-int.patch
Normal file
210
kvm-numa-Support-SGX-numa-in-the-monitor-and-Libvirt-int.patch
Normal file
@ -0,0 +1,210 @@
|
||||
From 0f75501ba348dc9fb3ce0198ceafc8093149457d Mon Sep 17 00:00:00 2001
|
||||
From: Yang Zhong <yang.zhong@intel.com>
|
||||
Date: Mon, 1 Nov 2021 12:20:07 -0400
|
||||
Subject: [PATCH 02/12] numa: Support SGX numa in the monitor and Libvirt
|
||||
interfaces
|
||||
|
||||
RH-Author: Paul Lai <plai@redhat.com>
|
||||
RH-MergeRequest: 65: Enable SGX and add SGX Numa support
|
||||
RH-Commit: [2/5] 8c19cfb1a139fd4dbac771e695a133f16a68437f
|
||||
RH-Bugzilla: 2033708
|
||||
RH-Acked-by: Paolo Bonzini <None>
|
||||
RH-Acked-by: Bandan Das <None>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
|
||||
Add the SGXEPCSection list into SGXInfo to show the multiple
|
||||
SGX EPC sections detailed info, not the total size like before.
|
||||
This patch can enable numa support for 'info sgx' command and
|
||||
QMP interfaces. The new interfaces show each EPC section info
|
||||
in one numa node. Libvirt can use QMP interface to get the
|
||||
detailed host SGX EPC capabilities to decide how to allocate
|
||||
host EPC sections to guest.
|
||||
|
||||
(qemu) info sgx
|
||||
SGX support: enabled
|
||||
SGX1 support: enabled
|
||||
SGX2 support: enabled
|
||||
FLC support: enabled
|
||||
NUMA node #0: size=67108864
|
||||
NUMA node #1: size=29360128
|
||||
|
||||
The QMP interface show:
|
||||
(QEMU) query-sgx
|
||||
{"return": {"sgx": true, "sgx2": true, "sgx1": true, "sections": \
|
||||
[{"node": 0, "size": 67108864}, {"node": 1, "size": 29360128}], "flc": true}}
|
||||
|
||||
(QEMU) query-sgx-capabilities
|
||||
{"return": {"sgx": true, "sgx2": true, "sgx1": true, "sections": \
|
||||
[{"node": 0, "size": 17070817280}, {"node": 1, "size": 17079205888}], "flc": true}}
|
||||
|
||||
Signed-off-by: Yang Zhong <yang.zhong@intel.com>
|
||||
Message-Id: <20211101162009.62161-4-yang.zhong@intel.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 4755927ae12547c2e7cb22c5fa1b39038c6c11b1)
|
||||
Signed-off-by: Paul Lai <plai@redhat.com>
|
||||
---
|
||||
hw/i386/sgx.c | 51 +++++++++++++++++++++++++++++++++++--------
|
||||
qapi/misc-target.json | 19 ++++++++++++++--
|
||||
2 files changed, 59 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c
|
||||
index d04299904a..5de5dd0893 100644
|
||||
--- a/hw/i386/sgx.c
|
||||
+++ b/hw/i386/sgx.c
|
||||
@@ -83,11 +83,13 @@ static uint64_t sgx_calc_section_metric(uint64_t low, uint64_t high)
|
||||
((high & MAKE_64BIT_MASK(0, 20)) << 32);
|
||||
}
|
||||
|
||||
-static uint64_t sgx_calc_host_epc_section_size(void)
|
||||
+static SGXEPCSectionList *sgx_calc_host_epc_sections(void)
|
||||
{
|
||||
+ SGXEPCSectionList *head = NULL, **tail = &head;
|
||||
+ SGXEPCSection *section;
|
||||
uint32_t i, type;
|
||||
uint32_t eax, ebx, ecx, edx;
|
||||
- uint64_t size = 0;
|
||||
+ uint32_t j = 0;
|
||||
|
||||
for (i = 0; i < SGX_MAX_EPC_SECTIONS; i++) {
|
||||
host_cpuid(0x12, i + 2, &eax, &ebx, &ecx, &edx);
|
||||
@@ -101,10 +103,13 @@ static uint64_t sgx_calc_host_epc_section_size(void)
|
||||
break;
|
||||
}
|
||||
|
||||
- size += sgx_calc_section_metric(ecx, edx);
|
||||
+ section = g_new0(SGXEPCSection, 1);
|
||||
+ section->node = j++;
|
||||
+ section->size = sgx_calc_section_metric(ecx, edx);
|
||||
+ QAPI_LIST_APPEND(tail, section);
|
||||
}
|
||||
|
||||
- return size;
|
||||
+ return head;
|
||||
}
|
||||
|
||||
static void sgx_epc_reset(void *opaque)
|
||||
@@ -168,13 +173,35 @@ SGXInfo *qmp_query_sgx_capabilities(Error **errp)
|
||||
info->sgx1 = eax & (1U << 0) ? true : false;
|
||||
info->sgx2 = eax & (1U << 1) ? true : false;
|
||||
|
||||
- info->section_size = sgx_calc_host_epc_section_size();
|
||||
+ info->sections = sgx_calc_host_epc_sections();
|
||||
|
||||
close(fd);
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
+static SGXEPCSectionList *sgx_get_epc_sections_list(void)
|
||||
+{
|
||||
+ GSList *device_list = sgx_epc_get_device_list();
|
||||
+ SGXEPCSectionList *head = NULL, **tail = &head;
|
||||
+ SGXEPCSection *section;
|
||||
+
|
||||
+ for (; device_list; device_list = device_list->next) {
|
||||
+ DeviceState *dev = device_list->data;
|
||||
+ Object *obj = OBJECT(dev);
|
||||
+
|
||||
+ section = g_new0(SGXEPCSection, 1);
|
||||
+ section->node = object_property_get_uint(obj, SGX_EPC_NUMA_NODE_PROP,
|
||||
+ &error_abort);
|
||||
+ section->size = object_property_get_uint(obj, SGX_EPC_SIZE_PROP,
|
||||
+ &error_abort);
|
||||
+ QAPI_LIST_APPEND(tail, section);
|
||||
+ }
|
||||
+ g_slist_free(device_list);
|
||||
+
|
||||
+ return head;
|
||||
+}
|
||||
+
|
||||
SGXInfo *qmp_query_sgx(Error **errp)
|
||||
{
|
||||
SGXInfo *info = NULL;
|
||||
@@ -193,14 +220,13 @@ SGXInfo *qmp_query_sgx(Error **errp)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- SGXEPCState *sgx_epc = &pcms->sgx_epc;
|
||||
info = g_new0(SGXInfo, 1);
|
||||
|
||||
info->sgx = true;
|
||||
info->sgx1 = true;
|
||||
info->sgx2 = true;
|
||||
info->flc = true;
|
||||
- info->section_size = sgx_epc->size;
|
||||
+ info->sections = sgx_get_epc_sections_list();
|
||||
|
||||
return info;
|
||||
}
|
||||
@@ -208,6 +234,7 @@ SGXInfo *qmp_query_sgx(Error **errp)
|
||||
void hmp_info_sgx(Monitor *mon, const QDict *qdict)
|
||||
{
|
||||
Error *err = NULL;
|
||||
+ SGXEPCSectionList *section_list, *section;
|
||||
g_autoptr(SGXInfo) info = qmp_query_sgx(&err);
|
||||
|
||||
if (err) {
|
||||
@@ -222,8 +249,14 @@ void hmp_info_sgx(Monitor *mon, const QDict *qdict)
|
||||
info->sgx2 ? "enabled" : "disabled");
|
||||
monitor_printf(mon, "FLC support: %s\n",
|
||||
info->flc ? "enabled" : "disabled");
|
||||
- monitor_printf(mon, "size: %" PRIu64 "\n",
|
||||
- info->section_size);
|
||||
+
|
||||
+ section_list = info->sections;
|
||||
+ for (section = section_list; section; section = section->next) {
|
||||
+ monitor_printf(mon, "NUMA node #%" PRId64 ": ",
|
||||
+ section->value->node);
|
||||
+ monitor_printf(mon, "size=%" PRIu64 "\n",
|
||||
+ section->value->size);
|
||||
+ }
|
||||
}
|
||||
|
||||
bool sgx_epc_get_section(int section_nr, uint64_t *addr, uint64_t *size)
|
||||
diff --git a/qapi/misc-target.json b/qapi/misc-target.json
|
||||
index 5aa2b95b7d..1022aa0184 100644
|
||||
--- a/qapi/misc-target.json
|
||||
+++ b/qapi/misc-target.json
|
||||
@@ -337,6 +337,21 @@
|
||||
'if': 'TARGET_ARM' }
|
||||
|
||||
|
||||
+##
|
||||
+# @SGXEPCSection:
|
||||
+#
|
||||
+# Information about intel SGX EPC section info
|
||||
+#
|
||||
+# @node: the numa node
|
||||
+#
|
||||
+# @size: the size of epc section
|
||||
+#
|
||||
+# Since: 6.2
|
||||
+##
|
||||
+{ 'struct': 'SGXEPCSection',
|
||||
+ 'data': { 'node': 'int',
|
||||
+ 'size': 'uint64'}}
|
||||
+
|
||||
##
|
||||
# @SGXInfo:
|
||||
#
|
||||
@@ -350,7 +365,7 @@
|
||||
#
|
||||
# @flc: true if FLC is supported
|
||||
#
|
||||
-# @section-size: The EPC section size for guest
|
||||
+# @sections: The EPC sections info for guest
|
||||
#
|
||||
# Since: 6.2
|
||||
##
|
||||
@@ -359,7 +374,7 @@
|
||||
'sgx1': 'bool',
|
||||
'sgx2': 'bool',
|
||||
'flc': 'bool',
|
||||
- 'section-size': 'uint64'},
|
||||
+ 'sections': ['SGXEPCSection']},
|
||||
'if': 'TARGET_I386' }
|
||||
|
||||
##
|
||||
--
|
||||
2.27.0
|
||||
|
213
kvm-qapi-Cleanup-SGX-related-comments-and-restore-sectio.patch
Normal file
213
kvm-qapi-Cleanup-SGX-related-comments-and-restore-sectio.patch
Normal file
@ -0,0 +1,213 @@
|
||||
From a6a327ae392c02b8e8c75b5d702d929ff8fe408d Mon Sep 17 00:00:00 2001
|
||||
From: Yang Zhong <yang.zhong@intel.com>
|
||||
Date: Thu, 20 Jan 2022 17:31:04 -0500
|
||||
Subject: [PATCH 05/12] qapi: Cleanup SGX related comments and restore
|
||||
@section-size
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Paul Lai <plai@redhat.com>
|
||||
RH-MergeRequest: 65: Enable SGX and add SGX Numa support
|
||||
RH-Commit: [5/5] 0d3b9f37cd3cce202050ba3bd51eef4410ef3d38
|
||||
RH-Bugzilla: 2033708
|
||||
RH-Acked-by: Paolo Bonzini <None>
|
||||
RH-Acked-by: Bandan Das <None>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
|
||||
The SGX NUMA patches were merged into Qemu 7.0 release, we need
|
||||
clarify detailed version history information and also change
|
||||
some related comments, which make SGX related comments clearer.
|
||||
|
||||
The QMP command schema promises backwards compatibility as standard.
|
||||
We temporarily restore "@section-size", which can avoid incompatible
|
||||
API breakage. The "@section-size" will be deprecated in 7.2 version.
|
||||
|
||||
Suggested-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Signed-off-by: Yang Zhong <yang.zhong@intel.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
Message-Id: <20220120223104.437161-1-yang.zhong@intel.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Signed-off-by: Paul Lai <plai@redhat.com>
|
||||
---
|
||||
docs/about/deprecated.rst | 13 +++++++++++++
|
||||
hw/i386/sgx.c | 11 +++++++++--
|
||||
qapi/machine.json | 4 ++--
|
||||
qapi/misc-target.json | 22 +++++++++++++++++-----
|
||||
4 files changed, 41 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst
|
||||
index ff7488cb63..33925edf45 100644
|
||||
--- a/docs/about/deprecated.rst
|
||||
+++ b/docs/about/deprecated.rst
|
||||
@@ -270,6 +270,19 @@ accepted incorrect commands will return an error. Users should make sure that
|
||||
all arguments passed to ``device_add`` are consistent with the documented
|
||||
property types.
|
||||
|
||||
+``query-sgx`` return value member ``section-size`` (since 7.0)
|
||||
+''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
||||
+
|
||||
+Member ``section-size`` in return value elements with meta-type ``uint64`` is
|
||||
+deprecated. Use ``sections`` instead.
|
||||
+
|
||||
+
|
||||
+``query-sgx-capabilities`` return value member ``section-size`` (since 7.0)
|
||||
+'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
||||
+
|
||||
+Member ``section-size`` in return value elements with meta-type ``uint64`` is
|
||||
+deprecated. Use ``sections`` instead.
|
||||
+
|
||||
System accelerators
|
||||
-------------------
|
||||
|
||||
diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c
|
||||
index 5de5dd0893..a2b318dd93 100644
|
||||
--- a/hw/i386/sgx.c
|
||||
+++ b/hw/i386/sgx.c
|
||||
@@ -83,7 +83,7 @@ static uint64_t sgx_calc_section_metric(uint64_t low, uint64_t high)
|
||||
((high & MAKE_64BIT_MASK(0, 20)) << 32);
|
||||
}
|
||||
|
||||
-static SGXEPCSectionList *sgx_calc_host_epc_sections(void)
|
||||
+static SGXEPCSectionList *sgx_calc_host_epc_sections(uint64_t *size)
|
||||
{
|
||||
SGXEPCSectionList *head = NULL, **tail = &head;
|
||||
SGXEPCSection *section;
|
||||
@@ -106,6 +106,7 @@ static SGXEPCSectionList *sgx_calc_host_epc_sections(void)
|
||||
section = g_new0(SGXEPCSection, 1);
|
||||
section->node = j++;
|
||||
section->size = sgx_calc_section_metric(ecx, edx);
|
||||
+ *size += section->size;
|
||||
QAPI_LIST_APPEND(tail, section);
|
||||
}
|
||||
|
||||
@@ -156,6 +157,7 @@ SGXInfo *qmp_query_sgx_capabilities(Error **errp)
|
||||
{
|
||||
SGXInfo *info = NULL;
|
||||
uint32_t eax, ebx, ecx, edx;
|
||||
+ uint64_t size = 0;
|
||||
|
||||
int fd = qemu_open_old("/dev/sgx_vepc", O_RDWR);
|
||||
if (fd < 0) {
|
||||
@@ -173,7 +175,8 @@ SGXInfo *qmp_query_sgx_capabilities(Error **errp)
|
||||
info->sgx1 = eax & (1U << 0) ? true : false;
|
||||
info->sgx2 = eax & (1U << 1) ? true : false;
|
||||
|
||||
- info->sections = sgx_calc_host_epc_sections();
|
||||
+ info->sections = sgx_calc_host_epc_sections(&size);
|
||||
+ info->section_size = size;
|
||||
|
||||
close(fd);
|
||||
|
||||
@@ -220,12 +223,14 @@ SGXInfo *qmp_query_sgx(Error **errp)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
+ SGXEPCState *sgx_epc = &pcms->sgx_epc;
|
||||
info = g_new0(SGXInfo, 1);
|
||||
|
||||
info->sgx = true;
|
||||
info->sgx1 = true;
|
||||
info->sgx2 = true;
|
||||
info->flc = true;
|
||||
+ info->section_size = sgx_epc->size;
|
||||
info->sections = sgx_get_epc_sections_list();
|
||||
|
||||
return info;
|
||||
@@ -249,6 +254,8 @@ void hmp_info_sgx(Monitor *mon, const QDict *qdict)
|
||||
info->sgx2 ? "enabled" : "disabled");
|
||||
monitor_printf(mon, "FLC support: %s\n",
|
||||
info->flc ? "enabled" : "disabled");
|
||||
+ monitor_printf(mon, "size: %" PRIu64 "\n",
|
||||
+ info->section_size);
|
||||
|
||||
section_list = info->sections;
|
||||
for (section = section_list; section; section = section->next) {
|
||||
diff --git a/qapi/machine.json b/qapi/machine.json
|
||||
index 16e771affc..a9f33d0f27 100644
|
||||
--- a/qapi/machine.json
|
||||
+++ b/qapi/machine.json
|
||||
@@ -1207,7 +1207,7 @@
|
||||
#
|
||||
# @memdev: memory backend linked with device
|
||||
#
|
||||
-# @node: the numa node
|
||||
+# @node: the numa node (Since: 7.0)
|
||||
#
|
||||
# Since: 6.2
|
||||
##
|
||||
@@ -1288,7 +1288,7 @@
|
||||
#
|
||||
# @memdev: memory backend linked with device
|
||||
#
|
||||
-# @node: the numa node
|
||||
+# @node: the numa node (Since: 7.0)
|
||||
#
|
||||
# Since: 6.2
|
||||
##
|
||||
diff --git a/qapi/misc-target.json b/qapi/misc-target.json
|
||||
index 1022aa0184..4bc45d2474 100644
|
||||
--- a/qapi/misc-target.json
|
||||
+++ b/qapi/misc-target.json
|
||||
@@ -344,9 +344,9 @@
|
||||
#
|
||||
# @node: the numa node
|
||||
#
|
||||
-# @size: the size of epc section
|
||||
+# @size: the size of EPC section
|
||||
#
|
||||
-# Since: 6.2
|
||||
+# Since: 7.0
|
||||
##
|
||||
{ 'struct': 'SGXEPCSection',
|
||||
'data': { 'node': 'int',
|
||||
@@ -365,7 +365,13 @@
|
||||
#
|
||||
# @flc: true if FLC is supported
|
||||
#
|
||||
-# @sections: The EPC sections info for guest
|
||||
+# @section-size: The EPC section size for guest
|
||||
+# Redundant with @sections. Just for backward compatibility.
|
||||
+#
|
||||
+# @sections: The EPC sections info for guest (Since: 7.0)
|
||||
+#
|
||||
+# Features:
|
||||
+# @deprecated: Member @section-size is deprecated. Use @sections instead.
|
||||
#
|
||||
# Since: 6.2
|
||||
##
|
||||
@@ -374,6 +380,8 @@
|
||||
'sgx1': 'bool',
|
||||
'sgx2': 'bool',
|
||||
'flc': 'bool',
|
||||
+ 'section-size': { 'type': 'uint64',
|
||||
+ 'features': [ 'deprecated' ] },
|
||||
'sections': ['SGXEPCSection']},
|
||||
'if': 'TARGET_I386' }
|
||||
|
||||
@@ -390,7 +398,9 @@
|
||||
#
|
||||
# -> { "execute": "query-sgx" }
|
||||
# <- { "return": { "sgx": true, "sgx1" : true, "sgx2" : true,
|
||||
-# "flc": true, "section-size" : 0 } }
|
||||
+# "flc": true, "section-size" : 96468992,
|
||||
+# "sections": [{"node": 0, "size": 67108864},
|
||||
+# {"node": 1, "size": 29360128}]} }
|
||||
#
|
||||
##
|
||||
{ 'command': 'query-sgx', 'returns': 'SGXInfo', 'if': 'TARGET_I386' }
|
||||
@@ -408,7 +418,9 @@
|
||||
#
|
||||
# -> { "execute": "query-sgx-capabilities" }
|
||||
# <- { "return": { "sgx": true, "sgx1" : true, "sgx2" : true,
|
||||
-# "flc": true, "section-size" : 0 } }
|
||||
+# "flc": true, "section-size" : 96468992,
|
||||
+# "section" : [{"node": 0, "size": 67108864},
|
||||
+# {"node": 1, "size": 29360128}]} }
|
||||
#
|
||||
##
|
||||
{ 'command': 'query-sgx-capabilities', 'returns': 'SGXInfo', 'if': 'TARGET_I386' }
|
||||
--
|
||||
2.27.0
|
||||
|
108
kvm-qemu-img-make-is_allocated_sectors-more-efficient.patch
Normal file
108
kvm-qemu-img-make-is_allocated_sectors-more-efficient.patch
Normal file
@ -0,0 +1,108 @@
|
||||
From a221f5a8ed02690687e6709c49ae0e1e01c5f466 Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Date: Fri, 17 Dec 2021 17:46:54 +0100
|
||||
Subject: [PATCH 09/12] qemu-img: make is_allocated_sectors() more efficient
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 70: qemu-img convert: Fix sparseness of output image
|
||||
RH-Commit: [2/2] cc05aa4ac506b57ff9b430c007618cdf1485a03f (kmwolf/centos-qemu-kvm)
|
||||
RH-Bugzilla: 1882917
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Hanna Reitz <hreitz@redhat.com>
|
||||
|
||||
Consider the case when the whole buffer is zero and end is unaligned.
|
||||
|
||||
If i <= tail, we return 1 and do one unaligned WRITE, RMW happens.
|
||||
|
||||
If i > tail, we do on aligned WRITE_ZERO (or skip if target is zeroed)
|
||||
and again one unaligned WRITE, RMW happens.
|
||||
|
||||
Let's do better: don't fragment the whole-zero buffer and report it as
|
||||
ZERO: in case of zeroed target we just do nothing and avoid RMW. If
|
||||
target is not zeroes, one unaligned WRITE_ZERO should not be much worse
|
||||
than one unaligned WRITE.
|
||||
|
||||
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||
Message-Id: <20211217164654.1184218-3-vsementsov@virtuozzo.com>
|
||||
Tested-by: Peter Lieven <pl@kamp.de>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 96054c76ff2db74165385a69f234c57a6bbc941e)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
qemu-img.c | 23 +++++++++++++++++++----
|
||||
tests/qemu-iotests/122.out | 8 ++------
|
||||
2 files changed, 21 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/qemu-img.c b/qemu-img.c
|
||||
index f036a1d428..d7ddfcc528 100644
|
||||
--- a/qemu-img.c
|
||||
+++ b/qemu-img.c
|
||||
@@ -1171,19 +1171,34 @@ static int is_allocated_sectors(const uint8_t *buf, int n, int *pnum,
|
||||
}
|
||||
}
|
||||
|
||||
+ if (i == n) {
|
||||
+ /*
|
||||
+ * The whole buf is the same.
|
||||
+ * No reason to split it into chunks, so return now.
|
||||
+ */
|
||||
+ *pnum = i;
|
||||
+ return !is_zero;
|
||||
+ }
|
||||
+
|
||||
tail = (sector_num + i) & (alignment - 1);
|
||||
if (tail) {
|
||||
if (is_zero && i <= tail) {
|
||||
- /* treat unallocated areas which only consist
|
||||
- * of a small tail as allocated. */
|
||||
+ /*
|
||||
+ * For sure next sector after i is data, and it will rewrite this
|
||||
+ * tail anyway due to RMW. So, let's just write data now.
|
||||
+ */
|
||||
is_zero = false;
|
||||
}
|
||||
if (!is_zero) {
|
||||
- /* align up end offset of allocated areas. */
|
||||
+ /* If possible, align up end offset of allocated areas. */
|
||||
i += alignment - tail;
|
||||
i = MIN(i, n);
|
||||
} else {
|
||||
- /* align down end offset of zero areas. */
|
||||
+ /*
|
||||
+ * For sure next sector after i is data, and it will rewrite this
|
||||
+ * tail anyway due to RMW. Better is avoid RMW and write zeroes up
|
||||
+ * to aligned bound.
|
||||
+ */
|
||||
i -= tail;
|
||||
}
|
||||
}
|
||||
diff --git a/tests/qemu-iotests/122.out b/tests/qemu-iotests/122.out
|
||||
index 69b8e8b803..e18766e167 100644
|
||||
--- a/tests/qemu-iotests/122.out
|
||||
+++ b/tests/qemu-iotests/122.out
|
||||
@@ -201,9 +201,7 @@ convert -S 4k
|
||||
{ "start": 8192, "length": 4096, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
|
||||
{ "start": 12288, "length": 4096, "depth": 0, "present": false, "zero": true, "data": false},
|
||||
{ "start": 16384, "length": 4096, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
|
||||
-{ "start": 20480, "length": 46080, "depth": 0, "present": false, "zero": true, "data": false},
|
||||
-{ "start": 66560, "length": 1024, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
|
||||
-{ "start": 67584, "length": 67041280, "depth": 0, "present": false, "zero": true, "data": false}]
|
||||
+{ "start": 20480, "length": 67088384, "depth": 0, "present": false, "zero": true, "data": false}]
|
||||
|
||||
convert -c -S 4k
|
||||
[{ "start": 0, "length": 1024, "depth": 0, "present": true, "zero": false, "data": true},
|
||||
@@ -215,9 +213,7 @@ convert -c -S 4k
|
||||
|
||||
convert -S 8k
|
||||
[{ "start": 0, "length": 24576, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
|
||||
-{ "start": 24576, "length": 41984, "depth": 0, "present": false, "zero": true, "data": false},
|
||||
-{ "start": 66560, "length": 1024, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
|
||||
-{ "start": 67584, "length": 67041280, "depth": 0, "present": false, "zero": true, "data": false}]
|
||||
+{ "start": 24576, "length": 67084288, "depth": 0, "present": false, "zero": true, "data": false}]
|
||||
|
||||
convert -c -S 8k
|
||||
[{ "start": 0, "length": 1024, "depth": 0, "present": true, "zero": false, "data": true},
|
||||
--
|
||||
2.27.0
|
||||
|
@ -144,7 +144,7 @@ Obsoletes: %{name}-block-iscsi <= %{version} \
|
||||
Summary: QEMU is a machine emulator and virtualizer
|
||||
Name: qemu-kvm
|
||||
Version: 6.2.0
|
||||
Release: 7%{?rcrel}%{?dist}%{?cc_suffix}
|
||||
Release: 8%{?rcrel}%{?dist}%{?cc_suffix}
|
||||
# Epoch because we pushed a qemu-1.0 package. AIUI this can't ever be dropped
|
||||
# Epoch 15 used for RHEL 8
|
||||
# Epoch 17 used for RHEL 9 (due to release versioning offset in RHEL 8.5)
|
||||
@ -227,6 +227,30 @@ Patch41: kvm-virtiofsd-Drop-membership-of-all-supplementary-group.patch
|
||||
Patch42: kvm-block-rbd-fix-handling-of-holes-in-.bdrv_co_block_st.patch
|
||||
# For bz#2034791 - Booting from Local Snapshot Core Dumped Whose Backing File Is Based on RBD
|
||||
Patch43: kvm-block-rbd-workaround-for-ceph-issue-53784.patch
|
||||
# For bz#2033708 - [Intel 9.0 Feat] qemu-kvm: SGX 1.5 (SGX1 + Flexible Launch Control) support
|
||||
Patch44: kvm-numa-Enable-numa-for-SGX-EPC-sections.patch
|
||||
# For bz#2033708 - [Intel 9.0 Feat] qemu-kvm: SGX 1.5 (SGX1 + Flexible Launch Control) support
|
||||
Patch45: kvm-numa-Support-SGX-numa-in-the-monitor-and-Libvirt-int.patch
|
||||
# For bz#2033708 - [Intel 9.0 Feat] qemu-kvm: SGX 1.5 (SGX1 + Flexible Launch Control) support
|
||||
Patch46: kvm-doc-Add-the-SGX-numa-description.patch
|
||||
# For bz#2033708 - [Intel 9.0 Feat] qemu-kvm: SGX 1.5 (SGX1 + Flexible Launch Control) support
|
||||
Patch47: kvm-Enable-SGX-RH-Only.patch
|
||||
# For bz#2033708 - [Intel 9.0 Feat] qemu-kvm: SGX 1.5 (SGX1 + Flexible Launch Control) support
|
||||
Patch48: kvm-qapi-Cleanup-SGX-related-comments-and-restore-sectio.patch
|
||||
# For bz#2041461 - Inconsistent block status reply in qemu-nbd
|
||||
Patch49: kvm-block-io-Update-BSC-only-if-want_zero-is-true.patch
|
||||
# For bz#2041461 - Inconsistent block status reply in qemu-nbd
|
||||
Patch50: kvm-iotests-block-status-cache-New-test.patch
|
||||
# For bz#1882917 - the target image size is incorrect when converting a badly fragmented file
|
||||
Patch51: kvm-iotests-Test-qemu-img-convert-of-zeroed-data-cluster.patch
|
||||
# For bz#1882917 - the target image size is incorrect when converting a badly fragmented file
|
||||
Patch52: kvm-qemu-img-make-is_allocated_sectors-more-efficient.patch
|
||||
# For bz#2040123 - Qemu core dumped when do block-stream to a snapshot node on non-enough space storage
|
||||
Patch53: kvm-block-backend-prevent-dangling-BDS-pointers-across-a.patch
|
||||
# For bz#2040123 - Qemu core dumped when do block-stream to a snapshot node on non-enough space storage
|
||||
Patch54: kvm-iotests-stream-error-on-reset-New-test.patch
|
||||
# For bz#2042481 - [aarch64] Launch guest with "default-bus-bypass-iommu=off,iommu=smmuv3" and "iommu_platform=on", guest hangs after system_reset
|
||||
Patch55: kvm-hw-arm-smmuv3-Fix-device-reset.patch
|
||||
|
||||
# Source-git patches
|
||||
|
||||
@ -1285,6 +1309,30 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Mon Feb 14 2022 Miroslav Rezanina <mrezanin@redhat.com> - 6.2.0-8
|
||||
- kvm-numa-Enable-numa-for-SGX-EPC-sections.patch [bz#2033708]
|
||||
- kvm-numa-Support-SGX-numa-in-the-monitor-and-Libvirt-int.patch [bz#2033708]
|
||||
- kvm-doc-Add-the-SGX-numa-description.patch [bz#2033708]
|
||||
- kvm-Enable-SGX-RH-Only.patch [bz#2033708]
|
||||
- kvm-qapi-Cleanup-SGX-related-comments-and-restore-sectio.patch [bz#2033708]
|
||||
- kvm-block-io-Update-BSC-only-if-want_zero-is-true.patch [bz#2041461]
|
||||
- kvm-iotests-block-status-cache-New-test.patch [bz#2041461]
|
||||
- kvm-iotests-Test-qemu-img-convert-of-zeroed-data-cluster.patch [bz#1882917]
|
||||
- kvm-qemu-img-make-is_allocated_sectors-more-efficient.patch [bz#1882917]
|
||||
- kvm-block-backend-prevent-dangling-BDS-pointers-across-a.patch [bz#2040123]
|
||||
- kvm-iotests-stream-error-on-reset-New-test.patch [bz#2040123]
|
||||
- kvm-hw-arm-smmuv3-Fix-device-reset.patch [bz#2042481]
|
||||
- Resolves: bz#2033708
|
||||
([Intel 9.0 Feat] qemu-kvm: SGX 1.5 (SGX1 + Flexible Launch Control) support)
|
||||
- Resolves: bz#2041461
|
||||
(Inconsistent block status reply in qemu-nbd)
|
||||
- Resolves: bz#1882917
|
||||
(the target image size is incorrect when converting a badly fragmented file)
|
||||
- Resolves: bz#2040123
|
||||
(Qemu core dumped when do block-stream to a snapshot node on non-enough space storage)
|
||||
- Resolves: bz#2042481
|
||||
([aarch64] Launch guest with "default-bus-bypass-iommu=off,iommu=smmuv3" and "iommu_platform=on", guest hangs after system_reset)
|
||||
|
||||
* Mon Feb 07 2022 Miroslav Rezanina <mrezanin@redhat.com> - 6.2.0-7
|
||||
- kvm-qemu-storage-daemon-Add-vhost-user-blk-help.patch [bz#1962088]
|
||||
- kvm-qemu-storage-daemon-Fix-typo-in-vhost-user-blk-help.patch [bz#1962088]
|
||||
|
Loading…
Reference in New Issue
Block a user