From: Albert Esteve <aesteve@redhat.com>
To: Stefan Hajnoczi <stefanha@redhat.com>
Cc: qemu-devel@nongnu.org, david@redhat.com,
"Michael S. Tsirkin" <mst@redhat.com>,
hi@alyssa.is, jasowang@redhat.com,
"Laurent Vivier" <lvivier@redhat.com>,
dbassey@redhat.com, "Stefano Garzarella" <sgarzare@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
stevensd@chromium.org, "Fabiano Rosas" <farosas@suse.de>,
"Alex Bennée" <alex.bennee@linaro.org>,
slp@redhat.com
Subject: Re: [PATCH v7 6/8] tests/qtest: Add GET_SHMEM validation test
Date: Tue, 19 Aug 2025 14:16:47 +0200 [thread overview]
Message-ID: <CADSE00J61r4Wt94s6OfCqt9V8sVaisgDajvKEYFmG1FJKdVfng@mail.gmail.com> (raw)
In-Reply-To: <20250818231438.GA30271@fedora>
On Tue, Aug 19, 2025 at 12:42 PM Stefan Hajnoczi <stefanha@redhat.com> wrote:
>
> On Mon, Aug 18, 2025 at 12:03:51PM +0200, Albert Esteve wrote:
> > Improve vhost-user-test to properly validate
> > VHOST_USER_GET_SHMEM_CONFIG message handling by
> > directly simulating the message exchange.
> >
> > The test manually triggers the
> > VHOST_USER_GET_SHMEM_CONFIG message by calling
> > chr_read() with a crafted VhostUserMsg, allowing direct
> > validation of the shmem configuration response handler.
>
> It looks like this test case invokes its own chr_read() function without
> going through QEMU, so I don't understand what this is testing?
I spent some time trying to test it, but in the end I could not
instatiate vhost-user-device because it is non user_creatable. I did
not find any test for vhost-user-device anywhere else either. But I
had already added most of the infrastructure here so I fallback to
chr_read() communication to avoid having to delete everything. My
though was that once we have other devices that use shared memory,
they could tweak the test to instantiate the proper device and test
this and the map/unmap operations.
Although after writing this, I think other devices will actually a
specific layout for their shared memory. So
VHOST_USER_GET_SHMEM_CONFIG is only ever going to be used by
vhost-user-device.
In general, trying to test this patch series has been a headache other
than trying with external device code I have. If you have an idea that
I could try to test this, I can try. Otherwise, probably is best to
remove this commit from the series and wait for another vhost-user
device that uses map/unmap to land to be able to test it.
>
> >
> > Added TestServerShmem structure to track shmem
> > configuration state, including nregions_sent and
> > sizes_sent arrays for comprehensive validation.
> > The test verifies that the response contains the expected
> > number of shared memory regions and their corresponding
> > sizes.
> >
> > Signed-off-by: Albert Esteve <aesteve@redhat.com>
> > ---
> > tests/qtest/vhost-user-test.c | 91 +++++++++++++++++++++++++++++++++++
> > 1 file changed, 91 insertions(+)
> >
> > diff --git a/tests/qtest/vhost-user-test.c b/tests/qtest/vhost-user-test.c
> > index 75cb3e44b2..44a5e90b2e 100644
> > --- a/tests/qtest/vhost-user-test.c
> > +++ b/tests/qtest/vhost-user-test.c
> > @@ -88,6 +88,7 @@ typedef enum VhostUserRequest {
> > VHOST_USER_SET_VRING_ENABLE = 18,
> > VHOST_USER_GET_CONFIG = 24,
> > VHOST_USER_SET_CONFIG = 25,
> > + VHOST_USER_GET_SHMEM_CONFIG = 44,
> > VHOST_USER_MAX
> > } VhostUserRequest;
> >
> > @@ -109,6 +110,20 @@ typedef struct VhostUserLog {
> > uint64_t mmap_offset;
> > } VhostUserLog;
> >
> > +#define VIRTIO_MAX_SHMEM_REGIONS 256
> > +
> > +typedef struct VhostUserShMemConfig {
> > + uint32_t nregions;
> > + uint32_t padding;
> > + uint64_t memory_sizes[VIRTIO_MAX_SHMEM_REGIONS];
> > +} VhostUserShMemConfig;
> > +
> > +typedef struct TestServerShmem {
> > + bool test_enabled;
> > + uint32_t nregions_sent;
> > + uint64_t sizes_sent[VIRTIO_MAX_SHMEM_REGIONS];
> > +} TestServerShmem;
> > +
> > typedef struct VhostUserMsg {
> > VhostUserRequest request;
> >
> > @@ -124,6 +139,7 @@ typedef struct VhostUserMsg {
> > struct vhost_vring_addr addr;
> > VhostUserMemory memory;
> > VhostUserLog log;
> > + VhostUserShMemConfig shmem;
> > } payload;
> > } QEMU_PACKED VhostUserMsg;
> >
> > @@ -170,6 +186,7 @@ typedef struct TestServer {
> > bool test_fail;
> > int test_flags;
> > int queues;
> > + TestServerShmem shmem;
> > struct vhost_user_ops *vu_ops;
> > } TestServer;
> >
> > @@ -513,6 +530,31 @@ static void chr_read(void *opaque, const uint8_t *buf, int size)
> > qos_printf("set_vring(%d)=%s\n", msg.payload.state.index,
> > msg.payload.state.num ? "enabled" : "disabled");
> > break;
> > +
> > + case VHOST_USER_GET_SHMEM_CONFIG:
> > + if (!s->shmem.test_enabled) {
> > + /* Reply with error if shmem feature not enabled */
> > + msg.flags |= VHOST_USER_REPLY_MASK;
> > + msg.size = sizeof(uint64_t);
> > + msg.payload.u64 = -1; /* Error */
> > + qemu_chr_fe_write_all(chr, (uint8_t *) &msg, VHOST_USER_HDR_SIZE + msg.size);
> > + } else {
> > + /* Reply with test shmem configuration */
> > + msg.flags |= VHOST_USER_REPLY_MASK;
> > + msg.size = sizeof(VhostUserShMemConfig);
> > + msg.payload.shmem.nregions = 2; /* Test with 2 regions */
> > + msg.payload.shmem.padding = 0;
> > + msg.payload.shmem.memory_sizes[0] = 0x100000; /* 1MB */
> > + msg.payload.shmem.memory_sizes[1] = 0x200000; /* 2MB */
> > +
> > + /* Record what we're sending for test validation */
> > + s->shmem.nregions_sent = msg.payload.shmem.nregions;
> > + s->shmem.sizes_sent[0] = msg.payload.shmem.memory_sizes[0];
> > + s->shmem.sizes_sent[1] = msg.payload.shmem.memory_sizes[1];
> > +
> > + qemu_chr_fe_write_all(chr, (uint8_t *) &msg, VHOST_USER_HDR_SIZE + msg.size);
> > + }
> > + break;
> >
> > default:
> > qos_printf("vhost-user: un-handled message: %d\n", msg.request);
> > @@ -809,6 +851,22 @@ static void *vhost_user_test_setup_shm(GString *cmd_line, void *arg)
> > return server;
> > }
> >
> > +static void *vhost_user_test_setup_shmem_config(GString *cmd_line, void *arg)
> > +{
> > + TestServer *server = test_server_new("vhost-user-test", arg);
> > + test_server_listen(server);
> > +
> > + /* Enable shmem testing for this server */
> > + server->shmem.test_enabled = true;
> > +
> > + append_mem_opts(server, cmd_line, 256, TEST_MEMFD_SHM);
> > + server->vu_ops->append_opts(server, cmd_line, "");
> > +
> > + g_test_queue_destroy(vhost_user_test_cleanup, server);
> > +
> > + return server;
> > +}
> > +
> > static void test_read_guest_mem(void *obj, void *arg, QGuestAllocator *alloc)
> > {
> > TestServer *server = arg;
> > @@ -1089,6 +1147,33 @@ static struct vhost_user_ops g_vu_net_ops = {
> > .get_protocol_features = vu_net_get_protocol_features,
> > };
> >
> > +/* Test function for VHOST_USER_GET_SHMEM_CONFIG message */
> > +static void test_shmem_config(void *obj, void *arg, QGuestAllocator *alloc)
> > +{
> > + TestServer *s = arg;
> > +
> > + g_assert_true(s->shmem.test_enabled);
> > +
> > + g_mutex_lock(&s->data_mutex);
> > + s->shmem.nregions_sent = 0;
> > + s->shmem.sizes_sent[0] = 0;
> > + s->shmem.sizes_sent[1] = 0;
> > + g_mutex_unlock(&s->data_mutex);
> > +
> > + VhostUserMsg msg = {
> > + .request = VHOST_USER_GET_SHMEM_CONFIG,
> > + .flags = VHOST_USER_VERSION,
> > + .size = 0,
> > + };
> > + chr_read(s, (uint8_t *) &msg, VHOST_USER_HDR_SIZE);
> > +
> > + g_mutex_lock(&s->data_mutex);
> > + g_assert_cmpint(s->shmem.nregions_sent, ==, 2);
> > + g_assert_cmpint(s->shmem.sizes_sent[0], ==, 0x100000); /* 1MB */
> > + g_assert_cmpint(s->shmem.sizes_sent[1], ==, 0x200000); /* 2MB */
> > + g_mutex_unlock(&s->data_mutex);
> > +}
> > +
> > static void register_vhost_user_test(void)
> > {
> > QOSGraphTestOptions opts = {
> > @@ -1136,6 +1221,12 @@ static void register_vhost_user_test(void)
> > qos_add_test("vhost-user/multiqueue",
> > "virtio-net",
> > test_multiqueue, &opts);
> > +
> > + opts.before = vhost_user_test_setup_shmem_config;
> > + opts.edge.extra_device_opts = "";
> > + qos_add_test("vhost-user/shmem-config",
> > + "virtio-net",
> > + test_shmem_config, &opts);
> > }
> > libqos_init(register_vhost_user_test);
> >
> > --
> > 2.49.0
> >
next prev parent reply other threads:[~2025-08-19 12:17 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-18 10:03 [PATCH v7 0/8] vhost-user: Add SHMEM_MAP/UNMAP requests Albert Esteve
2025-08-18 10:03 ` [PATCH v7 1/8] vhost-user: Add VirtIO Shared Memory map request Albert Esteve
2025-08-18 18:58 ` Stefan Hajnoczi
2025-08-19 12:47 ` Albert Esteve
2025-08-19 12:56 ` Albert Esteve
2025-08-19 9:22 ` David Hildenbrand
2025-08-18 10:03 ` [PATCH v7 2/8] vhost_user.rst: Align VhostUserMsg excerpt members Albert Esteve
2025-08-18 10:03 ` [PATCH v7 3/8] vhost_user.rst: Add SHMEM_MAP/_UNMAP to spec Albert Esteve
2025-08-18 10:03 ` [PATCH v7 4/8] vhost_user: Add frontend get_shmem_config command Albert Esteve
2025-08-18 10:03 ` [PATCH v7 5/8] vhost_user.rst: Add GET_SHMEM_CONFIG message Albert Esteve
2025-08-18 10:03 ` [PATCH v7 6/8] tests/qtest: Add GET_SHMEM validation test Albert Esteve
2025-08-18 23:14 ` Stefan Hajnoczi
2025-08-19 12:16 ` Albert Esteve [this message]
2025-08-20 8:47 ` Alyssa Ross
2025-08-20 15:42 ` Stefan Hajnoczi
2025-08-20 20:33 ` Stefan Hajnoczi
2025-08-21 6:50 ` Albert Esteve
2025-09-10 11:10 ` Albert Esteve
2025-08-18 10:03 ` [PATCH v7 7/8] qmp: add shmem feature map Albert Esteve
2025-08-18 10:03 ` [PATCH v7 8/8] vhost-user-device: Add shared memory BAR Albert Esteve
2025-08-19 10:42 ` Stefan Hajnoczi
2025-08-19 11:41 ` Albert Esteve
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=CADSE00J61r4Wt94s6OfCqt9V8sVaisgDajvKEYFmG1FJKdVfng@mail.gmail.com \
--to=aesteve@redhat.com \
--cc=alex.bennee@linaro.org \
--cc=david@redhat.com \
--cc=dbassey@redhat.com \
--cc=farosas@suse.de \
--cc=hi@alyssa.is \
--cc=jasowang@redhat.com \
--cc=lvivier@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=sgarzare@redhat.com \
--cc=slp@redhat.com \
--cc=stefanha@redhat.com \
--cc=stevensd@chromium.org \
/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;
as well as URLs for NNTP newsgroup(s).