@@ -38,6 +38,11 @@ RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_memzone_free);
RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_thread_remote_launch);
RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_thread_lcore_ready);
+RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_intr_callback_register);
+RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_intr_callback_unregister);
+RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_intr_enable);
+RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_intr_disable);
+
RTE_INIT(eal_trace_init)
{
RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_void,
@@ -98,4 +103,13 @@ RTE_INIT(eal_trace_init)
lib.eal.thread.remote.launch);
RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_thread_lcore_ready,
lib.eal.thread.lcore.ready);
+
+ RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_intr_callback_register,
+ lib.eal.intr.register);
+ RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_intr_callback_unregister,
+ lib.eal.intr.unregister);
+ RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_intr_enable,
+ lib.eal.intr.enable);
+ RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_intr_disable,
+ lib.eal.intr.disable);
}
@@ -13,6 +13,7 @@
#include <rte_spinlock.h>
#include <rte_common.h>
#include <rte_interrupts.h>
+#include <rte_trace_eal.h>
#include "eal_private.h"
#include "eal_alarm_private.h"
@@ -182,6 +183,7 @@ rte_intr_callback_register(const struct rte_intr_handle *intr_handle,
goto fail;
}
}
+ rte_trace_lib_eal_intr_callback_register(intr_handle, cb, cb_arg, ret);
rte_spinlock_unlock(&intr_lock);
return 0;
@@ -196,6 +198,7 @@ rte_intr_callback_register(const struct rte_intr_handle *intr_handle,
}
}
free(callback);
+ rte_trace_lib_eal_intr_callback_register(intr_handle, cb, cb_arg, ret);
rte_spinlock_unlock(&intr_lock);
return ret;
}
@@ -335,6 +338,8 @@ rte_intr_callback_unregister(const struct rte_intr_handle *intr_handle,
}
}
out:
+ rte_trace_lib_eal_intr_callback_unregister(intr_handle, cb_fn,
+ cb_arg, ret);
rte_spinlock_unlock(&intr_lock);
return ret;
@@ -343,55 +348,68 @@ rte_intr_callback_unregister(const struct rte_intr_handle *intr_handle,
int
rte_intr_enable(const struct rte_intr_handle *intr_handle)
{
- if (intr_handle && intr_handle->type == RTE_INTR_HANDLE_VDEV)
- return 0;
+ int rc = 0;
- if (!intr_handle || intr_handle->fd < 0 || intr_handle->uio_cfg_fd < 0)
- return -1;
+ if (intr_handle && intr_handle->type == RTE_INTR_HANDLE_VDEV) {
+ rc = 0; goto out;
+ }
+
+ if (!intr_handle || intr_handle->fd < 0 ||
+ intr_handle->uio_cfg_fd < 0) {
+ rc = -1; goto out;
+ }
switch (intr_handle->type) {
/* not used at this moment */
case RTE_INTR_HANDLE_ALARM:
- return -1;
+ rc = -1; break;
/* not used at this moment */
case RTE_INTR_HANDLE_DEV_EVENT:
- return -1;
+ rc = -1; break;
/* unknown handle type */
default:
RTE_LOG(ERR, EAL,
"Unknown handle type of fd %d\n",
intr_handle->fd);
- return -1;
+ rc = -1; break;
}
- return 0;
+out:
+ rte_trace_lib_eal_intr_enable(intr_handle, rc);
+ return rc;
}
int
rte_intr_disable(const struct rte_intr_handle *intr_handle)
{
- if (intr_handle && intr_handle->type == RTE_INTR_HANDLE_VDEV)
- return 0;
+ int rc = 0;
- if (!intr_handle || intr_handle->fd < 0 || intr_handle->uio_cfg_fd < 0)
- return -1;
+ if (intr_handle && intr_handle->type == RTE_INTR_HANDLE_VDEV) {
+ rc = 0; goto out;
+ }
+
+ if (!intr_handle || intr_handle->fd < 0 ||
+ intr_handle->uio_cfg_fd < 0) {
+ rc = -1; goto out;
+ }
switch (intr_handle->type) {
/* not used at this moment */
case RTE_INTR_HANDLE_ALARM:
- return -1;
+ rc = -1; break;
/* not used at this moment */
case RTE_INTR_HANDLE_DEV_EVENT:
- return -1;
+ rc = -1; break;
/* unknown handle type */
default:
RTE_LOG(ERR, EAL,
"Unknown handle type of fd %d\n",
intr_handle->fd);
- return -1;
+ rc = -1; break;
}
-
- return 0;
+out:
+ rte_trace_lib_eal_intr_disable(intr_handle, rc);
+ return rc;
}
int
@@ -16,6 +16,7 @@ extern "C" {
#endif
#include <rte_alarm.h>
+#include <rte_interrupts.h>
#include <rte_trace_point.h>
/* Generic */
@@ -222,6 +223,53 @@ RTE_TRACE_POINT(
rte_trace_point_emit_string(cpuset);
)
+/* Interrupt */
+RTE_TRACE_POINT(
+ rte_trace_lib_eal_intr_callback_register,
+ RTE_TRACE_POINT_ARGS(const struct rte_intr_handle *handle,
+ rte_intr_callback_fn cb, void *cb_arg, int rc),
+ rte_trace_point_emit_int(rc);
+ rte_trace_point_emit_int(handle->vfio_dev_fd);
+ rte_trace_point_emit_int(handle->fd);
+ rte_trace_point_emit_int(handle->type);
+ rte_trace_point_emit_u32(handle->max_intr);
+ rte_trace_point_emit_u32(handle->nb_efd);
+ rte_trace_point_emit_ptr(cb);
+ rte_trace_point_emit_ptr(cb_arg);
+)
+RTE_TRACE_POINT(
+ rte_trace_lib_eal_intr_callback_unregister,
+ RTE_TRACE_POINT_ARGS(const struct rte_intr_handle *handle,
+ rte_intr_callback_fn cb, void *cb_arg, int rc),
+ rte_trace_point_emit_int(rc);
+ rte_trace_point_emit_int(handle->vfio_dev_fd);
+ rte_trace_point_emit_int(handle->fd);
+ rte_trace_point_emit_int(handle->type);
+ rte_trace_point_emit_u32(handle->max_intr);
+ rte_trace_point_emit_u32(handle->nb_efd);
+ rte_trace_point_emit_ptr(cb);
+ rte_trace_point_emit_ptr(cb_arg);
+)
+RTE_TRACE_POINT(
+ rte_trace_lib_eal_intr_enable,
+ RTE_TRACE_POINT_ARGS(const struct rte_intr_handle *handle, int rc),
+ rte_trace_point_emit_int(rc);
+ rte_trace_point_emit_int(handle->vfio_dev_fd);
+ rte_trace_point_emit_int(handle->fd);
+ rte_trace_point_emit_int(handle->type);
+ rte_trace_point_emit_u32(handle->max_intr);
+ rte_trace_point_emit_u32(handle->nb_efd);
+)
+RTE_TRACE_POINT(
+ rte_trace_lib_eal_intr_disable,
+ RTE_TRACE_POINT_ARGS(const struct rte_intr_handle *handle, int rc),
+ rte_trace_point_emit_int(rc);
+ rte_trace_point_emit_int(handle->vfio_dev_fd);
+ rte_trace_point_emit_int(handle->fd);
+ rte_trace_point_emit_int(handle->type);
+ rte_trace_point_emit_u32(handle->max_intr);
+ rte_trace_point_emit_u32(handle->nb_efd);
+)
#ifdef __cplusplus
}
@@ -34,6 +34,7 @@
#include <rte_spinlock.h>
#include <rte_pause.h>
#include <rte_vfio.h>
+#include <rte_trace_eal.h>
#include "eal_private.h"
#include "eal_vfio.h"
@@ -539,8 +540,9 @@ rte_intr_callback_register(const struct rte_intr_handle *intr_handle,
*/
if (wake_thread)
if (write(intr_pipe.writefd, "1", 1) < 0)
- return -EPIPE;
+ ret = -EPIPE;
+ rte_trace_lib_eal_intr_callback_register(intr_handle, cb, cb_arg, ret);
return ret;
}
@@ -656,63 +658,74 @@ rte_intr_callback_unregister(const struct rte_intr_handle *intr_handle,
ret = -EPIPE;
}
+ rte_trace_lib_eal_intr_callback_unregister(intr_handle, cb_fn,
+ cb_arg, ret);
return ret;
}
int
rte_intr_enable(const struct rte_intr_handle *intr_handle)
{
- if (intr_handle && intr_handle->type == RTE_INTR_HANDLE_VDEV)
- return 0;
+ int rc = 0;
- if (!intr_handle || intr_handle->fd < 0 || intr_handle->uio_cfg_fd < 0)
- return -1;
+ if (intr_handle && intr_handle->type == RTE_INTR_HANDLE_VDEV) {
+ rc = 0; goto out;
+ }
+
+ if (!intr_handle || intr_handle->fd < 0 ||
+ intr_handle->uio_cfg_fd < 0) {
+ rc = -1; goto out;
+ }
switch (intr_handle->type){
/* write to the uio fd to enable the interrupt */
case RTE_INTR_HANDLE_UIO:
if (uio_intr_enable(intr_handle))
- return -1;
+ rc = -1;
break;
case RTE_INTR_HANDLE_UIO_INTX:
if (uio_intx_intr_enable(intr_handle))
- return -1;
+ rc = -1;
break;
/* not used at this moment */
case RTE_INTR_HANDLE_ALARM:
- return -1;
+ rc = -1;
+ break;
#ifdef VFIO_PRESENT
case RTE_INTR_HANDLE_VFIO_MSIX:
if (vfio_enable_msix(intr_handle))
- return -1;
+ rc = -1;
break;
case RTE_INTR_HANDLE_VFIO_MSI:
if (vfio_enable_msi(intr_handle))
- return -1;
+ rc = -1;
break;
case RTE_INTR_HANDLE_VFIO_LEGACY:
if (vfio_enable_intx(intr_handle))
- return -1;
+ rc = -1;
break;
#ifdef HAVE_VFIO_DEV_REQ_INTERFACE
case RTE_INTR_HANDLE_VFIO_REQ:
if (vfio_enable_req(intr_handle))
- return -1;
+ rc = -1;
break;
#endif
#endif
/* not used at this moment */
case RTE_INTR_HANDLE_DEV_EVENT:
- return -1;
+ rc = -1;
+ break;
/* unknown handle type */
default:
RTE_LOG(ERR, EAL,
"Unknown handle type of fd %d\n",
intr_handle->fd);
- return -1;
+ rc = -1;
+ break;
}
-
- return 0;
+out:
+ rte_trace_lib_eal_intr_enable(intr_handle, rc);
+ return rc;
}
/**
@@ -778,57 +791,66 @@ rte_intr_ack(const struct rte_intr_handle *intr_handle)
int
rte_intr_disable(const struct rte_intr_handle *intr_handle)
{
- if (intr_handle && intr_handle->type == RTE_INTR_HANDLE_VDEV)
- return 0;
+ int rc = 0;
- if (!intr_handle || intr_handle->fd < 0 || intr_handle->uio_cfg_fd < 0)
- return -1;
+ if (intr_handle && intr_handle->type == RTE_INTR_HANDLE_VDEV) {
+ rc = 0; goto out;
+ }
+
+ if (!intr_handle || intr_handle->fd < 0 ||
+ intr_handle->uio_cfg_fd < 0) {
+ rc = -1; goto out;
+ }
switch (intr_handle->type){
/* write to the uio fd to disable the interrupt */
case RTE_INTR_HANDLE_UIO:
if (uio_intr_disable(intr_handle))
- return -1;
+ rc = -1;
break;
case RTE_INTR_HANDLE_UIO_INTX:
if (uio_intx_intr_disable(intr_handle))
- return -1;
+ rc = -1;
break;
/* not used at this moment */
case RTE_INTR_HANDLE_ALARM:
- return -1;
+ rc = -1;
+ break;
#ifdef VFIO_PRESENT
case RTE_INTR_HANDLE_VFIO_MSIX:
if (vfio_disable_msix(intr_handle))
- return -1;
+ rc = -1;
break;
case RTE_INTR_HANDLE_VFIO_MSI:
if (vfio_disable_msi(intr_handle))
- return -1;
+ rc = -1;
break;
case RTE_INTR_HANDLE_VFIO_LEGACY:
if (vfio_disable_intx(intr_handle))
- return -1;
+ rc = -1;
break;
#ifdef HAVE_VFIO_DEV_REQ_INTERFACE
case RTE_INTR_HANDLE_VFIO_REQ:
if (vfio_disable_req(intr_handle))
- return -1;
+ rc = -1;
break;
#endif
#endif
/* not used at this moment */
case RTE_INTR_HANDLE_DEV_EVENT:
- return -1;
+ rc = -1;
+ break;
/* unknown handle type */
default:
RTE_LOG(ERR, EAL,
"Unknown handle type of fd %d\n",
intr_handle->fd);
- return -1;
+ rc = -1;
+ break;
}
-
- return 0;
+out:
+ rte_trace_lib_eal_intr_disable(intr_handle, rc);
+ return rc;
}
static int
@@ -375,6 +375,10 @@ EXPERIMENTAL {
__rte_trace_lib_eal_generic_u64;
__rte_trace_lib_eal_generic_u8;
__rte_trace_lib_eal_generic_void;
+ __rte_trace_lib_eal_intr_callback_register;
+ __rte_trace_lib_eal_intr_callback_unregister;
+ __rte_trace_lib_eal_intr_enable;
+ __rte_trace_lib_eal_intr_disable;
__rte_trace_lib_eal_mem_free;
__rte_trace_lib_eal_mem_malloc;
__rte_trace_lib_eal_mem_realloc;