On 2025/05/02 12:04, Nicholas Piggin wrote:
ahci-test has a bunch of tests where the pci bar was not mapped. Avoid
unmapping it in these cases, to keep iomaps balanced.

Cc: Michael S. Tsirkin <m...@redhat.com>
Cc: Marcel Apfelbaum <marcel.apfelb...@gmail.com>
Cc: Akihiko Odaki <akihiko.od...@daynix.com>
Cc: Fabiano Rosas <faro...@suse.de>
Signed-off-by: Nicholas Piggin <npig...@gmail.com>
---
  tests/qtest/libqos/ahci.h | 1 +
  tests/qtest/ahci-test.c   | 7 ++++++-
  tests/qtest/libqos/ahci.c | 9 +++++++++
  3 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/tests/qtest/libqos/ahci.h b/tests/qtest/libqos/ahci.h
index f610bd32a5f..d639692aac4 100644
--- a/tests/qtest/libqos/ahci.h
+++ b/tests/qtest/libqos/ahci.h
@@ -342,6 +342,7 @@ typedef struct AHCIQState {
      uint32_t cap;
      uint32_t cap2;
      AHCIPortQState port[32];
+    bool pci_enabled;

The following patch also adds a similar variable for virtio and has a slightly different semantics; qvirtio_pci_device_disable() is no-op but ahci_pci_disable() aborts when no-op.

A bool flag can be added to QPCIBar instead so that we can enforce the "no-op if not mapped" semantics everywhere consistently with less code.

      bool enabled;
  } AHCIQState;
diff --git a/tests/qtest/ahci-test.c b/tests/qtest/ahci-test.c
index 36caa7b2999..7d5f73ac40b 100644
--- a/tests/qtest/ahci-test.c
+++ b/tests/qtest/ahci-test.c
@@ -85,6 +85,8 @@ static void verify_state(AHCIQState *ahci, uint64_t hba_old)
      uint64_t hba_base;
      AHCICommandHeader cmd;
+ g_assert_cmphex(ahci->hba_bar.addr, ==, hba_old);
+
      ahci_fingerprint = qpci_config_readl(ahci->dev, PCI_VENDOR_ID);
      g_assert_cmphex(ahci_fingerprint, ==, ahci->fingerprint);
@@ -198,7 +200,9 @@ static void ahci_shutdown(AHCIQState *ahci)
  {
      QOSState *qs = ahci->parent;
- ahci_pci_disable(ahci);
+    if (ahci->pci_enabled) {
+        ahci_pci_disable(ahci);
+    }
      ahci_clean_mem(ahci);
      free_ahci_device(ahci->dev);
      g_free(ahci);
@@ -1421,6 +1425,7 @@ static void test_reset(void)
          ahci_set(ahci, AHCI_GHC, AHCI_GHC_HR);
          stop_ahci_device(ahci);
          ahci_clean_mem(ahci);
+        start_ahci_device(ahci);
      }
ahci_shutdown(ahci);
diff --git a/tests/qtest/libqos/ahci.c b/tests/qtest/libqos/ahci.c
index bd1994a9208..cc4f5b7b534 100644
--- a/tests/qtest/libqos/ahci.c
+++ b/tests/qtest/libqos/ahci.c
@@ -215,17 +215,25 @@ void ahci_pci_disable(AHCIQState *ahci)
   */
  void start_ahci_device(AHCIQState *ahci)
  {
+    g_assert(!ahci->pci_enabled);
+
      /* Map AHCI's ABAR (BAR5) */
      ahci->hba_bar = qpci_iomap(ahci->dev, 5, &ahci->barsize);
/* turns on pci.cmd.iose, pci.cmd.mse and pci.cmd.bme */
      qpci_device_enable(ahci->dev);
+
+    ahci->pci_enabled = true;
  }
void stop_ahci_device(AHCIQState *ahci)
  {
+    g_assert(ahci->pci_enabled);
+
      /* Unmap AHCI's ABAR */
      qpci_iounmap(ahci->dev, ahci->hba_bar);
+
+    ahci->pci_enabled = false;
  }
/**
@@ -249,6 +257,7 @@ void ahci_hba_enable(AHCIQState *ahci)
      uint8_t num_cmd_slots;
g_assert(ahci != NULL);
+    g_assert(ahci->pci_enabled);
/* Set GHC.AE to 1 */
      ahci_set(ahci, AHCI_GHC, AHCI_GHC_AE);


Reply via email to