From: Akihiko Odaki <akihiko.odaki@daynix.com>
To: "Alex Bennée" <alex.bennee@linaro.org>
Cc: qemu-devel@nongnu.org,
"Sriram Yagnaraman" <sriram.yagnaraman@ericsson.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
"Dmitry Osipenko" <dmitry.osipenko@collabora.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Peter Maydell" <peter.maydell@linaro.org>,
"John Snow" <jsnow@redhat.com>,
"Marc-André Lureau" <marcandre.lureau@redhat.com>,
"Pierrick Bouvier" <pierrick.bouvier@linaro.org>,
"Peter Xu" <peterx@redhat.com>, "Fabiano Rosas" <farosas@suse.de>,
qemu-arm@nongnu.org, "Thomas Huth" <thuth@redhat.com>,
"Alexandre Iooss" <erdnaxe@crans.org>,
"Gustavo Romero" <gustavo.romero@linaro.org>,
"Markus Armbruster" <armbru@redhat.com>,
"David Hildenbrand" <david@redhat.com>,
"Daniel P. Berrangé" <berrange@redhat.com>,
"Laurent Vivier" <lvivier@redhat.com>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Mahmoud Mandour" <ma.mandourr@gmail.com>,
"Manos Pitsidianakis" <manos.pitsidianakis@linaro.org>,
qemu-stable@nongnu.org
Subject: Re: [PATCH v4 09/17] hw/display: re-arrange memory region tracking
Date: Sun, 8 Jun 2025 19:01:57 +0900 [thread overview]
Message-ID: <a0a03a8b-f431-4ad8-8ee5-80ca660325d3@daynix.com> (raw)
In-Reply-To: <69ab9a77-0e31-4c3a-91de-d8bea9d87a0a@daynix.com>
On 2025/06/07 0:02, Akihiko Odaki wrote:
>
>
> On 2025/06/06 19:16, Alex Bennée wrote:
>> Akihiko Odaki <akihiko.odaki@daynix.com> writes:
>>
>>> On 2025/06/05 20:57, Alex Bennée wrote:
>>>> Akihiko Odaki <akihiko.odaki@daynix.com> writes:
>>>>
>>>>> On 2025/06/03 20:01, Alex Bennée wrote:
>>>>>> 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>
>>>>>> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>>>>>> Message-Id: <20250410122643.1747913-2-manos.pitsidianakis@linaro.org>
>>>>>> Cc: qemu-stable@nongnu.org
>>>>>> ---
>>>>>> include/system/memory.h | 1 +
>>>>>> hw/display/virtio-gpu-virgl.c | 23 ++++++++---------------
>>>>>> 2 files changed, 9 insertions(+), 15 deletions(-)
>>>>>> 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);
>>>>>
>>>>> This patch does nothing more than adding a separate allocation for
>>>>> MemoryRegion. Besides there is no corresponding g_free(). This patch
>>>>> can be simply dropped.
>>>> As the patch says the MemoryRegion is now free'd when it is
>>>> de-referenced. Do you have a test case showing it leaking?
>>>
>>> "De-referenced" is confusing and sounds like pointer dereferencing.
>>>
>>> OBJECT(mr)->free, which has virtio_gpu_virgl_hostmem_region_free() as
>>> its value, will be called to free mr when the references of mr are
>>> removed. This patch however does not add a corresponding g_free() call
>>> to virtio_gpu_virgl_hostmem_region_free(), leaking mr.
>>>
>>> AddressSanitizer will catch the memory leak.
>>
>> Example invocation?
>>
>> I ran the AddressSantizier against all the virtio-gpu tests yesterday
>> and it did not complain.
>
> The following command line triggered the memory leak. The image is a
> clean Debian 12 installation. I booted the installation, and shut down
> it by pressing the button on the booted GDM:
>
> build/qemu-system-x86_64 -drive file=debian12.qcow2 -m 8G -smp 8 -device
> virtio-vga-gl,blob=on,hostmem=1G -display egl-headless,gl=on -vnc :0 -M
> q35,accel=kvm
> ==361968==WARNING: ASan doesn't fully support makecontext/swapcontext
> functions and may produce false positives in some cases!
> ==361968==WARNING: ASan is ignoring requested __asan_handle_no_return:
> stack type: default top: 0x7bf41d2b8380; bottom 0x7bf2e0f4c000; size:
> 0x00013c36c380 (5305189248)
> False positive error reports may follow
> For details see https://github.com/google/sanitizers/issues/189
>
> =================================================================
> ==361968==ERROR: LeakSanitizer: detected memory leaks
>
> Direct leak of 816 byte(s) in 3 object(s) allocated from:
> #0 0x7ff640f50a43 in calloc (/lib64/libasan.so.8+0xe6a43) (BuildId:
> 6a82bb83b1f19d3f3a2118085acf79daa3b52371)
> #1 0x7ff64077c901 in g_malloc0 (/lib64/libglib-2.0.so.0+0x48901)
> (BuildId: 6827394d759bc44f207f57e7ab5f8e6b17e82c1c)
> #2 0x557fa8080dc5 in virtio_gpu_virgl_map_resource_blob ../hw/
> display/virtio-gpu-virgl.c:113
> #3 0x557fa8080dc5 in virgl_cmd_resource_map_blob ../hw/display/
> virtio-gpu-virgl.c:772
> #4 0x557fa8080dc5 in virtio_gpu_virgl_process_cmd ../hw/display/
> virtio-gpu-virgl.c:952
>
> SUMMARY: AddressSanitizer: 816 byte(s) leaked in 3 allocation(s).
The following command line also reproduced the issue:
LIBGL_ALWAYS_SOFTWARE=1 \
LSAN_OPTIONS=suppressions=<(echo leak:fontconfig) \
build/qemu-system-aarch64 -M virt,accel=kvm -cpu host -smp 8 -m 8G \
-device virtio-gpu-gl,blob=on,hostmem=256M -display gtk,gl=on \
-drive file=Fedora-Workstation-Live-42-1.1.aarch64.iso,format=raw \
-bios /usr/share/edk2/aarch64/QEMU_EFI-silent-pflash.raw \
-serial mon:stdio
Fedora's Live disk allows you to test without installation.
By the way, I tried TCG to reproduce the hang, but I couldn't. I'd
appreciate if you tell:
- how to reproduce the issue
- whether the CPU usage saturates with 100 %
(i.e., if the hang is a busy-loop or not).
- the stack traces of all the threads when the hang happens.
Hopefully they will provide more insights into the problem and your fix.
Regards,
Akihiko Odaki
next prev parent reply other threads:[~2025-06-08 10:02 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-03 11:01 [PATCH v4 00/17] Maintainer updates for May (testing, plugins, virtio-gpu) - pre-PR Alex Bennée
2025-06-03 11:01 ` [PATCH v4 01/17] tests/docker: expose $HOME/.cache/qemu as docker volume Alex Bennée
2025-06-03 11:01 ` [PATCH v4 02/17] gitlab: disable debug info on CI builds Alex Bennée
2025-06-03 11:01 ` [PATCH v4 03/17] tests/tcg: make aarch64 boot.S handle different starting modes Alex Bennée
2025-06-05 8:29 ` Akihiko Odaki
2025-06-05 8:51 ` Alex Bennée
2025-06-06 9:53 ` Akihiko Odaki
2025-06-03 11:01 ` [PATCH v4 04/17] tests/qtest: Avoid unaligned access in IGB test Alex Bennée
2025-06-03 11:01 ` [PATCH v4 05/17] contrib/plugins: add a scaling factor to the ips arg Alex Bennée
2025-06-03 11:01 ` [PATCH v4 06/17] contrib/plugins: allow setting of instructions per quantum Alex Bennée
2025-06-03 11:01 ` [PATCH v4 07/17] MAINTAINERS: add myself to virtio-gpu for Odd Fixes Alex Bennée
2025-06-03 11:01 ` [PATCH v4 08/17] MAINTAINERS: add Akihiko and Dmitry as reviewers Alex Bennée
2025-06-05 8:35 ` Akihiko Odaki
2025-06-03 11:01 ` [PATCH v4 09/17] hw/display: re-arrange memory region tracking Alex Bennée
2025-06-05 8:34 ` Akihiko Odaki
2025-06-05 11:57 ` Alex Bennée
2025-06-06 9:40 ` Akihiko Odaki
2025-06-06 10:16 ` Alex Bennée
2025-06-06 15:02 ` Akihiko Odaki
2025-06-08 10:01 ` Akihiko Odaki [this message]
2025-06-03 11:01 ` [PATCH v4 10/17] virtio-gpu: refactor async blob unmapping Alex Bennée
2025-06-03 11:01 ` [PATCH v4 11/17] ui/gtk-gl-area: Remove extra draw call in refresh Alex Bennée
2025-06-03 11:01 ` [PATCH v4 12/17] virtio-gpu: support context init multiple timeline Alex Bennée
2025-06-03 11:02 ` [PATCH v4 13/17] include/exec: fix assert in size_memop Alex Bennée
2025-06-03 11:02 ` [PATCH v4 14/17] include/gdbstub: fix include guard in commands.h Alex Bennée
2025-06-03 11:02 ` [PATCH v4 15/17] gdbstub: assert earlier in handle_read_all_regs Alex Bennée
2025-06-03 11:02 ` [PATCH v4 16/17] gdbstub: Implement qGDBServerVersion packet Alex Bennée
2025-06-03 11:02 ` [PATCH v4 17/17] gdbstub: update aarch64-core.xml 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=a0a03a8b-f431-4ad8-8ee5-80ca660325d3@daynix.com \
--to=akihiko.odaki@daynix.com \
--cc=alex.bennee@linaro.org \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=david@redhat.com \
--cc=dmitry.osipenko@collabora.com \
--cc=erdnaxe@crans.org \
--cc=farosas@suse.de \
--cc=gustavo.romero@linaro.org \
--cc=jsnow@redhat.com \
--cc=lvivier@redhat.com \
--cc=ma.mandourr@gmail.com \
--cc=manos.pitsidianakis@linaro.org \
--cc=marcandre.lureau@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=peterx@redhat.com \
--cc=philmd@linaro.org \
--cc=pierrick.bouvier@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-stable@nongnu.org \
--cc=sriram.yagnaraman@ericsson.com \
--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;
as well as URLs for NNTP newsgroup(s).