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>
This commit is contained in:
parent
ae02962017
commit
259342d34d
@ -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);
|
||||
|
@ -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 ***/
|
||||
|
||||
/**
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user