Commit 554a1f83c6 for qemu.org

commit 554a1f83c6118df74b2cb1e4da2271152857b5ad
Author: Marc-André Lureau <marcandre.lureau@redhat.com>
Date:   Sun May 10 16:48:04 2026 +0400

    memory: use object_property_add_link for container property

    Replace the hand-rolled container property with
    object_property_add_link().

    With check=NULL the link has no setter (read-only), matching the
    existing behaviour. The built-in link getter and resolver are
    functionally identical to the removed memory_region_get_container() and
    memory_region_resolve_container(). The non-STRONG flag avoids refcount
    interference: mr->container is managed externally by
    memory_region_add/del_subregion().

    Reviewed-by: Peter Xu <peterx@redhat.com>
    Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

diff --git a/system/memory.c b/system/memory.c
index d4a0a5b818..264dc90c0a 100644
--- a/system/memory.c
+++ b/system/memory.c
@@ -1254,29 +1254,6 @@ void memory_region_init(MemoryRegion *mr,
     memory_region_do_init(mr, owner, name, size);
 }

-static void memory_region_get_container(Object *obj, Visitor *v,
-                                        const char *name, void *opaque,
-                                        Error **errp)
-{
-    MemoryRegion *mr = MEMORY_REGION(obj);
-    char *path = (char *)"";
-
-    if (mr->container) {
-        path = object_get_canonical_path(OBJECT(mr->container));
-    }
-    visit_type_str(v, name, &path, errp);
-    if (mr->container) {
-        g_free(path);
-    }
-}
-
-static Object *memory_region_resolve_container(Object *obj, void *opaque,
-                                               const char *part)
-{
-    MemoryRegion *mr = MEMORY_REGION(obj);
-
-    return OBJECT(mr->container);
-}

 static void memory_region_get_priority(Object *obj, Visitor *v,
                                        const char *name, void *opaque,
@@ -1300,7 +1277,6 @@ static void memory_region_get_size(Object *obj, Visitor *v, const char *name,
 static void memory_region_initfn(Object *obj)
 {
     MemoryRegion *mr = MEMORY_REGION(obj);
-    ObjectProperty *op;

     mr->ops = &unassigned_mem_ops;
     mr->enabled = true;
@@ -1309,12 +1285,11 @@ static void memory_region_initfn(Object *obj)
     QTAILQ_INIT(&mr->subregions);
     QTAILQ_INIT(&mr->coalesced);

-    op = object_property_add(OBJECT(mr), "container",
-                             "link<" TYPE_MEMORY_REGION ">",
-                             memory_region_get_container,
-                             NULL, /* memory_region_set_container */
-                             NULL, NULL);
-    op->resolve = memory_region_resolve_container;
+    object_property_add_link(obj, "container",
+                             TYPE_MEMORY_REGION,
+                             (Object **)&mr->container,
+                             NULL, /* read-only: no check means no setter */
+                             0);

     object_property_add_uint64_ptr(OBJECT(mr), "addr",
                                    &mr->addr, OBJ_PROP_FLAG_READ);