From: "Alex Bennée" <alex.bennee@linaro.org>
To: qemu-devel@nongnu.org
Cc: "Alex Bennée" <alex.bennee@linaro.org>,
"Manos Pitsidianakis" <manos.pitsidianakis@linaro.org>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
qemu-stable@nongnu.org,
"Akihiko Odaki" <odaki@rsg.ci.i.u-tokyo.ac.jp>,
"Dmitry Osipenko" <dmitry.osipenko@collabora.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Peter Xu" <peterx@redhat.com>,
"David Hildenbrand" <david@redhat.com>
Subject: [PULL 09/17] hw/display: re-arrange memory region tracking
Date: Thu, 5 Jun 2025 17:26:42 +0100 [thread overview]
Message-ID: <20250605162651.2614401-10-alex.bennee@linaro.org> (raw)
In-Reply-To: <20250605162651.2614401-1-alex.bennee@linaro.org>
QOM objects can be embedded in other QOM objects and managed as part
of their lifetime but this isn't the case for
virtio_gpu_virgl_hostmem_region. However before we can split it out we
need some other way of associating the wider data structure with the
memory region.
Fortunately MemoryRegion has an opaque pointer. This is passed down to
MemoryRegionOps for device type regions but is unused in the
memory_region_init_ram_ptr() case. Use the opaque to carry the
reference and allow the final MemoryRegion object to be reaped when
its reference count is cleared.
Signed-off-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Message-Id: <20250410122643.1747913-2-manos.pitsidianakis@linaro.org>
Cc: qemu-stable@nongnu.org
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-ID: <20250603110204.838117-10-alex.bennee@linaro.org>
diff --git a/include/system/memory.h b/include/system/memory.h
index fc35a0dcad..90715ff44a 100644
--- a/include/system/memory.h
+++ b/include/system/memory.h
@@ -784,6 +784,7 @@ struct MemoryRegion {
DeviceState *dev;
const MemoryRegionOps *ops;
+ /* opaque data, used by backends like @ops */
void *opaque;
MemoryRegion *container;
int mapped_via_alias; /* Mapped via an alias, container might be NULL */
diff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c
index 145a0b3879..71a7500de9 100644
--- a/hw/display/virtio-gpu-virgl.c
+++ b/hw/display/virtio-gpu-virgl.c
@@ -52,17 +52,11 @@ virgl_get_egl_display(G_GNUC_UNUSED void *cookie)
#if VIRGL_VERSION_MAJOR >= 1
struct virtio_gpu_virgl_hostmem_region {
- MemoryRegion mr;
+ MemoryRegion *mr;
struct VirtIOGPU *g;
bool finish_unmapping;
};
-static struct virtio_gpu_virgl_hostmem_region *
-to_hostmem_region(MemoryRegion *mr)
-{
- return container_of(mr, struct virtio_gpu_virgl_hostmem_region, mr);
-}
-
static void virtio_gpu_virgl_resume_cmdq_bh(void *opaque)
{
VirtIOGPU *g = opaque;
@@ -73,14 +67,12 @@ static void virtio_gpu_virgl_resume_cmdq_bh(void *opaque)
static void virtio_gpu_virgl_hostmem_region_free(void *obj)
{
MemoryRegion *mr = MEMORY_REGION(obj);
- struct virtio_gpu_virgl_hostmem_region *vmr;
+ struct virtio_gpu_virgl_hostmem_region *vmr = mr->opaque;
VirtIOGPUBase *b;
VirtIOGPUGL *gl;
- vmr = to_hostmem_region(mr);
- vmr->finish_unmapping = true;
-
b = VIRTIO_GPU_BASE(vmr->g);
+ vmr->finish_unmapping = true;
b->renderer_blocked--;
/*
@@ -118,8 +110,8 @@ virtio_gpu_virgl_map_resource_blob(VirtIOGPU *g,
vmr = g_new0(struct virtio_gpu_virgl_hostmem_region, 1);
vmr->g = g;
+ mr = g_new0(MemoryRegion, 1);
- mr = &vmr->mr;
memory_region_init_ram_ptr(mr, OBJECT(mr), "blob", size, data);
memory_region_add_subregion(&b->hostmem, offset, mr);
memory_region_set_enabled(mr, true);
@@ -131,7 +123,9 @@ virtio_gpu_virgl_map_resource_blob(VirtIOGPU *g,
* command processing until MR is fully unreferenced and freed.
*/
OBJECT(mr)->free = virtio_gpu_virgl_hostmem_region_free;
+ mr->opaque = vmr;
+ vmr->mr = mr;
res->mr = mr;
return 0;
@@ -142,16 +136,15 @@ virtio_gpu_virgl_unmap_resource_blob(VirtIOGPU *g,
struct virtio_gpu_virgl_resource *res,
bool *cmd_suspended)
{
- struct virtio_gpu_virgl_hostmem_region *vmr;
VirtIOGPUBase *b = VIRTIO_GPU_BASE(g);
MemoryRegion *mr = res->mr;
+ struct virtio_gpu_virgl_hostmem_region *vmr;
int ret;
if (!mr) {
return 0;
}
-
- vmr = to_hostmem_region(res->mr);
+ vmr = mr->opaque;
/*
* Perform async unmapping in 3 steps:
--
2.47.2
next prev parent reply other threads:[~2025-06-05 16:29 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-05 16:26 [PULL 00/17] maintainer updates for May (testing, plugins, virtio-gpu) Alex Bennée
2025-06-05 16:26 ` [PULL 01/17] tests/docker: expose $HOME/.cache/qemu as docker volume Alex Bennée
2025-06-05 16:26 ` [PULL 02/17] gitlab: disable debug info on CI builds Alex Bennée
2025-06-05 16:26 ` [PULL 03/17] tests/tcg: make aarch64 boot.S handle different starting modes Alex Bennée
2025-06-05 16:26 ` [PULL 04/17] tests/qtest: Avoid unaligned access in IGB test Alex Bennée
2025-06-06 9:29 ` Akihiko Odaki
2025-06-05 16:26 ` [PULL 05/17] contrib/plugins: add a scaling factor to the ips arg Alex Bennée
2025-06-05 16:26 ` [PULL 06/17] contrib/plugins: allow setting of instructions per quantum Alex Bennée
2025-06-05 16:26 ` [PULL 07/17] MAINTAINERS: add myself to virtio-gpu for Odd Fixes Alex Bennée
2025-06-05 16:26 ` [PULL 08/17] MAINTAINERS: add Akihiko and Dmitry as reviewers Alex Bennée
2025-06-05 16:26 ` Alex Bennée [this message]
2025-06-06 5:17 ` [PULL 09/17] hw/display: re-arrange memory region tracking Akihiko Odaki
2025-06-06 9:54 ` Alex Bennée
2025-06-06 10:31 ` Akihiko Odaki
2025-06-06 11:31 ` Alex Bennée
2025-06-06 15:06 ` Akihiko Odaki
2025-06-05 16:26 ` [PULL 10/17] virtio-gpu: refactor async blob unmapping Alex Bennée
2025-06-08 8:16 ` Akihiko Odaki
2025-06-05 16:26 ` [PULL 11/17] ui/gtk-gl-area: Remove extra draw call in refresh Alex Bennée
2025-06-05 16:26 ` [PULL 12/17] virtio-gpu: support context init multiple timeline Alex Bennée
2025-06-08 8:23 ` Akihiko Odaki
2025-06-20 2:07 ` Yiwei Zhang
2025-06-20 6:45 ` Alex Bennée
2025-06-20 19:47 ` Yiwei Zhang
2025-06-21 5:59 ` Akihiko Odaki
2025-06-05 16:26 ` [PULL 13/17] include/exec: fix assert in size_memop Alex Bennée
2025-06-08 8:29 ` Akihiko Odaki
2025-06-05 16:26 ` [PULL 14/17] include/gdbstub: fix include guard in commands.h Alex Bennée
2025-06-05 16:26 ` [PULL 15/17] gdbstub: assert earlier in handle_read_all_regs Alex Bennée
2025-06-05 16:26 ` [PULL 16/17] gdbstub: Implement qGDBServerVersion packet Alex Bennée
2025-06-05 16:26 ` [PULL 17/17] gdbstub: update aarch64-core.xml Alex Bennée
2025-06-06 13:45 ` [PULL 00/17] maintainer updates for May (testing, plugins, virtio-gpu) Stefan Hajnoczi
2025-06-07 15:44 ` Alex Bennée
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=20250605162651.2614401-10-alex.bennee@linaro.org \
--to=alex.bennee@linaro.org \
--cc=david@redhat.com \
--cc=dmitry.osipenko@collabora.com \
--cc=manos.pitsidianakis@linaro.org \
--cc=mst@redhat.com \
--cc=odaki@rsg.ci.i.u-tokyo.ac.jp \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-stable@nongnu.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).