From: Pierre Morel <pmorel@linux.ibm.com>
To: kvm@vger.kernel.org
Cc: frankja@linux.ibm.com, david@redhat.com, thuth@redhat.com,
cohuck@redhat.com, imbrenda@linux.ibm.com, drjones@redhat.com
Subject: [kvm-unit-tests PATCH 7/7] s390x: virtio data transfer
Date: Fri, 27 Aug 2021 12:17:20 +0200 [thread overview]
Message-ID: <1630059440-15586-8-git-send-email-pmorel@linux.ibm.com> (raw)
In-Reply-To: <1630059440-15586-1-git-send-email-pmorel@linux.ibm.com>
We use a test device, "PONG" to transfer chunks of data of different
size and alignment and compare a checksum calculated before the sending
with the VIRTIO device checksum response.
Signed-off-by: Pierre Morel <pmorel@linux.ibm.com>
---
s390x/virtio_pong.c | 107 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 107 insertions(+)
diff --git a/s390x/virtio_pong.c b/s390x/virtio_pong.c
index 1e050a4d..94d6acdc 100644
--- a/s390x/virtio_pong.c
+++ b/s390x/virtio_pong.c
@@ -39,6 +39,112 @@ static struct virtio_ccw_device *vcdev;
static struct virtqueue *out_vq;
static struct virtqueue *in_vq;
+static bool virtio_read(struct virtqueue *q, char **buf, unsigned int *len)
+{
+ int ret;
+ char *p;
+
+ ret = virtqueue_add_inbuf(q, *buf, *len);
+ if (ret < 0)
+ return false;
+
+ disable_io_irq();
+ virtqueue_kick(q);
+ wait_for_interrupt(PSW_MASK_IO);
+
+ do {
+ p = virtqueue_get_buf(q, len);
+ } while (!p);
+
+ *buf = (void *)p;
+
+ return true;
+}
+
+static bool virtio_write(struct virtqueue *q, char *buf, unsigned int len)
+{
+ int ret;
+
+ ret = virtqueue_add_outbuf(q, buf, len);
+ if (ret < 0)
+ return false;
+
+ virtqueue_kick(q);
+ while (!virtqueue_get_buf(q, &len))
+ ;
+
+ return true;
+}
+
+static unsigned int simple_checksum(char *buf, unsigned int len)
+{
+ unsigned int sum = 0;
+
+ while (len--) {
+ sum += *buf * *buf + 7 * *buf + 3;
+ buf++;
+ }
+
+ return sum;
+}
+
+static void pong_write(char *buf, unsigned int len)
+{
+ unsigned int cksum;
+ unsigned int cksum_ret;
+ char *ret_ptr = (char *)&cksum_ret;
+
+ cksum = simple_checksum(buf, len);
+ report(virtio_write(out_vq, buf, len), "Sending data: %08x", cksum);
+
+ len = sizeof(cksum_ret);
+ report(virtio_read(in_vq, &ret_ptr, &len),
+ "Receiving checksum: %08x", cksum_ret);
+
+ report(cksum == cksum_ret, "Verifying checksum");
+}
+
+static struct {
+ const char *name;
+ int size;
+ int offset;
+} chunks[] = {
+ { "Small buffer", 3, 0 },
+ { "Page aligned", 4096, 0 },
+ { "Large page aligned", 0x00100000, 0 },
+ { "Page unaligned", 4096, 0x107 },
+ { "Random data", 5119, 0x107 },
+ { NULL, 0, 0 }
+};
+
+static void test_pong_data(void)
+{
+ char *buf;
+ char *p;
+ int len;
+ int i;
+
+ if (vcdev->state != VCDEV_INIT) {
+ report_skip("Device non initialized");
+ return;
+ }
+
+ for (i = 0; chunks[i].name; i++) {
+ report_prefix_push(chunks[i].name);
+
+ len = chunks[i].size + chunks[i].offset;
+ buf = alloc_io_mem(len, 0);
+
+ p = buf + chunks[i].offset;
+ memset(p, 0xA5, chunks[i].size);
+ pong_write(p, chunks[i].size);
+
+ free_io_mem(buf, len);
+
+ report_prefix_pop();
+ }
+}
+
static void test_find_vqs(void)
{
struct virtio_device *vdev = &vcdev->vdev;
@@ -186,6 +292,7 @@ static struct {
{ "CCW Bus", test_virtio_ccw_bus },
{ "CCW Device", test_virtio_device_init },
{ "Queues setup", test_find_vqs },
+ { "Data transfer", test_pong_data },
{ NULL, NULL }
};
--
2.25.1
prev parent reply other threads:[~2021-08-27 10:17 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-27 10:17 [kvm-unit-tests PATCH 0/7] Extending VIRTIO with a data transfer test Pierre Morel
2021-08-27 10:17 ` [kvm-unit-tests PATCH 1/7] arm: virtio: move VIRTIO transport initialization inside virtio-mmio Pierre Morel
2021-11-03 7:00 ` Thomas Huth
2021-11-03 7:41 ` Andrew Jones
2021-11-08 12:20 ` Pierre Morel
2021-08-27 10:17 ` [kvm-unit-tests PATCH 2/7] s390x: css: add callback for emnumeration Pierre Morel
2021-11-03 7:29 ` Thomas Huth
2021-11-08 12:21 ` Pierre Morel
2021-08-27 10:17 ` [kvm-unit-tests PATCH 3/7] s390x: virtio: CCW transport implementation Pierre Morel
2021-11-03 7:46 ` Andrew Jones
2021-11-08 12:35 ` Pierre Morel
2021-11-03 7:49 ` Thomas Huth
2021-11-08 12:34 ` Pierre Morel
2021-11-09 7:01 ` Thomas Huth
2021-11-09 8:51 ` Pierre Morel
2021-08-27 10:17 ` [kvm-unit-tests PATCH 4/7] s390x: css: registering IRQ Pierre Morel
2021-11-03 8:01 ` Thomas Huth
2021-11-08 12:36 ` Pierre Morel
2021-08-27 10:17 ` [kvm-unit-tests PATCH 5/7] virtio: implement the virtio_add_inbuf routine Pierre Morel
2021-11-03 7:51 ` Andrew Jones
2021-11-08 12:36 ` Pierre Morel
2021-08-27 10:17 ` [kvm-unit-tests PATCH 6/7] s390x: virtio tests setup Pierre Morel
2021-11-03 7:56 ` Andrew Jones
2021-11-03 8:14 ` Thomas Huth
2021-11-08 13:00 ` Pierre Morel
2021-11-09 7:10 ` Thomas Huth
2021-11-09 8:42 ` Andrew Jones
2021-11-09 9:01 ` Pierre Morel
2021-11-08 12:53 ` Pierre Morel
2021-08-27 10:17 ` Pierre Morel [this message]
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=1630059440-15586-8-git-send-email-pmorel@linux.ibm.com \
--to=pmorel@linux.ibm.com \
--cc=cohuck@redhat.com \
--cc=david@redhat.com \
--cc=drjones@redhat.com \
--cc=frankja@linux.ibm.com \
--cc=imbrenda@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=thuth@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox