From cd75c139869ea1fa98eeaf2d8b7004d8da0e1bbe Mon Sep 17 00:00:00 2001 From: John Snow Date: Thu, 19 Mar 2015 20:24:16 -0400 Subject: [PATCH] ahci-test: improve rw buffer patterns MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit My pattern was cyclical every 256 bytes, so it missed a fairly obvious failure case. Add some rand() pepper into the test pattern, and for large patterns that exceed 256 sectors, start writing an ID per-sector so that we never generate identical sector patterns. Signed-off-by: John Snow Signed-off-by: Andreas Färber --- tests/ahci-test.c | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/tests/ahci-test.c b/tests/ahci-test.c index cf0b98b..82e2efd 100644 --- a/tests/ahci-test.c +++ b/tests/ahci-test.c @@ -68,6 +68,32 @@ static void string_bswap16(uint16_t *s, size_t bytes) } } +static void generate_pattern(void *buffer, size_t len, size_t cycle_len) +{ + int i, j; + unsigned char *tx = (unsigned char *)buffer; + unsigned char p; + size_t *sx; + + /* Write an indicative pattern that varies and is unique per-cycle */ + p = rand() % 256; + for (i = j = 0; i < len; i++, j++) { + tx[i] = p; + if (j % cycle_len == 0) { + p = rand() % 256; + } + } + + /* force uniqueness by writing an id per-cycle */ + for (i = 0; i < len / cycle_len; i++) { + j = i * cycle_len; + if (j + sizeof(*sx) <= len) { + sx = (size_t *)&tx[j]; + *sx = i; + } + } +} + /*** Test Setup & Teardown ***/ /** @@ -736,7 +762,6 @@ static void ahci_test_io_rw_simple(AHCIQState *ahci, unsigned bufsize, { uint64_t ptr; uint8_t port; - unsigned i; unsigned char *tx = g_malloc(bufsize); unsigned char *rx = g_malloc0(bufsize); @@ -752,9 +777,7 @@ static void ahci_test_io_rw_simple(AHCIQState *ahci, unsigned bufsize, g_assert(ptr); /* Write some indicative pattern to our buffer. */ - for (i = 0; i < bufsize; i++) { - tx[i] = (bufsize - i); - } + generate_pattern(tx, bufsize, AHCI_SECTOR_SIZE); memwrite(ptr, tx, bufsize); /* Write this buffer to disk, then read it back to the DMA buffer. */ @@ -865,7 +888,6 @@ static void test_dma_fragmented(void) 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(); @@ -873,9 +895,7 @@ static void test_dma_fragmented(void) ahci_port_clear(ahci, px); /* create pattern */ - for (i = 0; i < bufsize; i++) { - tx[i] = (bufsize - i); - } + generate_pattern(tx, bufsize, AHCI_SECTOR_SIZE); /* Create a DMA buffer in guest memory, and write our pattern to it. */ ptr = guest_alloc(ahci->parent->alloc, bufsize);