+ if (edev->available_events < timr->nb_timers) {
+ timvf_log_err(
+ "Max available events %"PRIu32" requested timer events %"PRIu64"",
+ edev->available_events, timr->nb_timers);
+ return -ENOMEM;
+ }
+
+ for (i = 0; i < edev->tim_ring_cnt; i++) {
+ if (edev->tim_ring_ids[i] == UINT16_MAX)
+ free_idx = i;
+ }
+
+ if (free_idx == UINT16_MAX) {
+ void *old_ptr;
+
+ edev->tim_ring_cnt++;
+ old_ptr = edev->tim_ring_ids;
+ edev->tim_ring_ids =
+ rte_realloc(edev->tim_ring_ids,
+ sizeof(uint16_t) * edev->tim_ring_cnt, 0);
+ if (edev->tim_ring_ids == NULL) {
+ edev->tim_ring_ids = old_ptr;
+ edev->tim_ring_cnt--;
+ return -ENOMEM;
+ }
+
+ edev->available_events -= timr->nb_timers;
+ } else {
+ edev->tim_ring_ids[free_idx] = tim_ring_id;
+ edev->available_events -= timr->nb_timers;
+ }
+
+ timr->nb_chunks = timr->nb_timers / nb_chunk_slots;