[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] usb: ehci: fix memory leak in ehci
From: |
Li Qiang |
Subject: |
Re: [Qemu-devel] [PATCH] usb: ehci: fix memory leak in ehci |
Date: |
Wed, 15 Feb 2017 14:25:18 +0800 |
Ping...
2017-02-08 10:42 GMT+08:00 Li Qiang <address@hidden>:
> From: Li Qiang <address@hidden>
>
> 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 <address@hidden>
> ---
> 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 5657705..6dedcb8 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 7622a3a..50ef817 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 3fd7038..938d8aa 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);
> --
> 1.8.3.1
>
>