From 192a196b02b35d1f69d0679d138436bcac9d3034 Mon Sep 17 00:00:00 2001 From: Michal Mazur Date: Thu, 4 Jan 2018 21:12:15 +0100 Subject: plugins: odp: Fix error when all interfaces removed Packet pool cannot be destroyed when last interface is deleted because it will not be reallocated on creation of a new interface. Change-Id: Iec7b03b4413fc6602a7a1493ffd706f4c4dd1309 Signed-off-by: Michal Mazur --- src/plugins/odp/odp_packet.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/plugins/odp/odp_packet.c b/src/plugins/odp/odp_packet.c index 2cf6ff90..e1b259fd 100755 --- a/src/plugins/odp/odp_packet.c +++ b/src/plugins/odp/odp_packet.c @@ -278,7 +278,6 @@ odp_packet_delete_if (vlib_main_t * vm, u8 * host_if_name) odp_packet_main_t *om = odp_packet_main; odp_packet_if_t *oif = 0; uword *p; - vlib_thread_main_t *tm = vlib_get_thread_main (); p = mhash_get (&om->if_index_by_host_if_name, host_if_name); @@ -306,13 +305,7 @@ odp_packet_delete_if (vlib_main_t * vm, u8 * host_if_name) pool_put (om->interfaces, oif); - if (tm->n_vlib_mains > 1 && pool_elts (om->interfaces) == 0) - { - odp_pool_destroy (om->pool); - } - return 0; - } static clib_error_t * @@ -559,6 +552,26 @@ odp_packet_init (vlib_main_t * vm) VLIB_INIT_FUNCTION (odp_packet_init); +static clib_error_t * +odp_packet_exit (vlib_main_t *vm) +{ + odp_packet_main_t *om = odp_packet_main; + odp_packet_if_t *port; + + pool_foreach (port, om->interfaces, + ({ + odp_packet_delete_if (vm, port->host_if_name); + })); + + odp_pool_destroy (om->pool); + odp_shm_free (odp_shm_lookup("odp_packet_main")); + odp_packet_main = 0x0; + + return 0; +} + +VLIB_MAIN_LOOP_EXIT_FUNCTION (odp_packet_exit); + /* *INDENT-OFF* */ VLIB_PLUGIN_REGISTER () = { .version = VPP_BUILD_VER, -- cgit 1.2.3-korg