All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Jian Wang <wangjian161@huawei.com>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	Kevin Wolf <kwolf@redhat.com>, Max Reitz <mreitz@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>, Fam Zheng <fam@euphon.net>,
	qemu-block@nongnu.org
Subject: [Qemu-devel] [PULL 04/44] qemu: avoid memory leak while remove disk
Date: Mon, 14 Jan 2019 20:35:26 -0500	[thread overview]
Message-ID: <20190115003812.11329-5-mst@redhat.com> (raw)
In-Reply-To: <20190115003812.11329-1-mst@redhat.com>

From: Jian Wang <wangjian161@huawei.com>

Memset vhost_dev to zero in the vhost_dev_cleanup function.
This causes dev.vqs to be NULL, so that
vqs does not free up space when calling the g_free function.
This will result in a memory leak. But you can't release vqs
directly in the vhost_dev_cleanup function, because vhost_net
will also call this function, and vhost_net's vqs is assigned by array.
In order to solve this problem, we first save the pointer of vqs,
and release the space of vqs after vhost_dev_cleanup is called.

Signed-off-by: Jian Wang <wangjian161@huawei.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 hw/block/vhost-user-blk.c | 7 +++++--
 hw/scsi/vhost-scsi.c      | 3 ++-
 hw/scsi/vhost-user-scsi.c | 3 ++-
 3 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c
index 1451940845..c3af28fad4 100644
--- a/hw/block/vhost-user-blk.c
+++ b/hw/block/vhost-user-blk.c
@@ -250,6 +250,7 @@ static void vhost_user_blk_device_realize(DeviceState *dev, Error **errp)
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VHostUserBlk *s = VHOST_USER_BLK(vdev);
     VhostUserState *user;
+    struct vhost_virtqueue *vqs = NULL;
     int i, ret;
 
     if (!s->chardev.chr) {
@@ -288,6 +289,7 @@ static void vhost_user_blk_device_realize(DeviceState *dev, Error **errp)
     s->dev.vqs = g_new(struct vhost_virtqueue, s->dev.nvqs);
     s->dev.vq_index = 0;
     s->dev.backend_features = 0;
+    vqs = s->dev.vqs;
 
     vhost_dev_set_config_notifier(&s->dev, &blk_ops);
 
@@ -314,7 +316,7 @@ static void vhost_user_blk_device_realize(DeviceState *dev, Error **errp)
 vhost_err:
     vhost_dev_cleanup(&s->dev);
 virtio_err:
-    g_free(s->dev.vqs);
+    g_free(vqs);
     virtio_cleanup(vdev);
 
     vhost_user_cleanup(user);
@@ -326,10 +328,11 @@ static void vhost_user_blk_device_unrealize(DeviceState *dev, Error **errp)
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VHostUserBlk *s = VHOST_USER_BLK(dev);
+    struct vhost_virtqueue *vqs = s->dev.vqs;
 
     vhost_user_blk_set_status(vdev, 0);
     vhost_dev_cleanup(&s->dev);
-    g_free(s->dev.vqs);
+    g_free(vqs);
     virtio_cleanup(vdev);
 
     if (s->vhost_user) {
diff --git a/hw/scsi/vhost-scsi.c b/hw/scsi/vhost-scsi.c
index 7f21b4f9d6..61e2e57da9 100644
--- a/hw/scsi/vhost-scsi.c
+++ b/hw/scsi/vhost-scsi.c
@@ -215,6 +215,7 @@ static void vhost_scsi_unrealize(DeviceState *dev, Error **errp)
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VHostSCSICommon *vsc = VHOST_SCSI_COMMON(dev);
+    struct vhost_virtqueue *vqs = vsc->dev.vqs;
 
     migrate_del_blocker(vsc->migration_blocker);
     error_free(vsc->migration_blocker);
@@ -223,7 +224,7 @@ static void vhost_scsi_unrealize(DeviceState *dev, Error **errp)
     vhost_scsi_set_status(vdev, 0);
 
     vhost_dev_cleanup(&vsc->dev);
-    g_free(vsc->dev.vqs);
+    g_free(vqs);
 
     virtio_scsi_common_unrealize(dev, errp);
 }
diff --git a/hw/scsi/vhost-user-scsi.c b/hw/scsi/vhost-user-scsi.c
index 2e1ba4a87b..6728878a52 100644
--- a/hw/scsi/vhost-user-scsi.c
+++ b/hw/scsi/vhost-user-scsi.c
@@ -121,12 +121,13 @@ static void vhost_user_scsi_unrealize(DeviceState *dev, Error **errp)
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VHostUserSCSI *s = VHOST_USER_SCSI(dev);
     VHostSCSICommon *vsc = VHOST_SCSI_COMMON(s);
+    struct vhost_virtqueue *vqs = vsc->dev.vqs;
 
     /* This will stop the vhost backend. */
     vhost_user_scsi_set_status(vdev, 0);
 
     vhost_dev_cleanup(&vsc->dev);
-    g_free(vsc->dev.vqs);
+    g_free(vqs);
 
     virtio_scsi_common_unrealize(dev, errp);
 
-- 
MST

  parent reply	other threads:[~2019-01-15  1:42 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-15  1:35 [Qemu-devel] [PULL 00/44] pci, pc, virtio: fixes, features Michael S. Tsirkin
2019-01-15  1:35 ` [Qemu-devel] [PULL 01/44] pci/pcie: stop plug/unplug if the slot is locked Michael S. Tsirkin
2019-01-15  1:35 ` [Qemu-devel] [PULL 02/44] msix: make pba size math more uniform Michael S. Tsirkin
2019-01-15  1:35 ` [Qemu-devel] [PULL 03/44] hw/misc/ivshmem: Remove deprecated "ivshmem" legacy device Michael S. Tsirkin
2019-01-15  1:35 ` Michael S. Tsirkin [this message]
2019-01-15  1:35 ` [Qemu-devel] [PULL 05/44] tests: vhost-user-test: initialize 'fd' in chr_read Michael S. Tsirkin
2019-01-15  1:35 ` [Qemu-devel] [PULL 06/44] vhost-user: fix ioeventfd_enabled Michael S. Tsirkin
2019-01-15  1:35 ` [Qemu-devel] [PULL 07/44] util: check the return value of fcntl in qemu_set_{block, nonblock} Michael S. Tsirkin
2019-01-15  1:35 ` [Qemu-devel] [PULL 08/44] tests: acpi: use AcpiSdtTable::aml in consistent way Michael S. Tsirkin
2019-01-15  1:35 ` [Qemu-devel] [PULL 09/44] tests: acpi: make sure FADT is fetched only once Michael S. Tsirkin
2019-01-15  1:35 ` [Qemu-devel] [PULL 10/44] tests: acpi: simplify rsdt handling Michael S. Tsirkin
2019-01-15  1:35 ` [Qemu-devel] [PULL 11/44] tests: acpi: reuse fetch_table() for fetching FACS and DSDT Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 12/44] tests: acpi: reuse fetch_table() in vmgenid-test Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 13/44] tests: smbios: fetch whole table in one step instead of reading it step by step Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 14/44] tests: acpi: squash sanitize_fadt_ptrs() into test_acpi_fadt_table() Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 15/44] tests: acpi: use AcpiSdtTable::aml instead of AcpiSdtTable::header::signature Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 16/44] virtio-net: support RSC v4/v6 tcp traffic for Windows HCK Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 17/44] virtio-net: changed VIRTIO_NET_F_RSC_EXT to be 61 Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 18/44] virtio: split vhost vsock bits from virtio-pci Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 19/44] virtio: split virtio input host " Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 20/44] virtio: split virtio input " Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 21/44] virtio: split virtio rng " Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 22/44] virtio: split virtio balloon " Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 23/44] virtio: split virtio 9p " Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 24/44] virtio: split vhost user blk " Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 25/44] virtio: split vhost user scsi " Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 26/44] virtio: split vhost " Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 27/44] virtio: split virtio " Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 28/44] virtio: split virtio blk " Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 29/44] virtio: split virtio net " Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 30/44] virtio: split virtio serial " Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 31/44] virtio: split virtio gpu bits from virtio-pci.h Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 32/44] virtio: split virtio crypto " Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 33/44] virtio: virtio 9p really requires CONFIG_VIRTFS to work Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 34/44] globals: Allow global properties to be optional Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 35/44] virtio: Make disable-legacy/disable-modern compat properties optional Michael S. Tsirkin
2019-01-15  1:36 ` [Qemu-devel] [PULL 36/44] hw/misc/edu: add msi_uninit() for pci_edu_uninit() Michael S. Tsirkin
2019-01-15  1:37 ` [Qemu-devel] [PULL 37/44] tpm: add a "ppi" boolean property Michael S. Tsirkin
2019-01-15  1:37 ` [Qemu-devel] [PULL 38/44] tpm: allocate/map buffer for TPM Physical Presence interface Michael S. Tsirkin
2019-01-15  1:37 ` [Qemu-devel] [PULL 39/44] acpi: expose TPM/PPI configuration parameters to firmware via fw_cfg Michael S. Tsirkin
2019-01-15  1:37 ` [Qemu-devel] [PULL 40/44] acpi: build TPM Physical Presence interface Michael S. Tsirkin
2019-01-15  1:37 ` [Qemu-devel] [PULL 41/44] acpi: add ACPI memory clear interface Michael S. Tsirkin
2019-01-15  1:37 ` [Qemu-devel] [PULL 42/44] tpm: clear RAM when "memory overwrite" requested Michael S. Tsirkin
2019-01-15  1:37 ` [Qemu-devel] [PULL 43/44] hw: acpi: Fix memory hotplug AML generation error Michael S. Tsirkin
2019-01-15  1:37 ` [Qemu-devel] [PULL 44/44] acpi: update expected files Michael S. Tsirkin
2019-01-15  5:38 ` [Qemu-devel] [PULL 00/44] pci, pc, virtio: fixes, features Peter Xu
2019-01-15 12:49   ` Michael S. Tsirkin

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=20190115003812.11329-5-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=fam@euphon.net \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    --cc=wangjian161@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.