diff options
author | Dmitry Valter <d-valter@yandex-team.ru> | 2022-09-05 15:30:18 +0000 |
---|---|---|
committer | Ole Tr�an <otroan@employees.org> | 2022-09-09 16:03:14 +0000 |
commit | 9f5b36926b74109974e7c3ce9bb3a0a7d676c46c (patch) | |
tree | 1ccffb48c6f3de0a8c0e8208119996ade4b816dc /src/vlib/threads.c | |
parent | 10672be9e21aa8392aca0e5704fc3a47ea032ba5 (diff) |
vlib: don't leak node frames on refork
Free node frames in worker mains on refork. Otherwise these frames are
never returned to free pool and it causes massive memory leaks if
performed under traffic load
Type: fix
Signed-off-by: Dmitry Valter <d-valter@yandex-team.ru>
Change-Id: I15cbf024a3f4b4082445fd5e5aaa10bfcf77f363
Diffstat (limited to 'src/vlib/threads.c')
-rw-r--r-- | src/vlib/threads.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/vlib/threads.c b/src/vlib/threads.c index 5599c5b352b..adf225ba87f 100644 --- a/src/vlib/threads.c +++ b/src/vlib/threads.c @@ -913,6 +913,17 @@ vlib_worker_thread_node_refork (void) vec_validate_aligned (old_counters_all_clear, j, CLIB_CACHE_LINE_BYTES); vm_clone->error_main.counters_last_clear = old_counters_all_clear; + for (j = 0; j < vec_len (nm_clone->next_frames); j++) + { + vlib_next_frame_t *nf = &nm_clone->next_frames[j]; + if ((nf->flags & VLIB_FRAME_IS_ALLOCATED) && nf->frame != NULL) + { + vlib_frame_t *f = nf->frame; + nf->frame = NULL; + vlib_frame_free (vm_clone, f); + } + } + vec_free (nm_clone->next_frames); nm_clone->next_frames = vec_dup_aligned (nm->next_frames, CLIB_CACHE_LINE_BYTES); |