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 <js...@redhat.com> --- tests/ahci-test.c | 3 +++ tests/libqos/ahci.c | 18 ++++++++++++++++++ tests/libqos/ahci.h | 1 + tests/libqos/malloc.c | 5 +++++ tests/libqos/malloc.h | 1 + 5 files changed, 28 insertions(+) diff --git a/tests/ahci-test.c b/tests/ahci-test.c index 47491fe..3a0131a 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 e73205b..87a9e62 100644 --- a/tests/libqos/ahci.c +++ b/tests/libqos/ahci.c @@ -133,6 +133,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 px, cx; + + for (px = 0; px < 32; ++px) { + if (ahci->port[px].fb) { + ahci_free(ahci, ahci->port[px].fb); + } + if (ahci->port[px].clb) { + for (cx = 0; cx < 32; cx++) { + ahci_destroy_command(ahci, px, cx); + } + ahci_free(ahci, ahci->port[px].clb); + } + } +} + /*** Logical Device Initialization ***/ /** diff --git a/tests/libqos/ahci.h b/tests/libqos/ahci.h index 3c4f478..2d25957 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 8cce1ba..ad283f6 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 a39dba4..71ac407 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 -- 1.9.3