diff options
| author | Donald Sharp <sharpd@nvidia.com> | 2023-05-18 15:59:43 -0400 | 
|---|---|---|
| committer | Donald Sharp <sharpd@nvidia.com> | 2023-05-19 10:02:19 -0400 | 
| commit | 540334324c59e3ae92622ba211b073488e477460 (patch) | |
| tree | 6c5f2bfa0585029e50b439b6615bd3f70368c0d6 /zebra/zebra_fpm.c | |
| parent | 0eaa6523f6620a8ab2db0df6879e4b64dd27a6fe (diff) | |
zebra: Properly handle zfpm_g->t_conn_down in zebra_fpm.c
The t_conn_down pointer was being set to NULL when it already
was.  The t_conn_down pointer was being dropped( and leaving
a thread possibly running in the background ) which could
cause problems on shutdown.  And finally when shutting down
the t_conn_down event was not being stopped at all.
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
Diffstat (limited to 'zebra/zebra_fpm.c')
| -rw-r--r-- | zebra/zebra_fpm.c | 11 | 
1 files changed, 7 insertions, 4 deletions
diff --git a/zebra/zebra_fpm.c b/zebra/zebra_fpm.c index e379a5868c..4c2947cfd3 100644 --- a/zebra/zebra_fpm.c +++ b/zebra/zebra_fpm.c @@ -497,6 +497,11 @@ static inline void zfpm_connect_off(void)  	EVENT_OFF(zfpm_g->t_connect);  } +static inline void zfpm_conn_down_off(void) +{ +	EVENT_OFF(zfpm_g->t_conn_down); +} +  /*   * zfpm_conn_up_thread_cb   * @@ -635,8 +640,6 @@ static void zfpm_conn_down_thread_cb(struct event *thread)  	while ((mac = TAILQ_FIRST(&zfpm_g->mac_q)) != NULL)  		zfpm_mac_info_del(mac); -	zfpm_g->t_conn_down = NULL; -  	iter = &zfpm_g->t_conn_down_state.iter;  	while ((rnode = zfpm_rnodes_iter_next(iter))) { @@ -667,7 +670,6 @@ static void zfpm_conn_down_thread_cb(struct event *thread)  		zfpm_g->stats.t_conn_down_yields++;  		zfpm_rnodes_iter_pause(iter); -		zfpm_g->t_conn_down = NULL;  		event_add_timer_msec(zfpm_g->master, zfpm_conn_down_thread_cb,  				     NULL, 0, &zfpm_g->t_conn_down);  		return; @@ -712,7 +714,7 @@ static void zfpm_connection_down(const char *detail)  	 */  	assert(!zfpm_g->t_conn_down);  	zfpm_rnodes_iter_init(&zfpm_g->t_conn_down_state.iter); -	zfpm_g->t_conn_down = NULL; +	zfpm_conn_down_off();  	event_add_timer_msec(zfpm_g->master, zfpm_conn_down_thread_cb, NULL, 0,  			     &zfpm_g->t_conn_down);  	zfpm_g->stats.t_conn_down_starts++; @@ -2042,6 +2044,7 @@ static int zfpm_fini(void)  	zfpm_write_off();  	zfpm_read_off();  	zfpm_connect_off(); +	zfpm_conn_down_off();  	zfpm_stop_stats_timer();  | 
