Re: [vpp-dev] timer_expired_callback is not getting called after sometime

2021-03-17 Thread Dave Barach
Which version of vpp is involved? 

 

A while ago, I went to considerable trouble to idiot-proof the vpp timebase 
code [vlib_time_now()] against huge time jumps, particularly negative time 
jumps. The ntp daemon is perfectly capable of resetting the kernel’s idea of 
“now” by an hour or more in either direction. Your description is at least a 
potential match for an older version of vpp falling victim to a “Back to the 
Future” time jump.

 

At the point where timers stop expiring, use gdb to sanity-check “now” and 
“tw->next_run_time”: 

 

static inline

  u32 * TW (tw_timer_expire_timers_internal) (TWT (tw_timer_wheel) * tw,

  f64 now,

  u32 * callback_vector_arg)

{

 

  /* Called too soon to process new timer expirations? */

  if (PREDICT_FALSE (now < tw->next_run_time))

return callback_vector_arg;

 

HTH... Dave

 

From: vpp-dev@lists.fd.io  On Behalf Of hari_akkin via 
lists.fd.io
Sent: Wednesday, March 17, 2021 5:21 AM
To: vpp-dev@lists.fd.io
Subject: [vpp-dev] timer_expired_callback is not getting called after sometime

 

Hi,
I have tw implementation and its working fine for sometime and later the 
timer_expired_callback function is not  invoked even though the tw node is 
getting scheduled.
 
Detals:

tw_node of type VLIB_NODE_TYPE_INPUT.

Node function calls run_timer_wheels :
run_timer_wheels(vm)
{

tw_timer_wheel_1t_1w_2048sl_t* tw;

f64 now;

u32 thread_id = vlib_get_current_worker_index();

tw = &p_main->timer_wheels[thread_id];

now = vlib_time_now (vm);

tw_timer_expire_timers_1t_1w_2048sl(tw, now);

}

Init:


initialize_timer_wheels ()

{

.
.
tw_timer_wheel_1t_1w_2048sl_t* tw;

int i=0;

u32 n_workers = vlib_num_workers();

 

vec_validate (p_main->timer_wheels, n_workers-1);

 

for(i=0; itimer_wheels[i];

tw_timer_wheel_init_1t_1w_2048sl (tw, timer_expired_callback, 0.1, 
1024);

tw->last_run_time = vlib_time_now (vlib_get_main());

}

}

 

Start Function:


start_timer_wheels()

{

   
u32 n_workers = vlib_num_workers();

for(int i=0; istop_timer_handle[i] = 
tw_timer_start_1t_1w_2048sl(&p_main->timer_wheels[i],

   i 
/*elt-index*/,

   0 
/*timer-id*/,

   1 
/*interval*/);

}

return 0;

}

 

timer_expired_callback (u32 * expired_timers)

{


int i   = 0;

u32 thread_id   = 
vlib_get_current_worker_index();

vlib_main_t *vm = vlib_get_main();

f64 time_now= vlib_time_now(vm);

 

for (i = 0; i < vec_len (expired_timers); i++)

{

  /* application logic */

}

 

p_main->stop_timer_handle[thread_id] = 
tw_timer_start_1t_1w_2048sl(&p_main->timer_wheels[thread_id],


 thread_id,


0,


1);

}


Any thing I am missing here.

thanks.


-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#18952): https://lists.fd.io/g/vpp-dev/message/18952
Mute This Topic: https://lists.fd.io/mt/81398894/21656
Group Owner: vpp-dev+ow...@lists.fd.io
Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-



[vpp-dev] timer_expired_callback is not getting called after sometime

2021-03-17 Thread hari_akkin via lists.fd.io
Hi,
I have tw implementation and its working fine for sometime and later the 
timer_expired_callback function is not  invoked even though the tw node is 
getting scheduled.

Detals:

tw_node of type VLIB_NODE_TYPE_INPUT.

Node function calls run_timer_wheels :
run_timer_wheels(vm)
{
tw_timer_wheel_1t_1w_2048sl_t* tw;
f64 now;
u32 thread_id = vlib_get_current_worker_index();
tw = &p_main->timer_wheels[thread_id];
now = vlib_time_now (vm);
tw_timer_expire_timers_1t_1w_2048sl(tw, now);
}

Init:

initialize_timer_wheels ()
{
.
.
tw_timer_wheel_1t_1w_2048sl_t* tw;
int i=0;
u32 n_workers = vlib_num_workers();

vec_validate (p_main->timer_wheels, n_workers-1);

for(i=0; itimer_wheels[i];
tw_timer_wheel_init_1t_1w_2048sl (tw, timer_expired_callback, 0.1, 1024);
tw->last_run_time = vlib_time_now (vlib_get_main());
}
}

Start Function:

start_timer_wheels()
{

u32 n_workers = vlib_num_workers();
for(int i=0; istop_timer_handle[i] = 
tw_timer_start_1t_1w_2048sl(&p_main->timer_wheels[i],
i /*elt-index*/,
0 /*timer-id*/,
1 /*interval*/);
}
return 0;
}

timer_expired_callback (u32 * expired_timers)
{


int                                 i               = 0;
u32                                 thread_id       = 
vlib_get_current_worker_index();
vlib_main_t                         *vm             = vlib_get_main();
f64                                 time_now        = vlib_time_now(vm);

for (i = 0; i < vec_len (expired_timers); i++)
{
/* application logic */
}

p_main->stop_timer_handle[thread_id] = 
tw_timer_start_1t_1w_2048sl(&p_main->timer_wheels[thread_id],
thread_id,
0,
1);
}

Any thing I am missing here.

thanks.

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#18948): https://lists.fd.io/g/vpp-dev/message/18948
Mute This Topic: https://lists.fd.io/mt/81398894/21656
Group Owner: vpp-dev+ow...@lists.fd.io
Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-