From: Peter Xu <peterx@redhat.com>
To: Akihiko Odaki <akihiko.odaki@daynix.com>
Cc: "Eduardo Habkost" <eduardo@habkost.net>,
"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Yanan Wang" <wangyanan55@huawei.com>,
"John Snow" <jsnow@redhat.com>,
"BALATON Zoltan" <balaton@eik.bme.hu>,
"Jiaxun Yang" <jiaxun.yang@flygoat.com>,
"Nicholas Piggin" <npiggin@gmail.com>,
"Daniel Henrique Barboza" <danielhb413@gmail.com>,
"David Gibson" <david@gibson.dropbear.id.au>,
"Harsh Prateek Bora" <harshpb@linux.ibm.com>,
"Alexey Kardashevskiy" <aik@ozlabs.ru>,
"Michael S. Tsirkin" <mst@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Fabiano Rosas" <farosas@suse.de>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"David Hildenbrand" <david@redhat.com>,
"Thomas Huth" <thuth@redhat.com>,
"Laurent Vivier" <lvivier@redhat.com>,
"Peter Maydell" <peter.maydell@linaro.org>,
qemu-devel@nongnu.org, qemu-block@nongnu.org,
qemu-ppc@nongnu.org
Subject: Re: [PATCH v4 6/7] memory: Do not create circular reference with subregion
Date: Mon, 26 Aug 2024 11:21:58 -0400 [thread overview]
Message-ID: <Zsydli9ME1u79A9X@x1n> (raw)
In-Reply-To: <20240823-san-v4-6-a24c6dfa4ceb@daynix.com>
On Fri, Aug 23, 2024 at 03:13:11PM +0900, Akihiko Odaki wrote:
> memory_region_update_container_subregions() used to call
> memory_region_ref(), which creates a reference to the owner of the
> subregion, on behalf of the owner of the container. This results in a
> circular reference if the subregion and container have the same owner.
>
> memory_region_ref() creates a reference to the owner instead of the
> memory region to match the lifetime of the owner and memory region. We
> do not need such a hack if the subregion and container have the same
> owner because the owner will be alive as long as the container is.
> Therefore, create a reference to the subregion itself instead ot its
> owner in such a case; the reference to the subregion is still necessary
> to ensure that the subregion gets finalized after the container.
>
> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
> ---
> system/memory.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/system/memory.c b/system/memory.c
> index 5e6eb459d5de..e4d3e9d1f427 100644
> --- a/system/memory.c
> +++ b/system/memory.c
> @@ -2612,7 +2612,9 @@ static void memory_region_update_container_subregions(MemoryRegion *subregion)
>
> memory_region_transaction_begin();
>
> - memory_region_ref(subregion);
> + object_ref(mr->owner == subregion->owner ?
> + OBJECT(subregion) : subregion->owner);
The only place that mr->refcount is used so far is the owner with the
object property attached to the mr, am I right (ignoring name-less MRs)?
I worry this will further complicate refcounting, now we're actively using
two refcounts for MRs..
Continue discussion there:
https://lore.kernel.org/r/067b17a4-cdfc-4f7e-b7e4-28c38e1c10f0@daynix.com
What I don't see is how mr->subregions differs from mr->container, so we
allow subregions to be attached but not the container when finalize()
(which is, afaict, the other way round).
It seems easier to me that we allow both container and subregions to exist
as long as within the owner itself, rather than start heavier use of
mr->refcount.
I tend to agree with you in another thread, where you mentioned it's better
we get rid of one of the refcounts. If not trivial to get, we should still
try to stick with one refcount to make it less chaos.
> +
> QTAILQ_FOREACH(other, &mr->subregions, subregions_link) {
> if (subregion->priority >= other->priority) {
> QTAILQ_INSERT_BEFORE(other, subregion, subregions_link);
> @@ -2670,7 +2672,9 @@ void memory_region_del_subregion(MemoryRegion *mr,
> assert(alias->mapped_via_alias >= 0);
> }
> QTAILQ_REMOVE(&mr->subregions, subregion, subregions_link);
> - memory_region_unref(subregion);
> + object_unref(mr->owner == subregion->owner ?
> + OBJECT(subregion) : subregion->owner);
> +
> memory_region_update_pending |= mr->enabled && subregion->enabled;
> memory_region_transaction_commit();
> }
>
> --
> 2.46.0
>
--
Peter Xu
next prev parent reply other threads:[~2024-08-26 15:22 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-23 6:13 [PATCH v4 0/7] Fix check-qtest-ppc64 sanitizer errors Akihiko Odaki
2024-08-23 6:13 ` [PATCH v4 1/7] migration: Free removed SaveStateEntry Akihiko Odaki
2024-08-23 12:30 ` Fabiano Rosas
2024-08-23 6:13 ` [PATCH v4 2/7] memory: Do not refer to "memory region's reference count" Akihiko Odaki
2024-08-23 6:13 ` [PATCH v4 3/7] memory: Refer to docs/devel/memory.rst for "owner" Akihiko Odaki
2024-08-23 6:13 ` [PATCH v4 4/7] memory: Clarify that owner may be missing Akihiko Odaki
2024-08-23 6:13 ` [PATCH v4 5/7] memory: Clarify owner must not call memory_region_ref() Akihiko Odaki
2024-08-26 15:31 ` Peter Xu
2024-08-23 6:13 ` [PATCH v4 6/7] memory: Do not create circular reference with subregion Akihiko Odaki
2024-08-26 15:21 ` Peter Xu [this message]
2024-08-26 17:10 ` Peter Maydell
2024-08-26 19:42 ` Peter Xu
2024-08-27 4:14 ` Akihiko Odaki
2024-08-27 16:11 ` Peter Xu
2024-08-28 5:33 ` Akihiko Odaki
2024-08-28 13:09 ` Peter Xu
2024-08-28 14:02 ` Akihiko Odaki
2024-08-28 15:56 ` Peter Xu
2024-08-29 4:39 ` Akihiko Odaki
2024-08-29 19:48 ` Peter Xu
2024-08-30 6:11 ` Akihiko Odaki
2024-08-30 15:05 ` Peter Xu
2024-08-31 4:03 ` Akihiko Odaki
2024-08-23 6:13 ` [PATCH v4 7/7] tests/qtest: Delete previous boot file Akihiko Odaki
2024-08-26 15:26 ` Peter Xu
2024-08-27 13:20 ` Thomas Huth
2024-08-27 14:03 ` Fabiano Rosas
2024-08-27 14:46 ` Peter Maydell
2024-08-27 15:54 ` Fabiano Rosas
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=Zsydli9ME1u79A9X@x1n \
--to=peterx@redhat.com \
--cc=aik@ozlabs.ru \
--cc=akihiko.odaki@daynix.com \
--cc=alex.bennee@linaro.org \
--cc=balaton@eik.bme.hu \
--cc=danielhb413@gmail.com \
--cc=david@gibson.dropbear.id.au \
--cc=david@redhat.com \
--cc=eduardo@habkost.net \
--cc=farosas@suse.de \
--cc=harshpb@linux.ibm.com \
--cc=jiaxun.yang@flygoat.com \
--cc=jsnow@redhat.com \
--cc=lvivier@redhat.com \
--cc=marcel.apfelbaum@gmail.com \
--cc=mst@redhat.com \
--cc=npiggin@gmail.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=philmd@linaro.org \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=thuth@redhat.com \
--cc=wangyanan55@huawei.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).