summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
db86bf2)
Removing direct access to interrupt handle structure fields,
rather use respective get set APIs for the same.
Making changes to all the libraries access the interrupt handle fields.
Implementing alarm cleanup routine, where the memory allocated
for interrupt instance can be freed.
Signed-off-by: Harman Kalra <hkalra@marvell.com>
Signed-off-by: David Marchand <david.marchand@redhat.com>
Tested-by: Raslan Darawsheh <rasland@nvidia.com>
*/
int rte_eal_alarm_init(void);
*/
int rte_eal_alarm_init(void);
+/**
+ * Alarm mechanism cleanup.
+ *
+ * This function is private to EAL.
+ *
+ * @return
+ * 0 on success, negative on error
+ */
+void rte_eal_alarm_cleanup(void);
+
/**
* Function is to check if the kernel module(like, vfio, vfio_iommu_type1,
* etc.) loaded.
/**
* Function is to check if the kernel module(like, vfio, vfio_iommu_type1,
* etc.) loaded.
rte_mp_channel_cleanup();
/* after this point, any DPDK pointers will become dangling */
rte_eal_memory_detach();
rte_mp_channel_cleanup();
/* after this point, any DPDK pointers will become dangling */
rte_eal_memory_detach();
+ rte_eal_alarm_cleanup();
rte_trace_save();
eal_trace_fini();
eal_cleanup_config(internal_conf);
rte_trace_save();
eal_trace_fini();
eal_cleanup_config(internal_conf);
struct alarm_entry {
LIST_ENTRY(alarm_entry) next;
struct alarm_entry {
LIST_ENTRY(alarm_entry) next;
- struct rte_intr_handle handle;
struct timespec time;
rte_eal_alarm_callback cb_fn;
void *cb_arg;
struct timespec time;
rte_eal_alarm_callback cb_fn;
void *cb_arg;
static LIST_HEAD(alarm_list, alarm_entry) alarm_list = LIST_HEAD_INITIALIZER();
static rte_spinlock_t alarm_list_lk = RTE_SPINLOCK_INITIALIZER;
static LIST_HEAD(alarm_list, alarm_entry) alarm_list = LIST_HEAD_INITIALIZER();
static rte_spinlock_t alarm_list_lk = RTE_SPINLOCK_INITIALIZER;
-static struct rte_intr_handle intr_handle = {.fd = -1 };
+static struct rte_intr_handle *intr_handle;
static void eal_alarm_callback(void *arg);
static void eal_alarm_callback(void *arg);
+void
+rte_eal_alarm_cleanup(void)
+{
+ rte_intr_instance_free(intr_handle);
+}
+
int
rte_eal_alarm_init(void)
{
int
rte_eal_alarm_init(void)
{
- intr_handle.type = RTE_INTR_HANDLE_ALARM;
+ int fd;
+
+ intr_handle = rte_intr_instance_alloc(RTE_INTR_INSTANCE_F_PRIVATE);
+ if (intr_handle == NULL) {
+ RTE_LOG(ERR, EAL, "Fail to allocate intr_handle\n");
+ goto error;
+ }
+
+ if (rte_intr_type_set(intr_handle, RTE_INTR_HANDLE_ALARM))
+ goto error;
+
+ if (rte_intr_fd_set(intr_handle, -1))
+ goto error;
/* on FreeBSD, timers don't use fd's, and their identifiers are stored
* in separate namespace from fd's, so using any value is OK. however,
* EAL interrupts handler expects fd's to be unique, so use an actual fd
* to guarantee unique timer identifier.
*/
/* on FreeBSD, timers don't use fd's, and their identifiers are stored
* in separate namespace from fd's, so using any value is OK. however,
* EAL interrupts handler expects fd's to be unique, so use an actual fd
* to guarantee unique timer identifier.
*/
- intr_handle.fd = open("/dev/zero", O_RDONLY);
+ fd = open("/dev/zero", O_RDONLY);
+
+ if (rte_intr_fd_set(intr_handle, fd))
+ goto error;
+error:
+ rte_intr_instance_free(intr_handle);
+ return -1;
ap = LIST_FIRST(&alarm_list);
do {
ap = LIST_FIRST(&alarm_list);
do {
- ret = rte_intr_callback_unregister(&intr_handle,
+ ret = rte_intr_callback_unregister(intr_handle,
eal_alarm_callback, &ap->time);
} while (ret == -EAGAIN);
}
eal_alarm_callback, &ap->time);
} while (ret == -EAGAIN);
}
ap = LIST_FIRST(&alarm_list);
/* register a new callback */
ap = LIST_FIRST(&alarm_list);
/* register a new callback */
- ret = rte_intr_callback_register(&intr_handle,
+ ret = rte_intr_callback_register(intr_handle,
eal_alarm_callback, &ap->time);
}
return ret;
eal_alarm_callback, &ap->time);
}
return ret;
rte_mp_channel_cleanup();
/* after this point, any DPDK pointers will become dangling */
rte_eal_memory_detach();
rte_mp_channel_cleanup();
/* after this point, any DPDK pointers will become dangling */
rte_eal_memory_detach();
+ rte_eal_alarm_cleanup();
rte_trace_save();
eal_trace_fini();
eal_cleanup_config(internal_conf);
rte_trace_save();
eal_trace_fini();
eal_cleanup_config(internal_conf);
static LIST_HEAD(alarm_list, alarm_entry) alarm_list = LIST_HEAD_INITIALIZER();
static rte_spinlock_t alarm_list_lk = RTE_SPINLOCK_INITIALIZER;
static LIST_HEAD(alarm_list, alarm_entry) alarm_list = LIST_HEAD_INITIALIZER();
static rte_spinlock_t alarm_list_lk = RTE_SPINLOCK_INITIALIZER;
-static struct rte_intr_handle intr_handle = {.fd = -1 };
+static struct rte_intr_handle *intr_handle;
static int handler_registered = 0;
static void eal_alarm_callback(void *arg);
static int handler_registered = 0;
static void eal_alarm_callback(void *arg);
+void
+rte_eal_alarm_cleanup(void)
+{
+ rte_intr_instance_free(intr_handle);
+}
+
int
rte_eal_alarm_init(void)
{
int
rte_eal_alarm_init(void)
{
- intr_handle.type = RTE_INTR_HANDLE_ALARM;
+
+ intr_handle = rte_intr_instance_alloc(RTE_INTR_INSTANCE_F_PRIVATE);
+ if (intr_handle == NULL) {
+ RTE_LOG(ERR, EAL, "Fail to allocate intr_handle\n");
+ goto error;
+ }
+
+ if (rte_intr_type_set(intr_handle, RTE_INTR_HANDLE_ALARM))
+ goto error;
+
/* create a timerfd file descriptor */
/* create a timerfd file descriptor */
- intr_handle.fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK);
- if (intr_handle.fd == -1)
+ if (rte_intr_fd_set(intr_handle,
+ timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK)))
+ if (rte_intr_fd_get(intr_handle) == -1)
+ goto error;
+ rte_intr_instance_free(intr_handle);
rte_errno = errno;
return -1;
}
rte_errno = errno;
return -1;
}
atime.it_value.tv_sec -= now.tv_sec;
atime.it_value.tv_nsec -= now.tv_nsec;
atime.it_value.tv_sec -= now.tv_sec;
atime.it_value.tv_nsec -= now.tv_nsec;
- timerfd_settime(intr_handle.fd, 0, &atime, NULL);
+ timerfd_settime(rte_intr_fd_get(intr_handle), 0, &atime, NULL);
}
rte_spinlock_unlock(&alarm_list_lk);
}
}
rte_spinlock_unlock(&alarm_list_lk);
}
rte_spinlock_lock(&alarm_list_lk);
if (!handler_registered) {
/* registration can fail, callback can be registered later */
rte_spinlock_lock(&alarm_list_lk);
if (!handler_registered) {
/* registration can fail, callback can be registered later */
- if (rte_intr_callback_register(&intr_handle,
+ if (rte_intr_callback_register(intr_handle,
eal_alarm_callback, NULL) == 0)
handler_registered = 1;
}
eal_alarm_callback, NULL) == 0)
handler_registered = 1;
}
.tv_nsec = (us % US_PER_S) * NS_PER_US,
},
};
.tv_nsec = (us % US_PER_S) * NS_PER_US,
},
};
- ret |= timerfd_settime(intr_handle.fd, 0, &alarm_time, NULL);
+ ret |= timerfd_settime(rte_intr_fd_get(intr_handle), 0, &alarm_time, NULL);
}
rte_spinlock_unlock(&alarm_list_lk);
}
rte_spinlock_unlock(&alarm_list_lk);