[Qemu-devel] [PATCH 3/3] qtest/ahci: use raw format when qemu-img is absent

2015-11-12 Thread John Snow
If we don't have the qemu-img tool, use the raw format
for tests and skip the high-sector LBA48 tests.

Signed-off-by: John Snow 
---
 tests/ahci-test.c | 41 -
 1 file changed, 32 insertions(+), 9 deletions(-)

diff --git a/tests/ahci-test.c b/tests/ahci-test.c
index 6d9ac84..7a4e375 100644
--- a/tests/ahci-test.c
+++ b/tests/ahci-test.c
@@ -39,16 +39,16 @@
 #include "hw/pci/pci_ids.h"
 #include "hw/pci/pci_regs.h"
 
-/* Test-specific defines -- in MiB */
-#define TEST_IMAGE_SIZE_MB (200 * 1024)
-#define TEST_IMAGE_SECTORS ((TEST_IMAGE_SIZE_MB / AHCI_SECTOR_SIZE) \
-* 1024 * 1024)
+/* Test images sizes in MB */
+#define TEST_IMAGE_SIZE_MB_LARGE (200 * 1024)
+#define TEST_IMAGE_SIZE_MB_SMALL 64
 
 /*** Globals ***/
 static char tmp_path[] = "/tmp/qtest.XX";
 static char debug_path[] = "/tmp/qtest-blkdebug.XX";
 static bool ahci_pedantic;
 static const char *imgfmt;
+static unsigned test_image_size_mb;
 
 /*** Function Declarations ***/
 static void ahci_test_port_spec(AHCIQState *ahci, uint8_t port);
@@ -61,6 +61,11 @@ static void ahci_test_pmcap(AHCIQState *ahci, uint8_t 
offset);
 
 /*** Utilities ***/
 
+static size_t mb_to_sectors(size_t image_size_mb)
+{
+return (image_size_mb * 1024 * 1024) / AHCI_SECTOR_SIZE;
+}
+
 static void string_bswap16(uint16_t *s, size_t bytes)
 {
 g_assert_cmphex((bytes & 1), ==, 0);
@@ -901,7 +906,7 @@ static void ahci_test_max(AHCIQState *ahci)
 uint64_t nsect;
 uint8_t port;
 uint8_t cmd;
-uint64_t config_sect = TEST_IMAGE_SECTORS - 1;
+uint64_t config_sect = mb_to_sectors(test_image_size_mb) - 1;
 
 if (config_sect > 0xFF) {
 cmd = CMD_READ_MAX_EXT;
@@ -1480,7 +1485,7 @@ static uint64_t offset_sector(enum OffsetType ofst,
 return 1;
 case OFFSET_HIGH:
 ceil = (addr_type == ADDR_MODE_LBA28) ? 0xfff : 0x;
-ceil = MIN(ceil, TEST_IMAGE_SECTORS - 1);
+ceil = MIN(ceil, mb_to_sectors(test_image_size_mb) - 1);
 nsectors = buffsize / AHCI_SECTOR_SIZE;
 return ceil - nsectors + 1;
 default:
@@ -1562,8 +1567,9 @@ static void create_ahci_io_test(enum IOMode type, enum 
AddrMode addr,
 enum BuffLen len, enum OffsetType offset)
 {
 char *name;
-AHCIIOTestOptions *opts = g_malloc(sizeof(AHCIIOTestOptions));
+AHCIIOTestOptions *opts;
 
+opts = g_malloc(sizeof(AHCIIOTestOptions));
 opts->length = len;
 opts->address_type = addr;
 opts->io_type = type;
@@ -1575,6 +1581,13 @@ static void create_ahci_io_test(enum IOMode type, enum 
AddrMode addr,
buff_len_str[len],
offset_str[offset]);
 
+if ((addr == ADDR_MODE_LBA48) && (offset == OFFSET_HIGH) &&
+(mb_to_sectors(test_image_size_mb) <= 0xFFF)) {
+g_test_message("%s: skipped; test image too small", name);
+g_free(name);
+return;
+}
+
 qtest_add_data_func(name, opts, test_io_interface);
 g_free(name);
 }
@@ -1624,8 +1637,18 @@ int main(int argc, char **argv)
 /* Create a temporary image */
 fd = mkstemp(tmp_path);
 g_assert(fd >= 0);
-imgfmt = "qcow2";
-mkqcow2(tmp_path, TEST_IMAGE_SIZE_MB);
+if (have_qemu_img()) {
+imgfmt = "qcow2";
+test_image_size_mb = TEST_IMAGE_SIZE_MB_LARGE;
+mkqcow2(tmp_path, TEST_IMAGE_SIZE_MB_LARGE);
+} else {
+g_test_message("QTEST_QEMU_IMG not set or qemu-img missing; "
+   "skipping LBA48 high-sector tests");
+imgfmt = "raw";
+test_image_size_mb = TEST_IMAGE_SIZE_MB_SMALL;
+ret = ftruncate(fd, test_image_size_mb * 1024 * 1024);
+g_assert(ret == 0);
+}
 close(fd);
 
 /* Create temporary blkdebug instructions */
-- 
2.4.3




Re: [Qemu-devel] [PATCH 3/3] qtest/ahci: use raw format when qemu-img is absent

2015-11-13 Thread John Snow


On 11/12/2015 02:51 PM, John Snow wrote:
> If we don't have the qemu-img tool, use the raw format
> for tests and skip the high-sector LBA48 tests.
> 
> Signed-off-by: John Snow 
> ---
>  tests/ahci-test.c | 41 -
>  1 file changed, 32 insertions(+), 9 deletions(-)
> 
> diff --git a/tests/ahci-test.c b/tests/ahci-test.c
> index 6d9ac84..7a4e375 100644
> --- a/tests/ahci-test.c
> +++ b/tests/ahci-test.c
> @@ -39,16 +39,16 @@
>  #include "hw/pci/pci_ids.h"
>  #include "hw/pci/pci_regs.h"
>  
> -/* Test-specific defines -- in MiB */
> -#define TEST_IMAGE_SIZE_MB (200 * 1024)
> -#define TEST_IMAGE_SECTORS ((TEST_IMAGE_SIZE_MB / AHCI_SECTOR_SIZE) \
> -* 1024 * 1024)
> +/* Test images sizes in MB */
> +#define TEST_IMAGE_SIZE_MB_LARGE (200 * 1024)
> +#define TEST_IMAGE_SIZE_MB_SMALL 64
>  
>  /*** Globals ***/
>  static char tmp_path[] = "/tmp/qtest.XX";
>  static char debug_path[] = "/tmp/qtest-blkdebug.XX";
>  static bool ahci_pedantic;
>  static const char *imgfmt;
> +static unsigned test_image_size_mb;
>  
>  /*** Function Declarations ***/
>  static void ahci_test_port_spec(AHCIQState *ahci, uint8_t port);
> @@ -61,6 +61,11 @@ static void ahci_test_pmcap(AHCIQState *ahci, uint8_t 
> offset);
>  
>  /*** Utilities ***/
>  
> +static size_t mb_to_sectors(size_t image_size_mb)
> +{
> +return (image_size_mb * 1024 * 1024) / AHCI_SECTOR_SIZE;
> +}
> +

NACK, size_t is not sufficient for i386 where we need explicitly
uint64_t to fit LBA48 values.

>  static void string_bswap16(uint16_t *s, size_t bytes)
>  {
>  g_assert_cmphex((bytes & 1), ==, 0);
> @@ -901,7 +906,7 @@ static void ahci_test_max(AHCIQState *ahci)
>  uint64_t nsect;
>  uint8_t port;
>  uint8_t cmd;
> -uint64_t config_sect = TEST_IMAGE_SECTORS - 1;
> +uint64_t config_sect = mb_to_sectors(test_image_size_mb) - 1;
>  
>  if (config_sect > 0xFF) {
>  cmd = CMD_READ_MAX_EXT;
> @@ -1480,7 +1485,7 @@ static uint64_t offset_sector(enum OffsetType ofst,
>  return 1;
>  case OFFSET_HIGH:
>  ceil = (addr_type == ADDR_MODE_LBA28) ? 0xfff : 0x;
> -ceil = MIN(ceil, TEST_IMAGE_SECTORS - 1);
> +ceil = MIN(ceil, mb_to_sectors(test_image_size_mb) - 1);
>  nsectors = buffsize / AHCI_SECTOR_SIZE;
>  return ceil - nsectors + 1;
>  default:
> @@ -1562,8 +1567,9 @@ static void create_ahci_io_test(enum IOMode type, enum 
> AddrMode addr,
>  enum BuffLen len, enum OffsetType offset)
>  {
>  char *name;
> -AHCIIOTestOptions *opts = g_malloc(sizeof(AHCIIOTestOptions));
> +AHCIIOTestOptions *opts;
>  
> +opts = g_malloc(sizeof(AHCIIOTestOptions));
>  opts->length = len;
>  opts->address_type = addr;
>  opts->io_type = type;
> @@ -1575,6 +1581,13 @@ static void create_ahci_io_test(enum IOMode type, enum 
> AddrMode addr,
> buff_len_str[len],
> offset_str[offset]);
>  
> +if ((addr == ADDR_MODE_LBA48) && (offset == OFFSET_HIGH) &&
> +(mb_to_sectors(test_image_size_mb) <= 0xFFF)) {
> +g_test_message("%s: skipped; test image too small", name);
> +g_free(name);
> +return;
> +}
> +
>  qtest_add_data_func(name, opts, test_io_interface);
>  g_free(name);
>  }
> @@ -1624,8 +1637,18 @@ int main(int argc, char **argv)
>  /* Create a temporary image */
>  fd = mkstemp(tmp_path);
>  g_assert(fd >= 0);
> -imgfmt = "qcow2";
> -mkqcow2(tmp_path, TEST_IMAGE_SIZE_MB);
> +if (have_qemu_img()) {
> +imgfmt = "qcow2";
> +test_image_size_mb = TEST_IMAGE_SIZE_MB_LARGE;
> +mkqcow2(tmp_path, TEST_IMAGE_SIZE_MB_LARGE);
> +} else {
> +g_test_message("QTEST_QEMU_IMG not set or qemu-img missing; "
> +   "skipping LBA48 high-sector tests");
> +imgfmt = "raw";
> +test_image_size_mb = TEST_IMAGE_SIZE_MB_SMALL;
> +ret = ftruncate(fd, test_image_size_mb * 1024 * 1024);
> +g_assert(ret == 0);
> +}
>  close(fd);
>  
>  /* Create temporary blkdebug instructions */
>