[v3,1/2] eal: fix memory leak when removing event_cb
Checks
Commit Message
From: Yunjian Wang <wangyunjian@huawei.com>
The event_cb->dev_name is not freed when freeing event_cb,
and this causes a memory leak.
Fixes: a753e53d517b ("eal: add device event monitor framework")
Cc: stable@dpdk.org
Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>
---
lib/librte_eal/common/eal_common_dev.c | 2 ++
1 file changed, 2 insertions(+)
Comments
hi, yunjian
On 7/2/2020 7:47 PM, wangyunjian wrote:
> From: Yunjian Wang <wangyunjian@huawei.com>
>
> The event_cb->dev_name is not freed when freeing event_cb,
> and this causes a memory leak.
>
> Fixes: a753e53d517b ("eal: add device event monitor framework")
> Cc: stable@dpdk.org
>
> Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>
> ---
> lib/librte_eal/common/eal_common_dev.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c
> index 9e4f09d..4cfdb80 100644
> --- a/lib/librte_eal/common/eal_common_dev.c
> +++ b/lib/librte_eal/common/eal_common_dev.c
> @@ -526,6 +526,8 @@ static int cmp_dev_name(const struct rte_device *dev, const void *_name)
> */
> if (event_cb->active == 0) {
> TAILQ_REMOVE(&dev_event_cbs, event_cb, next);
> + if (event_cb->dev_name)
> + free(event_cb->dev_name);
> free(event_cb);
> ret++;
> } else {
After you check, don't you think the memory leak would not occur in
rte_dev_event_callback_register when free event_cb? And if you have find
other same problem, suggest to fix it wholly by this good chance. Thanks.
int
rte_dev_event_callback_register(const char *device_name,
rte_dev_event_cb_fn cb_fn,
void *cb_arg)
{
error:
free(event_cb);
rte_spinlock_unlock(&dev_event_lock);
return ret;
}
Hi, Jeff
> -----Original Message-----
> From: Jeff Guo [mailto:jia.guo@intel.com]
> Sent: Friday, July 3, 2020 2:05 PM
> To: wangyunjian <wangyunjian@huawei.com>; dev@dpdk.org
> Cc: Lilijun (Jerry) <jerry.lilijun@huawei.com>; xudingke
> <xudingke@huawei.com>; stable@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v3 1/2] eal: fix memory leak when removing
> event_cb
>
> hi, yunjian
>
> On 7/2/2020 7:47 PM, wangyunjian wrote:
> > From: Yunjian Wang <wangyunjian@huawei.com>
> >
> > The event_cb->dev_name is not freed when freeing event_cb, and this
> > causes a memory leak.
> >
> > Fixes: a753e53d517b ("eal: add device event monitor framework")
> > Cc: stable@dpdk.org
> >
> > Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>
> > ---
> > lib/librte_eal/common/eal_common_dev.c | 2 ++
> > 1 file changed, 2 insertions(+)
> >
> > diff --git a/lib/librte_eal/common/eal_common_dev.c
> > b/lib/librte_eal/common/eal_common_dev.c
> > index 9e4f09d..4cfdb80 100644
> > --- a/lib/librte_eal/common/eal_common_dev.c
> > +++ b/lib/librte_eal/common/eal_common_dev.c
> > @@ -526,6 +526,8 @@ static int cmp_dev_name(const struct rte_device
> *dev, const void *_name)
> > */
> > if (event_cb->active == 0) {
> > TAILQ_REMOVE(&dev_event_cbs, event_cb, next);
> > + if (event_cb->dev_name)
> > + free(event_cb->dev_name);
> > free(event_cb);
> > ret++;
> > } else {
>
>
> After you check, don't you think the memory leak would not occur in
> rte_dev_event_callback_register when free event_cb? And if you have find
> other same problem, suggest to fix it wholly by this good chance. Thanks.
>
Yes, I've confirmed that it's not necessary. The 'event_cb->dev_name' is not allocated
memory on error path in rte_dev_event_callback_register(). But I find the return value
is wrong, when the callback is already exist, will include it in next version.
The similar bugs I found in other codes will be fixed in another patches.
Thanks,
Yunjian
> int
> rte_dev_event_callback_register(const char *device_name,
> rte_dev_event_cb_fn cb_fn,
> void *cb_arg)
> {
>
> error:
> free(event_cb);
> rte_spinlock_unlock(&dev_event_lock);
> return ret;
>
> }
On Thu, Jul 2, 2020 at 1:47 PM wangyunjian <wangyunjian@huawei.com> wrote:
>
> From: Yunjian Wang <wangyunjian@huawei.com>
>
> The event_cb->dev_name is not freed when freeing event_cb,
> and this causes a memory leak.
>
> Fixes: a753e53d517b ("eal: add device event monitor framework")
> Cc: stable@dpdk.org
>
> Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>
> ---
> lib/librte_eal/common/eal_common_dev.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c
> index 9e4f09d..4cfdb80 100644
> --- a/lib/librte_eal/common/eal_common_dev.c
> +++ b/lib/librte_eal/common/eal_common_dev.c
> @@ -526,6 +526,8 @@ static int cmp_dev_name(const struct rte_device *dev, const void *_name)
> */
> if (event_cb->active == 0) {
> TAILQ_REMOVE(&dev_event_cbs, event_cb, next);
> + if (event_cb->dev_name)
> + free(event_cb->dev_name);
No need for the check, free handles a NULL pointer just fine.
Please, could you update your series/patches status in patchwork?
I am a bit lost at what is superseded or not.
Thanks.
> -----Original Message-----
> From: David Marchand [mailto:david.marchand@redhat.com]
> Sent: Friday, July 3, 2020 3:23 PM
> To: wangyunjian <wangyunjian@huawei.com>
> Cc: dev <dev@dpdk.org>; Jeff Guo <jia.guo@intel.com>; Lilijun (Jerry)
> <jerry.lilijun@huawei.com>; xudingke <xudingke@huawei.com>; dpdk stable
> <stable@dpdk.org>
> Subject: Re: [dpdk-stable] [dpdk-dev] [PATCH v3 1/2] eal: fix memory leak when
> removing event_cb
>
> On Thu, Jul 2, 2020 at 1:47 PM wangyunjian <wangyunjian@huawei.com>
> wrote:
> >
> > From: Yunjian Wang <wangyunjian@huawei.com>
> >
> > The event_cb->dev_name is not freed when freeing event_cb, and this
> > causes a memory leak.
> >
> > Fixes: a753e53d517b ("eal: add device event monitor framework")
> > Cc: stable@dpdk.org
> >
> > Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>
> > ---
> > lib/librte_eal/common/eal_common_dev.c | 2 ++
> > 1 file changed, 2 insertions(+)
> >
> > diff --git a/lib/librte_eal/common/eal_common_dev.c
> > b/lib/librte_eal/common/eal_common_dev.c
> > index 9e4f09d..4cfdb80 100644
> > --- a/lib/librte_eal/common/eal_common_dev.c
> > +++ b/lib/librte_eal/common/eal_common_dev.c
> > @@ -526,6 +526,8 @@ static int cmp_dev_name(const struct rte_device
> *dev, const void *_name)
> > */
> > if (event_cb->active == 0) {
> > TAILQ_REMOVE(&dev_event_cbs, event_cb,
> next);
> > + if (event_cb->dev_name)
> > + free(event_cb->dev_name);
>
> No need for the check, free handles a NULL pointer just fine.
Thanks for your suggestion, will send the v4 later.
>
> Please, could you update your series/patches status in patchwork?
> I am a bit lost at what is superseded or not.
My mistake, please discard them.
https://patchwork.dpdk.org/patch/70824/
https://patchwork.dpdk.org/patch/70825/
https://patchwork.dpdk.org/patch/70826/
https://patchwork.dpdk.org/patch/72452/
https://patchwork.dpdk.org/patch/72825/
https://patchwork.dpdk.org/patch/72826/
Thanks,
Yunjian
>
>
> Thanks.
>
> --
> David Marchand
On Fri, Jul 3, 2020 at 9:52 AM wangyunjian <wangyunjian@huawei.com> wrote:
> > Please, could you update your series/patches status in patchwork?
> > I am a bit lost at what is superseded or not.
>
> My mistake, please discard them.
> https://patchwork.dpdk.org/patch/70824/
> https://patchwork.dpdk.org/patch/70825/
> https://patchwork.dpdk.org/patch/70826/
> https://patchwork.dpdk.org/patch/72452/
> https://patchwork.dpdk.org/patch/72825/
> https://patchwork.dpdk.org/patch/72826/
We have been doing this kind of cleanup with Thomas, Ferruh and other
maintainers for some time but this does not scale.
We waste time at figuring out which revision of patches is relevant,
or a duplicate, or a mistake...
I'll do it this time (again), but please register to patchwork and
handle this for your next patches.
Thanks.
@@ -526,6 +526,8 @@ static int cmp_dev_name(const struct rte_device *dev, const void *_name)
*/
if (event_cb->active == 0) {
TAILQ_REMOVE(&dev_event_cbs, event_cb, next);
+ if (event_cb->dev_name)
+ free(event_cb->dev_name);
free(event_cb);
ret++;
} else {