- kvm-scsi-change-buf_size-to-unsigned-int-in-scsi_SG_IO.patch [RHEL-158244] - kvm-scsi-handle-reservation-changes-across-migration.patch [RHEL-158244] - kvm-blkdebug-Add-delay-ns-option.patch [RHEL-190701] - kvm-block-Add-blk_co_start-end_request-and-BDRV_REQ_NO_Q.patch [RHEL-190701] - kvm-block-Add-flags-parameter-to-blk_-_pdiscard.patch [RHEL-190701] - kvm-ide-Minimal-fix-for-deadlock-between-TRIM-and-drain.patch [RHEL-190701] - kvm-ide-Clean-up-ide_trim_co_entry-to-be-idiomatic-corou.patch [RHEL-190701] - kvm-ide-test-Factor-out-wait_dma_completion.patch [RHEL-190701] - kvm-ide-test-Test-reset-during-TRIM.patch [RHEL-190701] - kvm-spec-Install-qtests-into-qemu-kvm-tests-package.patch [RHEL-190701] - kvm-migration-introduce-MIGRATION_STATUS_FAILING.patch [RHEL-45628] - kvm-s390x-css-limit-number-of-CHPIDs-in-description.patch [RHEL-193033] - kvm-s390x-ioinst-Require-strict-length-and-format-for-SE.patch [RHEL-193033] - kvm-s390x-pci-Shrink-RPCIT-ranges-to-registered-window.patch [RHEL-193033] - kvm-s390x-pci-Tighten-region-detection-for-BAR-read-writ.patch [RHEL-193033] - kvm-s390x-sclp-reject-invalid-write-event-data-headers.patch [RHEL-193033] - kvm-s390x-kvm-clamp-stsi-3.2.2-size.patch [RHEL-193033] - kvm-s390x-sclp-prevent-re-reading-the-sclp-header.patch [RHEL-193033] - kvm-s390x-sclpcpi-check-event-length-field-before-readin.patch [RHEL-193033] - kvm-s390x-css-firm-up-handling-of-chained-TIC-CCWs.patch [RHEL-193033] - Resolves: RHEL-158244 (live migration failed or get failed WSFC test result during WSFC testing [rhel-9.9]) - Resolves: RHEL-190701 (qemu-kvm hung during drain after double pause [rhel-9]) - Resolves: RHEL-45628 (qemu-kvm crashes after kill virtproxyd on destination host during migration [RHEL-9.9]) - Resolves: RHEL-193033 (RHEL9.4 - qemu s390x: interface harding fixes)
92 lines
3.3 KiB
Diff
92 lines
3.3 KiB
Diff
From 05f62e0b737a973069603cf4b89e400d51154afa Mon Sep 17 00:00:00 2001
|
|
From: Kevin Wolf <kwolf@redhat.com>
|
|
Date: Tue, 21 Apr 2026 18:11:31 +0200
|
|
Subject: [PATCH 08/20] ide-test: Factor out wait_dma_completion()
|
|
|
|
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
|
RH-MergeRequest: 507: ide: Fix deadlock between TRIM and drain
|
|
RH-Jira: RHEL-190701
|
|
RH-Acked-by: German Maglione <None>
|
|
RH-Acked-by: Hanna Czenczek <hreitz@redhat.com>
|
|
RH-Commit: [6/8] 61599fda86b004ed7a256a284bdd8bd3781b5d88 (kmwolf/centos-qemu-kvm)
|
|
|
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
Message-ID: <20260421161132.99878-7-kwolf@redhat.com>
|
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
(cherry picked from commit 92854c9c7539bdbf4f9c1abb33dd3ba59ff91e58)
|
|
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
|
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
---
|
|
tests/qtest/ide-test.c | 48 +++++++++++++++++++++++++-----------------
|
|
1 file changed, 29 insertions(+), 19 deletions(-)
|
|
|
|
diff --git a/tests/qtest/ide-test.c b/tests/qtest/ide-test.c
|
|
index ceee444a9e..c6dcb2c074 100644
|
|
--- a/tests/qtest/ide-test.c
|
|
+++ b/tests/qtest/ide-test.c
|
|
@@ -200,6 +200,34 @@ static uint64_t trim_range_le(uint64_t sector, uint16_t count)
|
|
return cpu_to_le64(((uint64_t)count << 48) + sector);
|
|
}
|
|
|
|
+static uint8_t wait_dma_completion(QTestState *qts, QPCIDevice *dev,
|
|
+ QPCIBar bmdma_bar, QPCIBar ide_bar)
|
|
+{
|
|
+ uint8_t status;
|
|
+
|
|
+ /* Wait for the DMA transfer to complete */
|
|
+ do {
|
|
+ status = qpci_io_readb(dev, bmdma_bar, bmreg_status);
|
|
+ } while ((status & (BM_STS_ACTIVE | BM_STS_INTR)) == BM_STS_ACTIVE);
|
|
+
|
|
+ g_assert_cmpint(qtest_get_irq(qts, IDE_PRIMARY_IRQ), ==,
|
|
+ !!(status & BM_STS_INTR));
|
|
+
|
|
+ /* Check IDE status code */
|
|
+ assert_bit_set(qpci_io_readb(dev, ide_bar, reg_status), DRDY);
|
|
+ assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), BSY | DRQ);
|
|
+
|
|
+ /* Reading the status register clears the IRQ */
|
|
+ g_assert(!qtest_get_irq(qts, IDE_PRIMARY_IRQ));
|
|
+
|
|
+ /* Stop DMA transfer if still active */
|
|
+ if (status & BM_STS_ACTIVE) {
|
|
+ qpci_io_writeb(dev, bmdma_bar, bmreg_cmd, 0);
|
|
+ }
|
|
+
|
|
+ return status;
|
|
+}
|
|
+
|
|
static int send_dma_request(QTestState *qts, int cmd, uint64_t sector,
|
|
int nb_sectors, PrdtEntry *prdt, int prdt_entries,
|
|
void(*post_exec)(QPCIDevice *dev, QPCIBar ide_bar,
|
|
@@ -280,25 +308,7 @@ static int send_dma_request(QTestState *qts, int cmd, uint64_t sector,
|
|
qpci_io_writeb(dev, bmdma_bar, bmreg_cmd, 0);
|
|
}
|
|
|
|
- /* Wait for the DMA transfer to complete */
|
|
- do {
|
|
- status = qpci_io_readb(dev, bmdma_bar, bmreg_status);
|
|
- } while ((status & (BM_STS_ACTIVE | BM_STS_INTR)) == BM_STS_ACTIVE);
|
|
-
|
|
- g_assert_cmpint(qtest_get_irq(qts, IDE_PRIMARY_IRQ), ==,
|
|
- !!(status & BM_STS_INTR));
|
|
-
|
|
- /* Check IDE status code */
|
|
- assert_bit_set(qpci_io_readb(dev, ide_bar, reg_status), DRDY);
|
|
- assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), BSY | DRQ);
|
|
-
|
|
- /* Reading the status register clears the IRQ */
|
|
- g_assert(!qtest_get_irq(qts, IDE_PRIMARY_IRQ));
|
|
-
|
|
- /* Stop DMA transfer if still active */
|
|
- if (status & BM_STS_ACTIVE) {
|
|
- qpci_io_writeb(dev, bmdma_bar, bmreg_cmd, 0);
|
|
- }
|
|
+ status = wait_dma_completion(qts, dev, bmdma_bar, ide_bar);
|
|
|
|
free_pci_device(dev);
|
|
|
|
--
|
|
2.52.0
|
|
|