trace: add interrupt tracepoints
authorJerin Jacob <jerinj@marvell.com>
Wed, 22 Apr 2020 19:03:38 +0000 (00:33 +0530)
committerDavid Marchand <david.marchand@redhat.com>
Thu, 23 Apr 2020 13:39:55 +0000 (15:39 +0200)
Add the following interrupt related tracepoints.

- rte_eal_trace_intr_callback_register()
- rte_eal_trace_intr_callback_unregister()
- rte_eal_trace_intr_enable()
- rte_eal_trace_intr_disable()

Signed-off-by: Jerin Jacob <jerinj@marvell.com>
Acked-by: David Marchand <david.marchand@redhat.com>
lib/librte_eal/common/eal_common_trace_points.c
lib/librte_eal/freebsd/eal_interrupts.c
lib/librte_eal/include/rte_eal_trace.h
lib/librte_eal/linux/eal_interrupts.c
lib/librte_eal/rte_eal_version.map

index aca1846..7611977 100644 (file)
@@ -38,6 +38,11 @@ RTE_TRACE_POINT_DEFINE(rte_eal_trace_memzone_free);
 RTE_TRACE_POINT_DEFINE(rte_eal_trace_thread_remote_launch);
 RTE_TRACE_POINT_DEFINE(rte_eal_trace_thread_lcore_ready);
 
+RTE_TRACE_POINT_DEFINE(rte_eal_trace_intr_callback_register);
+RTE_TRACE_POINT_DEFINE(rte_eal_trace_intr_callback_unregister);
+RTE_TRACE_POINT_DEFINE(rte_eal_trace_intr_enable);
+RTE_TRACE_POINT_DEFINE(rte_eal_trace_intr_disable);
+
 RTE_INIT(eal_trace_init)
 {
        RTE_TRACE_POINT_REGISTER(rte_eal_trace_generic_void,
@@ -98,4 +103,13 @@ RTE_INIT(eal_trace_init)
                lib.eal.thread.remote.launch);
        RTE_TRACE_POINT_REGISTER(rte_eal_trace_thread_lcore_ready,
                lib.eal.thread.lcore.ready);
+
+       RTE_TRACE_POINT_REGISTER(rte_eal_trace_intr_callback_register,
+               lib.eal.intr.register);
+       RTE_TRACE_POINT_REGISTER(rte_eal_trace_intr_callback_unregister,
+               lib.eal.intr.unregister);
+       RTE_TRACE_POINT_REGISTER(rte_eal_trace_intr_enable,
+               lib.eal.intr.enable);
+       RTE_TRACE_POINT_REGISTER(rte_eal_trace_intr_disable,
+               lib.eal.intr.disable);
 }
index 00991f2..6d53d33 100644 (file)
@@ -13,6 +13,7 @@
 #include <rte_spinlock.h>
 #include <rte_common.h>
 #include <rte_interrupts.h>
+#include <rte_eal_trace.h>
 
 #include "eal_private.h"
 #include "eal_alarm_private.h"
@@ -85,7 +86,7 @@ rte_intr_callback_register(const struct rte_intr_handle *intr_handle,
 {
        struct rte_intr_callback *callback;
        struct rte_intr_source *src;
-       int ret, add_event = 0;
+       int ret = 0, add_event = 0;
 
        /* first do parameter checking */
        if (intr_handle == NULL || intr_handle->fd < 0 || cb == NULL) {
@@ -182,6 +183,7 @@ rte_intr_callback_register(const struct rte_intr_handle *intr_handle,
                        goto fail;
                }
        }
+       rte_eal_trace_intr_callback_register(intr_handle, cb, cb_arg, ret);
        rte_spinlock_unlock(&intr_lock);
 
        return 0;
@@ -196,6 +198,7 @@ fail:
                }
        }
        free(callback);
+       rte_eal_trace_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_eal_trace_intr_callback_unregister(intr_handle, cb_fn, cb_arg,
+               ret);
        rte_spinlock_unlock(&intr_lock);
 
        return ret;
@@ -343,55 +348,78 @@ out:
 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_eal_trace_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_eal_trace_intr_disable(intr_handle, rc);
+       return rc;
 }
 
 int
index 22ae136..1ebb290 100644 (file)
@@ -16,6 +16,7 @@ extern "C" {
 #endif
 
 #include <rte_alarm.h>
+#include <rte_interrupts.h>
 #include <rte_trace_point.h>
 
 /* Generic */
@@ -222,6 +223,54 @@ RTE_TRACE_POINT(
        rte_trace_point_emit_string(cpuset);
 )
 
+/* Interrupt */
+RTE_TRACE_POINT(
+       rte_eal_trace_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_eal_trace_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_eal_trace_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_eal_trace_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
 }
 #endif
index 3893e40..16e7a7d 100644 (file)
@@ -34,6 +34,7 @@
 #include <rte_spinlock.h>
 #include <rte_pause.h>
 #include <rte_vfio.h>
+#include <rte_eal_trace.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_eal_trace_intr_callback_register(intr_handle, cb, cb_arg, ret);
        return ret;
 }
 
@@ -656,63 +658,76 @@ rte_intr_callback_unregister(const struct rte_intr_handle *intr_handle,
                ret = -EPIPE;
        }
 
+       rte_eal_trace_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_eal_trace_intr_enable(intr_handle, rc);
+       return rc;
 }
 
 /**
@@ -778,57 +793,68 @@ 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_eal_trace_intr_disable(intr_handle, rc);
+       return rc;
 }
 
 static int
index 0ccfed7..6088e7f 100644 (file)
@@ -355,6 +355,10 @@ EXPERIMENTAL {
        __rte_eal_trace_generic_u64;
        __rte_eal_trace_generic_u8;
        __rte_eal_trace_generic_void;
+       __rte_eal_trace_intr_callback_register;
+       __rte_eal_trace_intr_callback_unregister;
+       __rte_eal_trace_intr_enable;
+       __rte_eal_trace_intr_disable;
        __rte_eal_trace_mem_free;
        __rte_eal_trace_mem_malloc;
        __rte_eal_trace_mem_realloc;