qtest/ahci: add flush retry test
Signed-off-by: John Snow <jsnow@redhat.com> Message-id: 1426018503-821-7-git-send-email-jsnow@redhat.com
This commit is contained in:
		
							parent
							
								
									72c85e949f
								
							
						
					
					
						commit
						cf5aa89e9d
					
				| 
						 | 
					@ -46,6 +46,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*** Globals ***/
 | 
					/*** Globals ***/
 | 
				
			||||||
static char tmp_path[] = "/tmp/qtest.XXXXXX";
 | 
					static char tmp_path[] = "/tmp/qtest.XXXXXX";
 | 
				
			||||||
 | 
					static char debug_path[] = "/tmp/qtest-blkdebug.XXXXXX";
 | 
				
			||||||
static bool ahci_pedantic;
 | 
					static bool ahci_pedantic;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*** Function Declarations ***/
 | 
					/*** Function Declarations ***/
 | 
				
			||||||
| 
						 | 
					@ -986,6 +987,41 @@ static void test_flush(void)
 | 
				
			||||||
    ahci_shutdown(ahci);
 | 
					    ahci_shutdown(ahci);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void test_flush_retry(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    AHCIQState *ahci;
 | 
				
			||||||
 | 
					    AHCICommand *cmd;
 | 
				
			||||||
 | 
					    uint8_t port;
 | 
				
			||||||
 | 
					    const char *s;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    prepare_blkdebug_script(debug_path, "flush_to_disk");
 | 
				
			||||||
 | 
					    ahci = ahci_boot_and_enable("-drive file=blkdebug:%s:%s,if=none,id=drive0,"
 | 
				
			||||||
 | 
					                                "format=qcow2,cache=writeback,"
 | 
				
			||||||
 | 
					                                "rerror=stop,werror=stop "
 | 
				
			||||||
 | 
					                                "-M q35 "
 | 
				
			||||||
 | 
					                                "-device ide-hd,drive=drive0 ",
 | 
				
			||||||
 | 
					                                debug_path,
 | 
				
			||||||
 | 
					                                tmp_path);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Issue Flush Command */
 | 
				
			||||||
 | 
					    port = ahci_port_select(ahci);
 | 
				
			||||||
 | 
					    ahci_port_clear(ahci, port);
 | 
				
			||||||
 | 
					    cmd = ahci_command_create(CMD_FLUSH_CACHE);
 | 
				
			||||||
 | 
					    ahci_command_commit(ahci, cmd, port);
 | 
				
			||||||
 | 
					    ahci_command_issue_async(ahci, cmd);
 | 
				
			||||||
 | 
					    qmp_eventwait("STOP");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Complete the command */
 | 
				
			||||||
 | 
					    s = "{'execute':'cont' }";
 | 
				
			||||||
 | 
					    qmp_async(s);
 | 
				
			||||||
 | 
					    qmp_eventwait("RESUME");
 | 
				
			||||||
 | 
					    ahci_command_wait(ahci, cmd);
 | 
				
			||||||
 | 
					    ahci_command_verify(ahci, cmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ahci_command_free(cmd);
 | 
				
			||||||
 | 
					    ahci_shutdown(ahci);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/******************************************************************************/
 | 
					/******************************************************************************/
 | 
				
			||||||
/* AHCI I/O Test Matrix Definitions                                           */
 | 
					/* AHCI I/O Test Matrix Definitions                                           */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1167,6 +1203,7 @@ int main(int argc, char **argv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    const char *arch;
 | 
					    const char *arch;
 | 
				
			||||||
    int ret;
 | 
					    int ret;
 | 
				
			||||||
 | 
					    int fd;
 | 
				
			||||||
    int c;
 | 
					    int c;
 | 
				
			||||||
    int i, j, k, m;
 | 
					    int i, j, k, m;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1206,6 +1243,11 @@ int main(int argc, char **argv)
 | 
				
			||||||
    close(mkstemp(tmp_path));
 | 
					    close(mkstemp(tmp_path));
 | 
				
			||||||
    mkqcow2(tmp_path, TEST_IMAGE_SIZE_MB);
 | 
					    mkqcow2(tmp_path, TEST_IMAGE_SIZE_MB);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Create temporary blkdebug instructions */
 | 
				
			||||||
 | 
					    fd = mkstemp(debug_path);
 | 
				
			||||||
 | 
					    g_assert(fd >= 0);
 | 
				
			||||||
 | 
					    close(fd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Run the tests */
 | 
					    /* Run the tests */
 | 
				
			||||||
    qtest_add_func("/ahci/sanity",     test_sanity);
 | 
					    qtest_add_func("/ahci/sanity",     test_sanity);
 | 
				
			||||||
    qtest_add_func("/ahci/pci_spec",   test_pci_spec);
 | 
					    qtest_add_func("/ahci/pci_spec",   test_pci_spec);
 | 
				
			||||||
| 
						 | 
					@ -1227,11 +1269,13 @@ int main(int argc, char **argv)
 | 
				
			||||||
    qtest_add_func("/ahci/io/dma/lba28/fragmented", test_dma_fragmented);
 | 
					    qtest_add_func("/ahci/io/dma/lba28/fragmented", test_dma_fragmented);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    qtest_add_func("/ahci/flush/simple", test_flush);
 | 
					    qtest_add_func("/ahci/flush/simple", test_flush);
 | 
				
			||||||
 | 
					    qtest_add_func("/ahci/flush/retry", test_flush_retry);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ret = g_test_run();
 | 
					    ret = g_test_run();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Cleanup */
 | 
					    /* Cleanup */
 | 
				
			||||||
    unlink(tmp_path);
 | 
					    unlink(tmp_path);
 | 
				
			||||||
 | 
					    unlink(debug_path);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue