All of lore.kernel.org
 help / color / mirror / Atom feed
From: Denis Plotnikov <dplotnikov@virtuozzo.com>
To: qemu-devel@nongnu.org
Cc: fam@euphon.net, kwolf@redhat.com, ehabkost@redhat.com,
	qemu-block@nongnu.org, mst@redhat.com, stefanha@redhat.com,
	mreitz@redhat.com, den@virtuozzo.com
Subject: [PATCH v1 4/4] iotests: add test for virtio-scsi and virtio-blk machine type settings
Date: Tue,  5 Nov 2019 19:11:05 +0300	[thread overview]
Message-ID: <20191105161105.19016-5-dplotnikov@virtuozzo.com> (raw)
In-Reply-To: <20191105161105.19016-1-dplotnikov@virtuozzo.com>

It tests proper queue size settings for all available machine types.

Signed-off-by: Denis Plotnikov <dplotnikov@virtuozzo.com>
---
 tests/qemu-iotests/267     | 154 +++++++++++++++++++++++++++++++++++++
 tests/qemu-iotests/267.out |   1 +
 tests/qemu-iotests/group   |   1 +
 3 files changed, 156 insertions(+)
 create mode 100755 tests/qemu-iotests/267
 create mode 100644 tests/qemu-iotests/267.out

diff --git a/tests/qemu-iotests/267 b/tests/qemu-iotests/267
new file mode 100755
index 0000000000..6d3cc574b3
--- /dev/null
+++ b/tests/qemu-iotests/267
@@ -0,0 +1,154 @@
+#!/usr/bin/env python
+#
+# Test virtio-scsi and virtio-blk queue settings for all machine types
+#
+# Copyright (c) 2019 Virtuozzo International GmbH
+#
+# 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/>.
+#
+
+import sys
+import os
+import re
+import iotests
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'scripts'))
+import qemu
+
+# list of device types and virtqueue properties to test
+# this is a generalized approach
+# for now we just check queue length
+# more properties can be added in each list
+virtio_scsi_props = {'vq_size': 'virtqueue_size'}
+virtio_blk_props = {'vq_size': 'queue-size'}
+
+dev_types = {'virtio-scsi-pci': virtio_scsi_props,
+             'virtio-blk-pci': virtio_blk_props}
+
+vm_dev_params = {'virtio-scsi-pci': ['-device', 'virtio-scsi-pci,id=scsi0'],
+                 'virtio-blk-pci': ['-device',
+                                    'virtio-blk-pci,id=scsi0,drive=drive0',
+                                    '-drive',
+                                    'driver=null-co,id=drive0,if=none']}
+
+def make_pattern(props):
+     pattern_items = ['{0} = \d+'.format(prop) for prop in props]
+     return '|'.join(pattern_items)
+
+
+def query_virtqueue_props(vm, dev_type_name):
+    output = vm.qmp('human-monitor-command', command_line='info qtree')
+    output = output['return']
+
+    props_list = dev_types[dev_type_name].values();
+
+    pattern = make_pattern(props_list)
+
+    res = re.findall(pattern, output)
+
+    if len(res) != len(props_list):
+        not_found = props_list.difference(set(res))
+
+        ret = (0, '({0}): The following properties not found: {1}'
+                  .format(dev_type_name, ', '.join(not_found)))
+    else:
+        props = dict()
+        for prop in res:
+            p = prop.split(' = ')
+            props[p[0]] = int(p[1])
+        ret = (1, props)
+
+    return ret
+
+
+def check_mt(mt, dev_type_name):
+    vm_params = ['-machine', mt['name']] + vm_dev_params[dev_type_name]
+
+    vm = qemu.QEMUMachine(iotests.qemu_prog, vm_params)
+    vm.launch()
+    ret = query_virtqueue_props(vm, dev_type_name)
+    vm.shutdown()
+
+    if ret[0] == 0:
+        print('Error ({0}): {1}'.format(mt['name'], ret[1]))
+        return 1
+
+    errors = 0
+    props = ret[1]
+
+    for prop_name, prop_val in props.items():
+        if mt[prop_name] != prop_val:
+            print('Error [{0}, {1}]: {2}={3} (expected {4})'.
+                  format(mt['name'], dev_type_name, prop_name, prop_val,
+                         mt[prop_name]))
+            errors += 1
+
+    return errors
+
+def is_256_virtqueue_size_mt(mt):
+    mt = mt.split("-")
+
+    # machine types like pc-x.x
+    if len(mt) == 2:
+        return False
+
+    # machine types like pc-<chip_name>-x.x[.x]
+    ver = mt[2]
+
+    ver = ver.split(".");
+
+    # all versions greater than 4.0.1 goes with 256 queue size
+    if int(ver[0]) >= 4:
+        major = int(ver[1])
+        minor = 0
+        if len(ver) > 2:
+            minor = int(ver[2])
+
+        if major > 0 or minor > 1:
+             return True
+
+    return False
+
+
+# collect all machine types except 'none'
+vm = iotests.VM()
+vm.launch()
+machines = [m['name'] for m in vm.qmp('query-machines')['return']]
+vm.shutdown()
+machines.remove('none')
+machines.remove('isapc')
+
+failed = 0
+
+for dev_type in dev_types:
+    # create a list of machine types and their parameters
+    # machine types vz8.X.X must have virtqueue_length=256
+    # others must have virtqueue_length=128
+    mtypes = list()
+    for m in machines:
+        if is_256_virtqueue_size_mt(m):
+            vq_size = 256
+        else:
+            vq_size = 128
+
+        mtypes.append({'name': m, dev_types[dev_type]['vq_size']: vq_size})
+
+    # test each machine type
+    for mt in mtypes:
+        failed += check_mt(mt, dev_type)
+
+if failed > 0:
+    print('Failed')
+else:
+    print('Success')
diff --git a/tests/qemu-iotests/267.out b/tests/qemu-iotests/267.out
new file mode 100644
index 0000000000..35821117c8
--- /dev/null
+++ b/tests/qemu-iotests/267.out
@@ -0,0 +1 @@
+Success
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
index 3605796bb2..ab8523ad60 100644
--- a/tests/qemu-iotests/group
+++ b/tests/qemu-iotests/group
@@ -252,3 +252,4 @@
 255 rw auto quick
 256 rw auto quick
 266 rw quick
+267 auto quick
-- 
2.17.0



  parent reply	other threads:[~2019-11-05 16:18 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-05 16:11 [PATCH v1 0/4] virtio: fix IO request length in virtio SCSI/block Denis Plotnikov
2019-11-05 16:11 ` [PATCH v1 1/4] virtio: protect non-modern devices from too big virtqueue size setting Denis Plotnikov
2019-11-05 20:56   ` Michael S. Tsirkin
2019-11-06  7:46     ` Denis Plotnikov
2019-11-06  9:01       ` Stefan Hajnoczi
2019-11-06  9:19       ` Stefan Hajnoczi
2019-11-06 11:33       ` Michael S. Tsirkin
2019-11-06  9:18     ` Stefan Hajnoczi
2019-11-06 11:51       ` Michael S. Tsirkin
2019-11-05 16:11 ` [PATCH v1 2/4] virtio: make seg_max virtqueue size dependent Denis Plotnikov
2019-11-05 20:51   ` Michael S. Tsirkin
2019-11-06 10:07     ` Denis Lunev
2019-11-06 11:54       ` Michael S. Tsirkin
2019-11-08  7:43         ` Denis Plotnikov
2019-11-08  9:52           ` Michael S. Tsirkin
2019-11-05 16:11 ` [PATCH v1 3/4] virtio: increase virtuqueue sizes in new machine types Denis Plotnikov
2019-11-05 20:52   ` Michael S. Tsirkin
2019-11-05 16:11 ` Denis Plotnikov [this message]
2019-11-06  9:24   ` [PATCH v1 4/4] iotests: add test for virtio-scsi and virtio-blk machine type settings Stefan Hajnoczi
2019-11-06 10:04     ` Max Reitz
2019-11-06 19:26       ` Eduardo Habkost
2019-11-07 16:30         ` Cleber Rosa
2019-11-08  7:08           ` Denis Plotnikov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20191105161105.19016-5-dplotnikov@virtuozzo.com \
    --to=dplotnikov@virtuozzo.com \
    --cc=den@virtuozzo.com \
    --cc=ehabkost@redhat.com \
    --cc=fam@euphon.net \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=mst@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.