diff options
author | John Snow <jsnow@redhat.com> | 2015-02-05 12:41:28 -0500 |
---|---|---|
committer | Stefan Hajnoczi <stefanha@redhat.com> | 2015-02-16 15:07:17 +0000 |
commit | 259342d34dbdfb304374f569feec26317edd97c9 (patch) | |
tree | 38487465cbf6252fe1ee0b8214471184d932c78d /tests | |
parent | ae029620173239f3643925299790ecc5e1d72db1 (diff) |
libqos/ahci: Add ahci_clean_mem
Clean up guest memory being used in ahci_clean_mem, to be
called during ahci_shutdown. With all guest memory leaks removed,
add an option to the allocator to throw an assertion if a leak
occurs.
This test adds some sanity to both the AHCI library and the
allocator.
Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Message-id: 1423158090-25580-18-git-send-email-jsnow@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/ahci-test.c | 3 | ||||
-rw-r--r-- | tests/libqos/ahci.c | 18 | ||||
-rw-r--r-- | tests/libqos/ahci.h | 1 | ||||
-rw-r--r-- | tests/libqos/malloc.c | 5 | ||||
-rw-r--r-- | tests/libqos/malloc.h | 1 |
5 files changed, 28 insertions, 0 deletions
diff --git a/tests/ahci-test.c b/tests/ahci-test.c index 47491fe96c..3a0131aa66 100644 --- a/tests/ahci-test.c +++ b/tests/ahci-test.c @@ -86,6 +86,7 @@ static AHCIQState *ahci_boot(void) "-device ide-hd,drive=drive0 " "-global ide-hd.ver=%s"; s->parent = qtest_pc_boot(cli, tmp_path, "testdisk", "version"); + alloc_set_flags(s->parent->alloc, ALLOC_LEAK_ASSERT); /* Verify that we have an AHCI device present. */ s->dev = get_ahci_device(&s->fingerprint); @@ -99,6 +100,8 @@ static AHCIQState *ahci_boot(void) static void ahci_shutdown(AHCIQState *ahci) { QOSState *qs = ahci->parent; + + ahci_clean_mem(ahci); free_ahci_device(ahci->dev); g_free(ahci); qtest_shutdown(qs); diff --git a/tests/libqos/ahci.c b/tests/libqos/ahci.c index 85222248b6..a6105c750f 100644 --- a/tests/libqos/ahci.c +++ b/tests/libqos/ahci.c @@ -130,6 +130,24 @@ void free_ahci_device(QPCIDevice *dev) qpci_free_pc(pcibus); } +/* Free all memory in-use by the AHCI device. */ +void ahci_clean_mem(AHCIQState *ahci) +{ + uint8_t port, slot; + + for (port = 0; port < 32; ++port) { + if (ahci->port[port].fb) { + ahci_free(ahci, ahci->port[port].fb); + } + if (ahci->port[port].clb) { + for (slot = 0; slot < 32; slot++) { + ahci_destroy_command(ahci, port, slot); + } + ahci_free(ahci, ahci->port[port].clb); + } + } +} + /*** Logical Device Initialization ***/ /** diff --git a/tests/libqos/ahci.h b/tests/libqos/ahci.h index 9133033f1c..39b99d3658 100644 --- a/tests/libqos/ahci.h +++ b/tests/libqos/ahci.h @@ -499,6 +499,7 @@ uint64_t ahci_alloc(AHCIQState *ahci, size_t bytes); void ahci_free(AHCIQState *ahci, uint64_t addr); QPCIDevice *get_ahci_device(uint32_t *fingerprint); void free_ahci_device(QPCIDevice *dev); +void ahci_clean_mem(AHCIQState *ahci); void ahci_pci_enable(AHCIQState *ahci); void start_ahci_device(AHCIQState *ahci); void ahci_hba_enable(AHCIQState *ahci); diff --git a/tests/libqos/malloc.c b/tests/libqos/malloc.c index 42e34345ad..67f31902fd 100644 --- a/tests/libqos/malloc.c +++ b/tests/libqos/malloc.c @@ -324,3 +324,8 @@ void alloc_set_page_size(QGuestAllocator *allocator, size_t page_size) g_assert(is_power_of_2(page_size)); allocator->page_size = page_size; } + +void alloc_set_flags(QGuestAllocator *allocator, QAllocOpts opts) +{ + allocator->opts |= opts; +} diff --git a/tests/libqos/malloc.h b/tests/libqos/malloc.h index a39dba49b0..71ac407dcd 100644 --- a/tests/libqos/malloc.h +++ b/tests/libqos/malloc.h @@ -36,5 +36,6 @@ QGuestAllocator *alloc_init(uint64_t start, uint64_t end); QGuestAllocator *alloc_init_flags(QAllocOpts flags, uint64_t start, uint64_t end); void alloc_set_page_size(QGuestAllocator *allocator, size_t page_size); +void alloc_set_flags(QGuestAllocator *allocator, QAllocOpts opts); #endif |