From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35932) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YOZbt-00057H-TU for qemu-devel@nongnu.org; Thu, 19 Feb 2015 17:30:18 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YOZbn-0003xb-4x for qemu-devel@nongnu.org; Thu, 19 Feb 2015 17:30:17 -0500 Received: from mx1.redhat.com ([209.132.183.28]:55571) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YOZbm-0003xX-SM for qemu-devel@nongnu.org; Thu, 19 Feb 2015 17:30:11 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t1JMUAYT024311 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 19 Feb 2015 17:30:10 -0500 From: John Snow Date: Thu, 19 Feb 2015 17:30:01 -0500 Message-Id: <1424385003-9412-7-git-send-email-jsnow@redhat.com> In-Reply-To: <1424385003-9412-1-git-send-email-jsnow@redhat.com> References: <1424385003-9412-1-git-send-email-jsnow@redhat.com> Subject: [Qemu-devel] [PATCH 6/8] qtest/ahci: add fragmented dma test List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, John Snow , armbru@redhat.com, stefanha@redhat.com Test what happens when we try to use extremely short PRDTs to accomplish a small data transfer. Signed-off-by: John Snow --- tests/ahci-test.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/tests/ahci-test.c b/tests/ahci-test.c index cef8e2f..0d4a3df 100644 --- a/tests/ahci-test.c +++ b/tests/ahci-test.c @@ -851,6 +851,63 @@ static void test_identify(void) 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 */ @@ -1053,6 +1110,8 @@ int main(int argc, char **argv) } } + qtest_add_func("/ahci/io/dma/lba28/fragmented", test_dma_fragmented); + ret = g_test_run(); /* Cleanup */ -- 1.9.3