Skip to contentSkip to conversation

ivshmem: fix memory backend leak

PATCH Applied Igor Mammedov 5 participants 7 messages Nov 1, 2018 – Nov 6, 2018

v1 of 2 Applied Latest is v2 →

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ivshmem: fix memory backend leak

object_new() returns a new backend with refcount == 1 and then later object_property_add_child() increases refcount to 2 So when ivshmem is desroyed, the backend it has created isn't destroyed along with it as children cleanup will bring backend's refcount only to 1, which leaks backend including resources it is using.

Drop the original reference from object_new() once backend is attached to its parent.

---
 hw/misc/ivshmem.c | 1 +
 1 file changed, 1 insertion(+)
hw/misc/ivshmem.c +1 -0
index f88910e..ecfd10a 100644
@@ -1279,6 +1279,7 @@ static void desugar_shm(IVShmemState *s)
     object_property_set_bool(obj, true, "share", &error_abort);
     object_property_add_child(OBJECT(s), "internal-shm-backend", obj,
                               &error_abort);
+    object_unref(obj);
     user_creatable_complete(obj, &error_abort);
     s->hostmem = MEMORY_BACKEND(obj);
 }
Signature · 1 line
2.7.4
Reviewed-by on v1 1/1
#1 lore raw
Quoted 8 lines · Igor Mammedov

object_new() returns a new backend with refcount == 1 and then later object_property_add_child() increases refcount to 2 So when ivshmem is desroyed, the backend it has created isn't destroyed along with it as children cleanup will bring backend's refcount only to 1, which leaks backend including resources it is using.

Quoted 4 lines

Drop the original reference from object_new() once backend is attached to its parent.

I would rather have the unref in finalize, but that is ok too.

Quoted 20 lines
---
 hw/misc/ivshmem.c | 1 +
 1 file changed, 1 insertion(+)
hw/misc/ivshmem.c +1 -1
index f88910e..ecfd10a 100644
@@ -1279,6 +1279,7 @@ static void desugar_shm(IVShmemState *s)
     object_property_set_bool(obj, true, "share", &error_abort);
     object_property_add_child(OBJECT(s), "internal-shm-backend", obj,
                               &error_abort);
+    object_unref(obj);
     user_creatable_complete(obj, &error_abort);
     s->hostmem = MEMORY_BACKEND(obj);
 }
--

2.7.4

Signature · 1 line
Marc-André Lureau
#2 lore raw
Quoted 9 lines · On Thu, 1 Nov 2018 15:02:04 +0400 Marc-André Lureau…
Quoted 8 lines · Igor Mammedov

object_new() returns a new backend with refcount == 1 and then later object_property_add_child() increases refcount to 2 So when ivshmem is desroyed, the backend it has created isn't destroyed along with it as children cleanup will bring backend's refcount only to 1, which leaks backend including resources it is using.

Quoted 6 lines
Quoted 4 lines

Drop the original reference from object_new() once backend is attached to its parent.

I would rather have the unref in finalize, but that is ok too.

I followed the pattern we use else where, i.e. drop reference as soon as we set the parent (virtio-rng/cpus) within the same scope as object_new().

There is no point in keeping reference until finalize time since backend is kept alive as child and is destroyed well after all nonexistent ivshmem::unrealize/finilize() are finished when generic Object is being destroyed.

Quoted 24 lines
Quoted 20 lines
---
 hw/misc/ivshmem.c | 1 +
 1 file changed, 1 insertion(+)
hw/misc/ivshmem.c +1 -1
index f88910e..ecfd10a 100644
@@ -1279,6 +1279,7 @@ static void desugar_shm(IVShmemState *s)
     object_property_set_bool(obj, true, "share", &error_abort);
     object_property_add_child(OBJECT(s), "internal-shm-backend", obj,
                               &error_abort);
+    object_unref(obj);
     user_creatable_complete(obj, &error_abort);
     s->hostmem = MEMORY_BACKEND(obj);
 }
--

2.7.4

Reviewed-by
#3 lore raw
Quoted 12 lines · Igor Mammedov
Quoted 9 lines · On Thu, 1 Nov 2018 15:02:04 +0400 Marc-André Lureau…
Quoted 8 lines · Igor Mammedov

object_new() returns a new backend with refcount == 1 and then later object_property_add_child() increases refcount to 2 So when ivshmem is desroyed, the backend it has created isn't destroyed along with it as children cleanup will bring backend's refcount only to 1, which leaks backend including resources it is using.

Quoted 3 lines
Quoted 3 lines
Quoted 3 lines

Drop the original reference from object_new() once backend is attached to its parent.

I believe

Fixes 5503e285041979dd29698ecb41729b3b22622e8d
Quoted 11 lines
Quoted 3 lines
Quoted 1 line

I would rather have the unref in finalize, but that is ok too.

I followed the pattern we use else where, i.e. drop reference as soon as we set the parent (virtio-rng/cpus) within the same scope as object_new().

There is no point in keeping reference until finalize time since backend is kept alive as child and is destroyed well after all nonexistent ivshmem::unrealize/finilize() are finished when generic Object is being destroyed.

Concur.

Quoted 1 line
Quoted 1 line

With Philippe's spelling fix:

#4 lore raw
In reply to Igor Mammedov
Quoted 3 lines · Igor Mammedov

object_new() returns a new backend with refcount == 1 and then later object_property_add_child() increases refcount to 2 So when ivshmem is desroyed, the backend it has created isn't

^ "destroyed"

Quoted 25 lines

destroyed along with it as children cleanup will bring backend's refcount only to 1, which leaks backend including resources it is using.

Drop the original reference from object_new() once backend is attached to its parent.

---
  hw/misc/ivshmem.c | 1 +
  1 file changed, 1 insertion(+)
hw/misc/ivshmem.c +1 -0
index f88910e..ecfd10a 100644
@@ -1279,6 +1279,7 @@ static void desugar_shm(IVShmemState *s)
      object_property_set_bool(obj, true, "share", &error_abort);
      object_property_add_child(OBJECT(s), "internal-shm-backend", obj,
                                &error_abort);
+    object_unref(obj);
      user_creatable_complete(obj, &error_abort);
      s->hostmem = MEMORY_BACKEND(obj);
  }
#5 lore raw
Quoted 6 lines · On Thu, 1 Nov 2018 15:27:02 +0100 Philippe Mathieu-Daudé <[email protected]>…
Quoted 3 lines · Igor Mammedov

object_new() returns a new backend with refcount == 1 and then later object_property_add_child() increases refcount to 2 So when ivshmem is desroyed, the backend it has created isn't

^ "destroyed"

Thanks, fixed in v2

Quoted 27 lines
Quoted 26 lines

destroyed along with it as children cleanup will bring backend's refcount only to 1, which leaks backend including resources it is using.

Drop the original reference from object_new() once backend is attached to its parent.

---
  hw/misc/ivshmem.c | 1 +
  1 file changed, 1 insertion(+)
hw/misc/ivshmem.c +1 -0
index f88910e..ecfd10a 100644
@@ -1279,6 +1279,7 @@ static void desugar_shm(IVShmemState *s)
      object_property_set_bool(obj, true, "share", &error_abort);
      object_property_add_child(OBJECT(s), "internal-shm-backend", obj,
                                &error_abort);
+    object_unref(obj);
      user_creatable_complete(obj, &error_abort);
      s->hostmem = MEMORY_BACKEND(obj);
  }
#6 lore raw
In reply to Igor Mammedov
Quoted 21 lines · Igor Mammedov

object_new() returns a new backend with refcount == 1 and then later object_property_add_child() increases refcount to 2 So when ivshmem is desroyed, the backend it has created isn't destroyed along with it as children cleanup will bring backend's refcount only to 1, which leaks backend including resources it is using.

Drop the original reference from object_new() once backend is attached to its parent.

---
 hw/misc/ivshmem.c | 1 +
 1 file changed, 1 insertion(+)
hw/misc/ivshmem.c +0 -0
index f88910e..ecfd10a 100644

hw/misc/ivshmem.c static void desugar_shm(IVShmemState *s) · line 1285

Quoted 7 lines
hw/misc/ivshmem.c +1 -0
@@ -1279,6 +1279,7 @@ static void desugar_shm(IVShmemState *s)
     object_property_set_bool(obj, true, "share", &error_abort);
     object_property_add_child(OBJECT(s), "internal-shm-backend", obj,
                               &error_abort);
+    object_unref(obj);
     user_creatable_complete(obj, &error_abort);
     s->hostmem = MEMORY_BACKEND(obj);
 }

Queued, thanks.

Paolo