Re: [Qemu-devel] [PATCH v3 28/29] qemu-iotests: Test pwritev RMW logic

2014-01-20 Thread Kevin Wolf
Am 18.01.2014 um 17:01 hat Max Reitz geschrieben:
 On 17.01.2014 15:15, Kevin Wolf wrote:
 Signed-off-by: Kevin Wolf kw...@redhat.com
 ---
   block.c|   7 ++
   block/blkdebug.c   |   8 ++
   include/block/block.h  |   8 ++
   tests/qemu-iotests/077 | 278 
  +
   tests/qemu-iotests/077.out | 202 
   tests/qemu-iotests/group   |   1 +
   6 files changed, 504 insertions(+)
   create mode 100755 tests/qemu-iotests/077
   create mode 100644 tests/qemu-iotests/077.out
 
 diff --git a/block.c b/block.c
 index 812b1b2..12af7fb 100644
 --- a/block.c
 +++ b/block.c
 @@ -2961,10 +2961,13 @@ static int coroutine_fn 
 bdrv_aligned_pwritev(BlockDriverState *bs,
   if (ret  0) {
   /* Do nothing, write notifier decided to fail this request */
   } else if (flags  BDRV_REQ_ZERO_WRITE) {
 +BLKDBG_EVENT(bs, BLKDBG_PWRITEV_ZERO);
   ret = bdrv_co_do_write_zeroes(bs, sector_num, nb_sectors, flags);
   } else {
 +BLKDBG_EVENT(bs, BLKDBG_PWRITEV);
   ret = drv-bdrv_co_writev(bs, sector_num, nb_sectors, qiov);
   }
 +BLKDBG_EVENT(bs, BLKDBG_PWRITEV_DONE);
   if (ret == 0  !bs-enable_write_cache) {
   ret = bdrv_co_flush(bs);
 @@ -3035,11 +3038,13 @@ static int coroutine_fn 
 bdrv_co_do_pwritev(BlockDriverState *bs,
   };
   qemu_iovec_init_external(head_qiov, head_iov, 1);
 +BLKDBG_EVENT(bs, BLKDBG_PWRITEV_RMW_HEAD);
   ret = bdrv_aligned_preadv(bs, req, offset  ~(align - 1), align,
 align, head_qiov, 0);
   if (ret  0) {
   goto fail;
   }
 +BLKDBG_EVENT(bs, BLKDBG_PWRITEV_RMW_AFTER_HEAD);
   qemu_iovec_init(local_qiov, qiov-niov + 2);
   qemu_iovec_add(local_qiov, head_buf, offset  (align - 1));
 @@ -3067,11 +3072,13 @@ static int coroutine_fn 
 bdrv_co_do_pwritev(BlockDriverState *bs,
   };
   qemu_iovec_init_external(tail_qiov, tail_iov, 1);
 +BLKDBG_EVENT(bs, BLKDBG_PWRITEV_RMW_TAIL);
   ret = bdrv_aligned_preadv(bs, req, (offset + bytes)  ~(align - 
  1), align,
 align, tail_qiov, 0);
   if (ret  0) {
   goto fail;
   }
 +BLKDBG_EVENT(bs, BLKDBG_PWRITEV_RMW_AFTER_TAIL);
   if (!use_local_qiov) {
   qemu_iovec_init(local_qiov, qiov-niov + 1);
 diff --git a/block/blkdebug.c b/block/blkdebug.c
 index dc4ba46..6657671 100644
 --- a/block/blkdebug.c
 +++ b/block/blkdebug.c
 @@ -186,6 +186,14 @@ static const char *event_names[BLKDBG_EVENT_MAX] = {
   [BLKDBG_FLUSH_TO_OS]= flush_to_os,
   [BLKDBG_FLUSH_TO_DISK]  = flush_to_disk,
 +
 +[BLKDBG_PWRITEV_RMW_HEAD]   = pwritev_rmw.head,
 +[BLKDBG_PWRITEV_RMW_AFTER_HEAD] = pwritev_rmw.after_head,
 +[BLKDBG_PWRITEV_RMW_TAIL]   = pwritev_rmw.tail,
 +[BLKDBG_PWRITEV_RMW_AFTER_TAIL] = pwritev_rmw.after_tail,
 +[BLKDBG_PWRITEV]= pwritev,
 +[BLKDBG_PWRITEV_ZERO]   = pwritev_zero,
 +[BLKDBG_PWRITEV_DONE]   = pwritev_done,
   };
   static int get_event_by_name(const char *name, BlkDebugEvent *event)
 diff --git a/include/block/block.h b/include/block/block.h
 index 7e40ccc..127fc2f 100644
 --- a/include/block/block.h
 +++ b/include/block/block.h
 @@ -518,6 +518,14 @@ typedef enum {
   BLKDBG_FLUSH_TO_OS,
   BLKDBG_FLUSH_TO_DISK,
 +BLKDBG_PWRITEV_RMW_HEAD,
 +BLKDBG_PWRITEV_RMW_AFTER_HEAD,
 +BLKDBG_PWRITEV_RMW_TAIL,
 +BLKDBG_PWRITEV_RMW_AFTER_TAIL,
 +BLKDBG_PWRITEV,
 +BLKDBG_PWRITEV_ZERO,
 +BLKDBG_PWRITEV_DONE,
 +
   BLKDBG_EVENT_MAX,
   } BlkDebugEvent;
 diff --git a/tests/qemu-iotests/077 b/tests/qemu-iotests/077
 new file mode 100755
 index 000..58bfc8f
 --- /dev/null
 +++ b/tests/qemu-iotests/077
 @@ -0,0 +1,278 @@
 +#!/bin/bash
 +#
 +# Test concurrent pread/pwrite
 +#
 +# Copyright (C) 2014 Red Hat, Inc.
 +#
 +# This program is free software; you can redistribute it and/or modify
 +# it under the terms of the GNU General Public License as published by
 +# the Free Software Foundation; either version 2 of the License, or
 +# (at your option) any later version.
 +#
 +# This program is distributed in the hope that it will be useful,
 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +# GNU General Public License for more details.
 +#
 +# You should have received a copy of the GNU General Public License
 +# along with this program.  If not, see http://www.gnu.org/licenses/.
 +#
 +
 +# creator
 +owner=kw...@redhat.com
 +
 +seq=`basename $0`
 +echo QA output created by $seq
 +
 +here=`pwd`
 +tmp=/tmp/$$
 +status=1# failure is the default!
 +
 +_cleanup()
 +{
 +_cleanup_test_img
 

Re: [Qemu-devel] [PATCH v3 28/29] qemu-iotests: Test pwritev RMW logic

2014-01-18 Thread Max Reitz

On 17.01.2014 15:15, Kevin Wolf wrote:

Signed-off-by: Kevin Wolf kw...@redhat.com
---
  block.c|   7 ++
  block/blkdebug.c   |   8 ++
  include/block/block.h  |   8 ++
  tests/qemu-iotests/077 | 278 +
  tests/qemu-iotests/077.out | 202 
  tests/qemu-iotests/group   |   1 +
  6 files changed, 504 insertions(+)
  create mode 100755 tests/qemu-iotests/077
  create mode 100644 tests/qemu-iotests/077.out

diff --git a/block.c b/block.c
index 812b1b2..12af7fb 100644
--- a/block.c
+++ b/block.c
@@ -2961,10 +2961,13 @@ static int coroutine_fn 
bdrv_aligned_pwritev(BlockDriverState *bs,
  if (ret  0) {
  /* Do nothing, write notifier decided to fail this request */
  } else if (flags  BDRV_REQ_ZERO_WRITE) {
+BLKDBG_EVENT(bs, BLKDBG_PWRITEV_ZERO);
  ret = bdrv_co_do_write_zeroes(bs, sector_num, nb_sectors, flags);
  } else {
+BLKDBG_EVENT(bs, BLKDBG_PWRITEV);
  ret = drv-bdrv_co_writev(bs, sector_num, nb_sectors, qiov);
  }
+BLKDBG_EVENT(bs, BLKDBG_PWRITEV_DONE);
  
  if (ret == 0  !bs-enable_write_cache) {

  ret = bdrv_co_flush(bs);
@@ -3035,11 +3038,13 @@ static int coroutine_fn 
bdrv_co_do_pwritev(BlockDriverState *bs,
  };
  qemu_iovec_init_external(head_qiov, head_iov, 1);
  
+BLKDBG_EVENT(bs, BLKDBG_PWRITEV_RMW_HEAD);

  ret = bdrv_aligned_preadv(bs, req, offset  ~(align - 1), align,
align, head_qiov, 0);
  if (ret  0) {
  goto fail;
  }
+BLKDBG_EVENT(bs, BLKDBG_PWRITEV_RMW_AFTER_HEAD);
  
  qemu_iovec_init(local_qiov, qiov-niov + 2);

  qemu_iovec_add(local_qiov, head_buf, offset  (align - 1));
@@ -3067,11 +3072,13 @@ static int coroutine_fn 
bdrv_co_do_pwritev(BlockDriverState *bs,
  };
  qemu_iovec_init_external(tail_qiov, tail_iov, 1);
  
+BLKDBG_EVENT(bs, BLKDBG_PWRITEV_RMW_TAIL);

  ret = bdrv_aligned_preadv(bs, req, (offset + bytes)  ~(align - 1), 
align,
align, tail_qiov, 0);
  if (ret  0) {
  goto fail;
  }
+BLKDBG_EVENT(bs, BLKDBG_PWRITEV_RMW_AFTER_TAIL);
  
  if (!use_local_qiov) {

  qemu_iovec_init(local_qiov, qiov-niov + 1);
diff --git a/block/blkdebug.c b/block/blkdebug.c
index dc4ba46..6657671 100644
--- a/block/blkdebug.c
+++ b/block/blkdebug.c
@@ -186,6 +186,14 @@ static const char *event_names[BLKDBG_EVENT_MAX] = {
  
  [BLKDBG_FLUSH_TO_OS]= flush_to_os,

  [BLKDBG_FLUSH_TO_DISK]  = flush_to_disk,
+
+[BLKDBG_PWRITEV_RMW_HEAD]   = pwritev_rmw.head,
+[BLKDBG_PWRITEV_RMW_AFTER_HEAD] = pwritev_rmw.after_head,
+[BLKDBG_PWRITEV_RMW_TAIL]   = pwritev_rmw.tail,
+[BLKDBG_PWRITEV_RMW_AFTER_TAIL] = pwritev_rmw.after_tail,
+[BLKDBG_PWRITEV]= pwritev,
+[BLKDBG_PWRITEV_ZERO]   = pwritev_zero,
+[BLKDBG_PWRITEV_DONE]   = pwritev_done,
  };
  
  static int get_event_by_name(const char *name, BlkDebugEvent *event)

diff --git a/include/block/block.h b/include/block/block.h
index 7e40ccc..127fc2f 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -518,6 +518,14 @@ typedef enum {
  BLKDBG_FLUSH_TO_OS,
  BLKDBG_FLUSH_TO_DISK,
  
+BLKDBG_PWRITEV_RMW_HEAD,

+BLKDBG_PWRITEV_RMW_AFTER_HEAD,
+BLKDBG_PWRITEV_RMW_TAIL,
+BLKDBG_PWRITEV_RMW_AFTER_TAIL,
+BLKDBG_PWRITEV,
+BLKDBG_PWRITEV_ZERO,
+BLKDBG_PWRITEV_DONE,
+
  BLKDBG_EVENT_MAX,
  } BlkDebugEvent;
  
diff --git a/tests/qemu-iotests/077 b/tests/qemu-iotests/077

new file mode 100755
index 000..58bfc8f
--- /dev/null
+++ b/tests/qemu-iotests/077
@@ -0,0 +1,278 @@
+#!/bin/bash
+#
+# Test concurrent pread/pwrite
+#
+# Copyright (C) 2014 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see http://www.gnu.org/licenses/.
+#
+
+# creator
+owner=kw...@redhat.com
+
+seq=`basename $0`
+echo QA output created by $seq
+
+here=`pwd`
+tmp=/tmp/$$
+status=1   # failure is the default!
+
+_cleanup()
+{
+   _cleanup_test_img
+}
+trap _cleanup; exit \$status 0 1 2 3 15
+
+# get standard environment, filters and checks
+. ./common.rc
+. ./common.filter
+

[Qemu-devel] [PATCH v3 28/29] qemu-iotests: Test pwritev RMW logic

2014-01-17 Thread Kevin Wolf
Signed-off-by: Kevin Wolf kw...@redhat.com
---
 block.c|   7 ++
 block/blkdebug.c   |   8 ++
 include/block/block.h  |   8 ++
 tests/qemu-iotests/077 | 278 +
 tests/qemu-iotests/077.out | 202 
 tests/qemu-iotests/group   |   1 +
 6 files changed, 504 insertions(+)
 create mode 100755 tests/qemu-iotests/077
 create mode 100644 tests/qemu-iotests/077.out

diff --git a/block.c b/block.c
index 812b1b2..12af7fb 100644
--- a/block.c
+++ b/block.c
@@ -2961,10 +2961,13 @@ static int coroutine_fn 
bdrv_aligned_pwritev(BlockDriverState *bs,
 if (ret  0) {
 /* Do nothing, write notifier decided to fail this request */
 } else if (flags  BDRV_REQ_ZERO_WRITE) {
+BLKDBG_EVENT(bs, BLKDBG_PWRITEV_ZERO);
 ret = bdrv_co_do_write_zeroes(bs, sector_num, nb_sectors, flags);
 } else {
+BLKDBG_EVENT(bs, BLKDBG_PWRITEV);
 ret = drv-bdrv_co_writev(bs, sector_num, nb_sectors, qiov);
 }
+BLKDBG_EVENT(bs, BLKDBG_PWRITEV_DONE);
 
 if (ret == 0  !bs-enable_write_cache) {
 ret = bdrv_co_flush(bs);
@@ -3035,11 +3038,13 @@ static int coroutine_fn 
bdrv_co_do_pwritev(BlockDriverState *bs,
 };
 qemu_iovec_init_external(head_qiov, head_iov, 1);
 
+BLKDBG_EVENT(bs, BLKDBG_PWRITEV_RMW_HEAD);
 ret = bdrv_aligned_preadv(bs, req, offset  ~(align - 1), align,
   align, head_qiov, 0);
 if (ret  0) {
 goto fail;
 }
+BLKDBG_EVENT(bs, BLKDBG_PWRITEV_RMW_AFTER_HEAD);
 
 qemu_iovec_init(local_qiov, qiov-niov + 2);
 qemu_iovec_add(local_qiov, head_buf, offset  (align - 1));
@@ -3067,11 +3072,13 @@ static int coroutine_fn 
bdrv_co_do_pwritev(BlockDriverState *bs,
 };
 qemu_iovec_init_external(tail_qiov, tail_iov, 1);
 
+BLKDBG_EVENT(bs, BLKDBG_PWRITEV_RMW_TAIL);
 ret = bdrv_aligned_preadv(bs, req, (offset + bytes)  ~(align - 1), 
align,
   align, tail_qiov, 0);
 if (ret  0) {
 goto fail;
 }
+BLKDBG_EVENT(bs, BLKDBG_PWRITEV_RMW_AFTER_TAIL);
 
 if (!use_local_qiov) {
 qemu_iovec_init(local_qiov, qiov-niov + 1);
diff --git a/block/blkdebug.c b/block/blkdebug.c
index dc4ba46..6657671 100644
--- a/block/blkdebug.c
+++ b/block/blkdebug.c
@@ -186,6 +186,14 @@ static const char *event_names[BLKDBG_EVENT_MAX] = {
 
 [BLKDBG_FLUSH_TO_OS]= flush_to_os,
 [BLKDBG_FLUSH_TO_DISK]  = flush_to_disk,
+
+[BLKDBG_PWRITEV_RMW_HEAD]   = pwritev_rmw.head,
+[BLKDBG_PWRITEV_RMW_AFTER_HEAD] = pwritev_rmw.after_head,
+[BLKDBG_PWRITEV_RMW_TAIL]   = pwritev_rmw.tail,
+[BLKDBG_PWRITEV_RMW_AFTER_TAIL] = pwritev_rmw.after_tail,
+[BLKDBG_PWRITEV]= pwritev,
+[BLKDBG_PWRITEV_ZERO]   = pwritev_zero,
+[BLKDBG_PWRITEV_DONE]   = pwritev_done,
 };
 
 static int get_event_by_name(const char *name, BlkDebugEvent *event)
diff --git a/include/block/block.h b/include/block/block.h
index 7e40ccc..127fc2f 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -518,6 +518,14 @@ typedef enum {
 BLKDBG_FLUSH_TO_OS,
 BLKDBG_FLUSH_TO_DISK,
 
+BLKDBG_PWRITEV_RMW_HEAD,
+BLKDBG_PWRITEV_RMW_AFTER_HEAD,
+BLKDBG_PWRITEV_RMW_TAIL,
+BLKDBG_PWRITEV_RMW_AFTER_TAIL,
+BLKDBG_PWRITEV,
+BLKDBG_PWRITEV_ZERO,
+BLKDBG_PWRITEV_DONE,
+
 BLKDBG_EVENT_MAX,
 } BlkDebugEvent;
 
diff --git a/tests/qemu-iotests/077 b/tests/qemu-iotests/077
new file mode 100755
index 000..58bfc8f
--- /dev/null
+++ b/tests/qemu-iotests/077
@@ -0,0 +1,278 @@
+#!/bin/bash
+#
+# Test concurrent pread/pwrite
+#
+# Copyright (C) 2014 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see http://www.gnu.org/licenses/.
+#
+
+# creator
+owner=kw...@redhat.com
+
+seq=`basename $0`
+echo QA output created by $seq
+
+here=`pwd`
+tmp=/tmp/$$
+status=1   # failure is the default!
+
+_cleanup()
+{
+   _cleanup_test_img
+}
+trap _cleanup; exit \$status 0 1 2 3 15
+
+# get standard environment, filters and checks
+. ./common.rc
+. ./common.filter
+
+_supported_fmt generic
+_supported_proto generic
+_supported_os Linux
+
+CLUSTER_SIZE=4k
+size=128M
+