mirror of https://gitee.com/openkylin/qemu.git
qtest/ahci: add fragmented dma test
Test what happens when we try to use extremely short PRDTs to accomplish a small data transfer. Signed-off-by: John Snow <jsnow@redhat.com> Message-id: 1424905602-24715-7-git-send-email-jsnow@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
bda39dc241
commit
e0c59cc760
|
@ -851,6 +851,63 @@ static void test_identify(void)
|
||||||
ahci_shutdown(ahci);
|
ahci_shutdown(ahci);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fragmented DMA test: Perform a standard 4K DMA read/write
|
||||||
|
* test, but make sure the physical regions are fragmented to
|
||||||
|
* be very small, each just 32 bytes, to see how AHCI performs
|
||||||
|
* with chunks defined to be much less than a sector.
|
||||||
|
*/
|
||||||
|
static void test_dma_fragmented(void)
|
||||||
|
{
|
||||||
|
AHCIQState *ahci;
|
||||||
|
AHCICommand *cmd;
|
||||||
|
uint8_t px;
|
||||||
|
size_t bufsize = 4096;
|
||||||
|
unsigned char *tx = g_malloc(bufsize);
|
||||||
|
unsigned char *rx = g_malloc0(bufsize);
|
||||||
|
unsigned i;
|
||||||
|
uint64_t ptr;
|
||||||
|
|
||||||
|
ahci = ahci_boot_and_enable();
|
||||||
|
px = ahci_port_select(ahci);
|
||||||
|
ahci_port_clear(ahci, px);
|
||||||
|
|
||||||
|
/* create pattern */
|
||||||
|
for (i = 0; i < bufsize; i++) {
|
||||||
|
tx[i] = (bufsize - i);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create a DMA buffer in guest memory, and write our pattern to it. */
|
||||||
|
ptr = guest_alloc(ahci->parent->alloc, bufsize);
|
||||||
|
g_assert(ptr);
|
||||||
|
memwrite(ptr, tx, bufsize);
|
||||||
|
|
||||||
|
cmd = ahci_command_create(CMD_WRITE_DMA);
|
||||||
|
ahci_command_adjust(cmd, 0, ptr, bufsize, 32);
|
||||||
|
ahci_command_commit(ahci, cmd, px);
|
||||||
|
ahci_command_issue(ahci, cmd);
|
||||||
|
ahci_command_verify(ahci, cmd);
|
||||||
|
g_free(cmd);
|
||||||
|
|
||||||
|
cmd = ahci_command_create(CMD_READ_DMA);
|
||||||
|
ahci_command_adjust(cmd, 0, ptr, bufsize, 32);
|
||||||
|
ahci_command_commit(ahci, cmd, px);
|
||||||
|
ahci_command_issue(ahci, cmd);
|
||||||
|
ahci_command_verify(ahci, cmd);
|
||||||
|
g_free(cmd);
|
||||||
|
|
||||||
|
/* Read back the guest's receive buffer into local memory */
|
||||||
|
memread(ptr, rx, bufsize);
|
||||||
|
guest_free(ahci->parent->alloc, ptr);
|
||||||
|
|
||||||
|
g_assert_cmphex(memcmp(tx, rx, bufsize), ==, 0);
|
||||||
|
|
||||||
|
ahci_shutdown(ahci);
|
||||||
|
|
||||||
|
g_free(rx);
|
||||||
|
g_free(tx);
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
/* AHCI I/O Test Matrix Definitions */
|
/* AHCI I/O Test Matrix Definitions */
|
||||||
|
|
||||||
|
@ -1054,6 +1111,8 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qtest_add_func("/ahci/io/dma/lba28/fragmented", test_dma_fragmented);
|
||||||
|
|
||||||
ret = g_test_run();
|
ret = g_test_run();
|
||||||
|
|
||||||
/* Cleanup */
|
/* Cleanup */
|
||||||
|
|
Loading…
Reference in New Issue