Re: [Qemu-devel] [PATCH v3 28/29] qemu-iotests: Test pwritev RMW logic
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
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
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 +