doc: remove jumbo frames entry from tap features
[dpdk.git] / examples / ip_pipeline / thread.c
index 78f1bd8..9013afd 100644 (file)
@@ -1,34 +1,5 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2010-2015 Intel Corporation. All rights reserved.
- *   All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of Intel Corporation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2015 Intel Corporation
  */
 
 #include <rte_common.h>
 #include "app.h"
 #include "thread.h"
 
+#if APP_THREAD_HEADROOM_STATS_COLLECT
+
+#define PIPELINE_RUN_REGULAR(thread, pipeline)         \
+do {                                                   \
+       uint64_t t0 = rte_rdtsc_precise();              \
+       int n_pkts = rte_pipeline_run(pipeline->p);     \
+                                                       \
+       if (n_pkts == 0) {                              \
+               uint64_t t1 = rte_rdtsc_precise();      \
+                                                       \
+               thread->headroom_cycles += t1 - t0;     \
+       }                                               \
+} while (0)
+
+
+#define PIPELINE_RUN_CUSTOM(thread, data)              \
+do {                                                   \
+       uint64_t t0 = rte_rdtsc_precise();              \
+       int n_pkts = data->f_run(data->be);             \
+                                                       \
+       if (n_pkts == 0) {                              \
+               uint64_t t1 = rte_rdtsc_precise();      \
+                                                       \
+               thread->headroom_cycles += t1 - t0;     \
+       }                                               \
+} while (0)
+
+#else
+
+#define PIPELINE_RUN_REGULAR(thread, pipeline)         \
+       rte_pipeline_run(pipeline->p)
+
+#define PIPELINE_RUN_CUSTOM(thread, data)              \
+       data->f_run(data->be)
+
+#endif
+
 static inline void *
 thread_msg_recv(struct rte_ring *r)
 {
@@ -165,6 +173,17 @@ thread_msg_req_handle(struct app_thread_data *t)
                        thread_msg_send(t->msgq_out, rsp);
                        break;
                }
+
+               case THREAD_MSG_REQ_HEADROOM_READ: {
+                       struct thread_headroom_read_msg_rsp *rsp =
+                               (struct thread_headroom_read_msg_rsp *)
+                               req;
+
+                       rsp->headroom_ratio = t->headroom_ratio;
+                       rsp->status = 0;
+                       thread_msg_send(t->msgq_out, rsp);
+                       break;
+               }
                default:
                        break;
                }
@@ -172,6 +191,18 @@ thread_msg_req_handle(struct app_thread_data *t)
        return 0;
 }
 
+static void
+thread_headroom_update(struct app_thread_data *t, uint64_t time)
+{
+       uint64_t time_diff = time - t->headroom_time;
+
+       t->headroom_ratio =
+               ((double) t->headroom_cycles) / ((double) time_diff);
+
+       t->headroom_cycles = 0;
+       t->headroom_time = rte_rdtsc_precise();
+}
+
 int
 app_thread(void *arg)
 {
@@ -188,14 +219,14 @@ app_thread(void *arg)
                        struct app_thread_pipeline_data *data = &t->regular[j];
                        struct pipeline *p = data->be;
 
-                       rte_pipeline_run(p->p);
+                       PIPELINE_RUN_REGULAR(t, p);
                }
 
                /* Run custom pipelines */
                for (j = 0; j < n_custom; j++) {
                        struct app_thread_pipeline_data *data = &t->custom[j];
 
-                       data->f_run(data->be);
+                       PIPELINE_RUN_CUSTOM(t, data);
                }
 
                /* Timer */
@@ -244,6 +275,7 @@ app_thread(void *arg)
 
                                if (deadline <= time) {
                                        thread_msg_req_handle(t);
+                                       thread_headroom_update(t, time);
                                        deadline = time + t->timer_period;
                                        t->thread_req_deadline = deadline;
                                }
@@ -252,6 +284,7 @@ app_thread(void *arg)
                                        t_deadline = deadline;
                        }
 
+
                        t->deadline = t_deadline;
                }
        }