Hi Ben,
Thank you for the patch, that fixes it!
Regards,
Ben.
On 17/11/2021 08:24, Benoit Ganne (bganne) via lists.fd.io wrote:
Hi Ben,
Thanks for the detailed report, you are correct we are missing a vec_free()
before returning from the function.
Can you give a try to https://gerrit.fd.io/r/c/vpp/+/34536 ?
Best
ben
-----Original Message-----
From: vpp-dev@lists.fd.io <vpp-dev@lists.fd.io> On Behalf Of Ben McKeegan
Sent: mardi 16 novembre 2021 15:04
To: vpp-dev@lists.fd.io
Subject: [vpp-dev] Memory leak in map plugin
Hello,
I have identified a memory leak the ip4_map function of
src/plugins/ip4_map.c. I am using the 21.10 release.
Enabling memory trace of the main-heap via the debug CLI and backtracing
with gdb both point to all the leaked memory being allocated from the
vec_add1(buffer0,pi0) macro at line 293 of ip4_map.c. In tests it is
leaking approximately 50 bytes for every packet passing through this
function (invariant on packet size).
Here is an extract of the relevant code:
exit:
/* Send fragments that were added in the frame */
if (free_original_buffer0)
{
vlib_buffer_free_one (vm, pi0); /* Free original packet */
}
else
{
vec_add1 (buffer0, pi0); <<<< leak is here on line 293
}
frag_from0 = buffer0;
frag_left0 = vec_len (buffer0);
while (frag_left0 > 0)
{
while (frag_left0 > 0 && n_left_to_next > 0)
{
u32 i0;
i0 = to_next[0] = frag_from0[0];
frag_from0 += 1;
frag_left0 -= 1;
to_next += 1;
n_left_to_next -= 1;
vlib_get_buffer (vm, i0)->error =
error_node->errors[error0];
vlib_validate_buffer_enqueue_x1 (vm, node, next_index,
to_next, n_left_to_next,
i0, next0);
}
vlib_put_next_frame (vm, node, next_index, n_left_to_next);
vlib_get_next_frame (vm, node, next_index, to_next,
n_left_to_next);
}
vec_reset_length (buffer0);
}
vlib_put_next_frame (vm, node, next_index, n_left_to_next);
I must admit I do not fully understand exactly what this code is doing,
but I am suspicious of the use of 'vec_reset_length' macro. I have
looked at the definition of this and it appears that although this sets
the length of the vector back to zero (if the pointer is non-zero), it
does not release any memory that may have been allocated. Do we not
need a call to 'vec_free' somewhere?
Regards,
Ben.
--
Ben McKeegan
Netservers Limited
01223 446000 ext 8103
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#20520): https://lists.fd.io/g/vpp-dev/message/20520
Mute This Topic: https://lists.fd.io/mt/87095064/21656
Group Owner: vpp-dev+ow...@lists.fd.io
Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-