Update to v2.3.0-rc0. SeaBIOS does not yet build on 11.4, and rcutorture test fails on ppc. OBS-URL: https://build.opensuse.org/request/show/292199 OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=238
95 lines
2.9 KiB
Diff
95 lines
2.9 KiB
Diff
From cd75c139869ea1fa98eeaf2d8b7004d8da0e1bbe Mon Sep 17 00:00:00 2001
|
|
From: John Snow <jsnow@redhat.com>
|
|
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 <jsnow@redhat.com>
|
|
Signed-off-by: Andreas Färber <afaerber@suse.de>
|
|
---
|
|
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);
|