From: "Michael S. Tsirkin" <mst@redhat.com>
To: Albert Esteve <aesteve@redhat.com>
Cc: qemu-devel@nongnu.org, stefanha@gmail.com,
alex.bennee@linaro.org, philmd@linaro.org, kraxel@redhat.com,
marcandre.lureau@gmail.com, Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [PATCH v4 4/5] hw/virtio: cleanup shared resources
Date: Tue, 12 Mar 2024 14:13:56 -0400 [thread overview]
Message-ID: <20240312141103-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20240219143423.272012-5-aesteve@redhat.com>
On Mon, Feb 19, 2024 at 03:34:22PM +0100, Albert Esteve wrote:
> Ensure that we cleanup all virtio shared
> resources when the vhost devices is cleaned
> up (after a hot unplug, or a crash).
>
> To do so, we add a new function to the virtio_dmabuf
> API called `virtio_dmabuf_vhost_cleanup`, which
> loop through the table and removes all
> resources owned by the vhost device parameter.
>
> Also, add a test to verify that the new
> function in the API behaves as expected.
>
> Signed-off-by: Albert Esteve <aesteve@redhat.com>
> Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
> ---
> hw/display/virtio-dmabuf.c | 21 ++++++++++++++++++++
> hw/virtio/vhost.c | 3 +++
> include/hw/virtio/virtio-dmabuf.h | 10 ++++++++++
> tests/unit/test-virtio-dmabuf.c | 33 +++++++++++++++++++++++++++++++
> 4 files changed, 67 insertions(+)
>
> diff --git a/hw/display/virtio-dmabuf.c b/hw/display/virtio-dmabuf.c
> index 961094a561..703b5bd979 100644
> --- a/hw/display/virtio-dmabuf.c
> +++ b/hw/display/virtio-dmabuf.c
> @@ -141,6 +141,27 @@ SharedObjectType virtio_object_type(const QemuUUID *uuid)
> return vso->type;
> }
>
> +static bool virtio_dmabuf_resource_is_owned(gpointer key,
> + gpointer value,
> + gpointer dev)
> +{
> + VirtioSharedObject *vso;
> +
> + vso = (VirtioSharedObject *) value;
> + return vso->type == TYPE_VHOST_DEV && vso->value.dev == dev;
> +}
> +
> +int virtio_dmabuf_vhost_cleanup(struct vhost_dev *dev)
> +{
> + int num_removed;
> +
> + WITH_QEMU_LOCK_GUARD(&lock) {
If I don't apply previous patch I can not apply this one either.
> + num_removed = g_hash_table_foreach_remove(
> + resource_uuids, (GHRFunc) virtio_dmabuf_resource_is_owned, dev);
> + }
> + return num_removed;
> +}
> +
> void virtio_free_resources(void)
> {
> WITH_QEMU_LOCK_GUARD(&lock) {
> diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
> index 2c9ac79468..c5622eac14 100644
> --- a/hw/virtio/vhost.c
> +++ b/hw/virtio/vhost.c
> @@ -16,6 +16,7 @@
> #include "qemu/osdep.h"
> #include "qapi/error.h"
> #include "hw/virtio/vhost.h"
> +#include "hw/virtio/virtio-dmabuf.h"
> #include "qemu/atomic.h"
> #include "qemu/range.h"
> #include "qemu/error-report.h"
> @@ -1599,6 +1600,8 @@ void vhost_dev_cleanup(struct vhost_dev *hdev)
> migrate_del_blocker(&hdev->migration_blocker);
> g_free(hdev->mem);
> g_free(hdev->mem_sections);
> + /* free virtio shared objects */
> + virtio_dmabuf_vhost_cleanup(hdev);
> if (hdev->vhost_ops) {
> hdev->vhost_ops->vhost_backend_cleanup(hdev);
> }
> diff --git a/include/hw/virtio/virtio-dmabuf.h b/include/hw/virtio/virtio-dmabuf.h
> index 627d84dce9..950cd24967 100644
> --- a/include/hw/virtio/virtio-dmabuf.h
> +++ b/include/hw/virtio/virtio-dmabuf.h
> @@ -119,6 +119,16 @@ struct vhost_dev *virtio_lookup_vhost_device(const QemuUUID *uuid);
> */
> SharedObjectType virtio_object_type(const QemuUUID *uuid);
>
> +/**
> + * virtio_dmabuf_vhost_cleanup() - Destroys all entries of the shared
> + * resources lookup table that are owned by the vhost backend
> + * @dev: the pointer to the vhost device that owns the entries. Data is owned
> + * by the called of the function.
> + *
trailing space here
> + * Return: the number of resource entries removed.
> + */
> +int virtio_dmabuf_vhost_cleanup(struct vhost_dev *dev);
> +
> /**
> * virtio_free_resources() - Destroys all keys and values of the shared
> * resources lookup table, and frees them
> diff --git a/tests/unit/test-virtio-dmabuf.c b/tests/unit/test-virtio-dmabuf.c
> index 20213455ee..e5cf7ee19f 100644
> --- a/tests/unit/test-virtio-dmabuf.c
> +++ b/tests/unit/test-virtio-dmabuf.c
> @@ -107,6 +107,38 @@ static void test_add_invalid_resource(void)
> }
> }
>
> +static void test_cleanup_res(void)
> +{
> + QemuUUID uuids[20], uuid_alt;
> + struct vhost_dev *dev = g_new0(struct vhost_dev, 1);
> + struct vhost_dev *dev_alt = g_new0(struct vhost_dev, 1);
> + int i, num_removed;
> +
> + for (i = 0; i < ARRAY_SIZE(uuids); ++i) {
> + qemu_uuid_generate(&uuids[i]);
> + virtio_add_vhost_device(&uuids[i], dev);
> + /* vhost device is found */
> + g_assert(virtio_lookup_vhost_device(&uuids[i]) != NULL);
> + }
> + qemu_uuid_generate(&uuid_alt);
> + virtio_add_vhost_device(&uuid_alt, dev_alt);
> + /* vhost device is found */
> + g_assert(virtio_lookup_vhost_device(&uuid_alt) != NULL);
> + /* cleanup all dev resources */
> + num_removed = virtio_dmabuf_vhost_cleanup(dev);
> + g_assert_cmpint(num_removed, ==, ARRAY_SIZE(uuids));
> + for (i = 0; i < ARRAY_SIZE(uuids); ++i) {
> + /* None of the dev resources is found after free'd */
> + g_assert_cmpint(virtio_lookup_dmabuf(&uuids[i]), ==, -1);
> + }
> + /* uuid_alt is still in the hash table */
> + g_assert(virtio_lookup_vhost_device(&uuid_alt) != NULL);
> +
> + virtio_free_resources();
> + g_free(dev);
> + g_free(dev_alt);
> +}
> +
> static void test_free_resources(void)
> {
> QemuUUID uuids[20];
> @@ -136,6 +168,7 @@ int main(int argc, char **argv)
> test_remove_invalid_resource);
> g_test_add_func("/virtio-dmabuf/add_invalid_res",
> test_add_invalid_resource);
> + g_test_add_func("/virtio-dmabuf/cleanup_dev", test_cleanup_res);
> g_test_add_func("/virtio-dmabuf/free_res", test_free_resources);
>
> return g_test_run();
> --
> 2.43.1
next prev parent reply other threads:[~2024-03-12 18:14 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-19 14:34 [PATCH v4 0/5] Virtio dmabuf improvements Albert Esteve
2024-02-19 14:34 ` [PATCH v4 1/5] hw/virtio: check owner for removing objects Albert Esteve
2024-02-19 14:34 ` [PATCH v4 2/5] hw/virtio: document SharedObject structures Albert Esteve
2024-02-20 10:28 ` Manos Pitsidianakis
2024-03-06 13:13 ` Albert Esteve
2024-02-19 14:34 ` [PATCH v4 3/5] hw/virtio: change dmabuf mutex to QemuMutex Albert Esteve
2024-02-20 10:34 ` Manos Pitsidianakis
2024-03-11 13:31 ` Albert Esteve
2024-03-12 20:47 ` Alex Bennée
2024-02-19 14:34 ` [PATCH v4 4/5] hw/virtio: cleanup shared resources Albert Esteve
2024-02-20 10:39 ` Manos Pitsidianakis
2024-03-12 18:13 ` Michael S. Tsirkin [this message]
2024-02-19 14:34 ` [PATCH v4 5/5] hw/virtio: rename virtio dmabuf API Albert Esteve
2024-03-12 18:23 ` [PATCH v4 0/5] Virtio dmabuf improvements Michael S. Tsirkin
2024-03-13 8:00 ` 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=20240312141103-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=aesteve@redhat.com \
--cc=alex.bennee@linaro.org \
--cc=kraxel@redhat.com \
--cc=marcandre.lureau@gmail.com \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@gmail.com \
--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.