diff mbox

net: eepro100: fix memory leak in device uninit

Message ID 57f8e18a.04321c0a.35f53.8b64@mx.google.com
State New
Headers show

Commit Message

Li Qiang Oct. 8, 2016, 12:07 p.m. UTC
From: Li Qiang <liqiang6-s@360.cn>

The exit dispatch of eepro100 network card device doesn't free
the 's->vmstate' field which was allocated in device realize thus
leading a host memory leak. This patch avoid this.

Signed-off-by: Li Qiang <liqiang6-s@360.cn>
---
 hw/net/eepro100.c | 1 +
 1 file changed, 1 insertion(+)

Comments

Stefan Weil Oct. 8, 2016, 4:19 p.m. UTC | #1
Am 08.10.2016 um 14:07 schrieb Li Qiang:
> From: Li Qiang <liqiang6-s@360.cn>
>
> The exit dispatch of eepro100 network card device doesn't free
> the 's->vmstate' field which was allocated in device realize thus
> leading a host memory leak. This patch avoid this.
>
> Signed-off-by: Li Qiang <liqiang6-s@360.cn>

Thank you for reporting this memory leak.

I think that an even better solution would be avoiding the dynamic 
memory allocation. We could use this declaration for example:

     /* vmstate for each particular nic */
     VMStateDescription vmstate;

Do you want to prepare a new patch, or should I do it?

Regards
Stefan
Stefan Weil Oct. 8, 2016, 4:43 p.m. UTC | #2
Am 08.10.2016 um 18:19 schrieb Stefan Weil:
> Am 08.10.2016 um 14:07 schrieb Li Qiang:
>> From: Li Qiang <liqiang6-s@360.cn>
>>
>> The exit dispatch of eepro100 network card device doesn't free
>> the 's->vmstate' field which was allocated in device realize thus
>> leading a host memory leak. This patch avoid this.
>>
>> Signed-off-by: Li Qiang <liqiang6-s@360.cn>
>
> Thank you for reporting this memory leak.
>
> I think that an even better solution would be avoiding the dynamic
> memory allocation. We could use this declaration for example:
>
>     /* vmstate for each particular nic */
>     VMStateDescription vmstate;
>
> Do you want to prepare a new patch, or should I do it?

While thinking more about it, the solution used for e1000 looks better: 
vmstate could be a static const object, and the name field would always 
be "e100", no matter which specific nic was chosen.

Stefan
Li Qiang Oct. 9, 2016, 10:23 a.m. UTC | #3
Hello Stefan,

I'm not familiar with the migration. In order not miss something, I think
you can provide this patch.

Thanks.

2016-10-09 0:43 GMT+08:00 Stefan Weil <sw@weilnetz.de>:

> Am 08.10.2016 um 18:19 schrieb Stefan Weil:
>
>> Am 08.10.2016 um 14:07 schrieb Li Qiang:
>>
>>> From: Li Qiang <liqiang6-s@360.cn>
>>>
>>> The exit dispatch of eepro100 network card device doesn't free
>>> the 's->vmstate' field which was allocated in device realize thus
>>> leading a host memory leak. This patch avoid this.
>>>
>>> Signed-off-by: Li Qiang <liqiang6-s@360.cn>
>>>
>>
>> Thank you for reporting this memory leak.
>>
>> I think that an even better solution would be avoiding the dynamic
>> memory allocation. We could use this declaration for example:
>>
>>     /* vmstate for each particular nic */
>>     VMStateDescription vmstate;
>>
>> Do you want to prepare a new patch, or should I do it?
>>
>
> While thinking more about it, the solution used for e1000 looks better:
> vmstate could be a static const object, and the name field would always be
> "e100", no matter which specific nic was chosen.
>
> Stefan
>
>
Jason Wang Oct. 20, 2016, 2:36 a.m. UTC | #4
On 2016年10月08日 20:07, Li Qiang wrote:
> From: Li Qiang <liqiang6-s@360.cn>
>
> The exit dispatch of eepro100 network card device doesn't free
> the 's->vmstate' field which was allocated in device realize thus
> leading a host memory leak. This patch avoid this.
>
> Signed-off-by: Li Qiang <liqiang6-s@360.cn>
> ---
>   hw/net/eepro100.c | 1 +
>   1 file changed, 1 insertion(+)
>
> diff --git a/hw/net/eepro100.c b/hw/net/eepro100.c
> index bab4dbf..4bf71f2 100644
> --- a/hw/net/eepro100.c
> +++ b/hw/net/eepro100.c
> @@ -1843,6 +1843,7 @@ static void pci_nic_uninit(PCIDevice *pci_dev)
>       EEPRO100State *s = DO_UPCAST(EEPRO100State, dev, pci_dev);
>   
>       vmstate_unregister(&pci_dev->qdev, s->vmstate, s);
> +    g_free(s->vmstate);
>       eeprom93xx_free(&pci_dev->qdev, s->eeprom);
>       qemu_del_nic(s->nic);
>   }

Applied, thanks.

We may want to switch to use dc->vmsd instead of this in the future.
diff mbox

Patch

diff --git a/hw/net/eepro100.c b/hw/net/eepro100.c
index bab4dbf..4bf71f2 100644
--- a/hw/net/eepro100.c
+++ b/hw/net/eepro100.c
@@ -1843,6 +1843,7 @@  static void pci_nic_uninit(PCIDevice *pci_dev)
     EEPRO100State *s = DO_UPCAST(EEPRO100State, dev, pci_dev);
 
     vmstate_unregister(&pci_dev->qdev, s->vmstate, s);
+    g_free(s->vmstate);
     eeprom93xx_free(&pci_dev->qdev, s->eeprom);
     qemu_del_nic(s->nic);
 }