aboutsummaryrefslogtreecommitdiffstats
path: root/lib/libtle_timer/timer.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libtle_timer/timer.c')
-rw-r--r--lib/libtle_timer/timer.c43
1 files changed, 27 insertions, 16 deletions
diff --git a/lib/libtle_timer/timer.c b/lib/libtle_timer/timer.c
index 8b89fd6..a0169ef 100644
--- a/lib/libtle_timer/timer.c
+++ b/lib/libtle_timer/timer.c
@@ -134,6 +134,30 @@ put_timer(struct tle_timer_list *list, struct tle_timer_elmt *e)
list->num++;
}
+static inline struct tle_timer_elmt *
+get_free_timer(struct tle_timer_wheel *tw)
+{
+ unsigned i, n;
+ struct tle_timer_elmt *e;
+
+ e = LIST_FIRST(&tw->free.head);
+ if (e == NULL) {
+ n = 128;
+ n = RTE_MIN(n, tw->prm.max_timer - tw->free.num);
+ for (i = 0; i < n; i++) {
+ e = rte_zmalloc_socket(NULL, sizeof(*e),
+ sizeof(e), tw->prm.socket_id);
+ if (e != NULL)
+ put_timer(&tw->free, e);
+ else
+ rte_panic("Failed to allocate timer");
+ }
+ }
+
+ e = get_timer(&tw->free);
+ return e;
+}
+
static inline void
rem_timer(struct tle_timer_list *list, struct tle_timer_elmt *e)
{
@@ -149,8 +173,6 @@ tle_timer_create(struct tle_timer_wheel_args *prm, uint64_t now)
uint32_t i, j;
size_t sz;
struct tle_timer_wheel *tw;
- struct tle_timer_elmt *e;
- struct tle_timer_elmt *timers;
if (prm == NULL) {
rte_errno = -EINVAL;
@@ -169,7 +191,7 @@ tle_timer_create(struct tle_timer_wheel_args *prm, uint64_t now)
return NULL;
}
- sz = sizeof(*tw) + prm->max_timer * sizeof(struct tle_timer_elmt);
+ sz = sizeof(*tw);
/* allocate memory */
tw = rte_zmalloc_socket(NULL, sz, RTE_CACHE_LINE_SIZE,
@@ -182,17 +204,11 @@ tle_timer_create(struct tle_timer_wheel_args *prm, uint64_t now)
tw->last_run_time = now;
tw->prm = *prm;
- timers = (struct tle_timer_elmt *)(tw + 1);
/* initialize the lists */
LIST_INIT(&tw->free.head);
LIST_INIT(&tw->expired.head);
- for (i = 0; i < prm->max_timer; i++) {
- e = timers + i;
- put_timer(&tw->free, e);
- }
-
for (i = 0; i < TW_N_RINGS; i++)
for (j = 0; j < TW_SLOTS_PER_RING; j++)
LIST_INIT(&tw->w[i][j].head);
@@ -223,11 +239,6 @@ tle_timer_start(struct tle_timer_wheel *tw, void *obj, uint64_t interval)
return NULL;
}
- if (tw->free.num == 0) {
- rte_errno = ENOMEM;
- return NULL;
- }
-
nb_tick = interval / tw->prm.tick_size;
fast_ring_index = nb_tick & TW_RING_MASK;
@@ -248,7 +259,7 @@ tle_timer_start(struct tle_timer_wheel *tw, void *obj, uint64_t interval)
slow_ring_index %= TW_SLOTS_PER_RING;
ts = &tw->w[TW_RING_SLOW][slow_ring_index];
- e = get_timer(&tw->free);
+ e = get_free_timer(tw);
e->obj = obj;
e->fast_index = fast_ring_index;
put_timer(ts, e);
@@ -260,7 +271,7 @@ tle_timer_start(struct tle_timer_wheel *tw, void *obj, uint64_t interval)
/* Timer expires less than 51.2 seconds from now */
ts = &tw->w[TW_RING_FAST][fast_ring_index];
- e = get_timer(&tw->free);
+ e = get_free_timer(tw);
e->obj = obj;
put_timer(ts, e);