76 lines
2.4 KiB
Diff
76 lines
2.4 KiB
Diff
From: Li Qiang <liqiang6-s@360.cn>
|
|
Date: Tue, 7 Feb 2017 18:42:55 -0800
|
|
Subject: [PATCH] usb: ehci: fix memory leak in ehci
|
|
|
|
In usb_ehci_init function, it initializes 's->ipacket', but there
|
|
is no corresponding function to free this. As the ehci can be hotplug
|
|
and unplug, this will leak host memory leak. In order to make the
|
|
hierarchy clean, we should add a ehci pci finalize function, then call
|
|
the clean function in ehci device.
|
|
|
|
Signed-off-by: Li Qiang <liqiang6-s@360.cn>
|
|
Message-id: 589a85b8.3c2b9d0a.b8e6.1434@mx.google.com
|
|
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
|
(cherry picked from commit d710e1e7bd3d5bfc26b631f02ae87901ebe646b0)
|
|
---
|
|
hw/usb/hcd-ehci-pci.c | 9 +++++++++
|
|
hw/usb/hcd-ehci.c | 5 +++++
|
|
hw/usb/hcd-ehci.h | 1 +
|
|
3 files changed, 15 insertions(+)
|
|
|
|
diff --git a/hw/usb/hcd-ehci-pci.c b/hw/usb/hcd-ehci-pci.c
|
|
index 56577051e2..6dedcb8989 100644
|
|
--- a/hw/usb/hcd-ehci-pci.c
|
|
+++ b/hw/usb/hcd-ehci-pci.c
|
|
@@ -89,6 +89,14 @@ static void usb_ehci_pci_init(Object *obj)
|
|
usb_ehci_init(s, DEVICE(obj));
|
|
}
|
|
|
|
+static void usb_ehci_pci_finalize(Object *obj)
|
|
+{
|
|
+ EHCIPCIState *i = PCI_EHCI(obj);
|
|
+ EHCIState *s = &i->ehci;
|
|
+
|
|
+ usb_ehci_finalize(s);
|
|
+}
|
|
+
|
|
static void usb_ehci_pci_exit(PCIDevice *dev)
|
|
{
|
|
EHCIPCIState *i = PCI_EHCI(dev);
|
|
@@ -159,6 +167,7 @@ static const TypeInfo ehci_pci_type_info = {
|
|
.parent = TYPE_PCI_DEVICE,
|
|
.instance_size = sizeof(EHCIPCIState),
|
|
.instance_init = usb_ehci_pci_init,
|
|
+ .instance_finalize = usb_ehci_pci_finalize,
|
|
.abstract = true,
|
|
.class_init = ehci_class_init,
|
|
};
|
|
diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c
|
|
index 7622a3ae72..50ef817f93 100644
|
|
--- a/hw/usb/hcd-ehci.c
|
|
+++ b/hw/usb/hcd-ehci.c
|
|
@@ -2545,6 +2545,11 @@ void usb_ehci_init(EHCIState *s, DeviceState *dev)
|
|
&s->mem_ports);
|
|
}
|
|
|
|
+void usb_ehci_finalize(EHCIState *s)
|
|
+{
|
|
+ usb_packet_cleanup(&s->ipacket);
|
|
+}
|
|
+
|
|
/*
|
|
* vim: expandtab ts=4
|
|
*/
|
|
diff --git a/hw/usb/hcd-ehci.h b/hw/usb/hcd-ehci.h
|
|
index 3fd7038658..938d8aa284 100644
|
|
--- a/hw/usb/hcd-ehci.h
|
|
+++ b/hw/usb/hcd-ehci.h
|
|
@@ -323,6 +323,7 @@ struct EHCIState {
|
|
extern const VMStateDescription vmstate_ehci;
|
|
|
|
void usb_ehci_init(EHCIState *s, DeviceState *dev);
|
|
+void usb_ehci_finalize(EHCIState *s);
|
|
void usb_ehci_realize(EHCIState *s, DeviceState *dev, Error **errp);
|
|
void usb_ehci_unrealize(EHCIState *s, DeviceState *dev, Error **errp);
|
|
void ehci_reset(void *opaque);
|