144c730b0SWojciech Liguzinski /* SPDX-License-Identifier: BSD-3-Clause
244c730b0SWojciech Liguzinski * Copyright(c) 2010-2014 Intel Corporation
344c730b0SWojciech Liguzinski */
444c730b0SWojciech Liguzinski
53c60274cSJie Zhou #include "test.h"
63c60274cSJie Zhou
73c60274cSJie Zhou #ifdef RTE_EXEC_ENV_WINDOWS
83c60274cSJie Zhou
93c60274cSJie Zhou static int
test_pie(void)103c60274cSJie Zhou test_pie(void)
113c60274cSJie Zhou {
123c60274cSJie Zhou printf("pie not supported on Windows, skipping test\n");
133c60274cSJie Zhou return TEST_SKIPPED;
143c60274cSJie Zhou }
153c60274cSJie Zhou
163c60274cSJie Zhou static int
test_pie_perf(void)173c60274cSJie Zhou test_pie_perf(void)
183c60274cSJie Zhou {
193c60274cSJie Zhou printf("pie_perf not supported on Windows, skipping test\n");
203c60274cSJie Zhou return TEST_SKIPPED;
213c60274cSJie Zhou }
223c60274cSJie Zhou
233c60274cSJie Zhou static int
test_pie_all(void)243c60274cSJie Zhou test_pie_all(void)
253c60274cSJie Zhou {
263c60274cSJie Zhou printf("pie_all not supported on Windows, skipping test\n");
273c60274cSJie Zhou return TEST_SKIPPED;
283c60274cSJie Zhou }
293c60274cSJie Zhou
303c60274cSJie Zhou #else
313c60274cSJie Zhou
3244c730b0SWojciech Liguzinski #include <stdlib.h>
3344c730b0SWojciech Liguzinski #include <stdio.h>
3444c730b0SWojciech Liguzinski #include <string.h>
3544c730b0SWojciech Liguzinski #include <stdint.h>
3644c730b0SWojciech Liguzinski #include <unistd.h>
3744c730b0SWojciech Liguzinski #include <inttypes.h>
3844c730b0SWojciech Liguzinski #include <sys/time.h>
3944c730b0SWojciech Liguzinski #include <time.h>
4044c730b0SWojciech Liguzinski #include <math.h>
4144c730b0SWojciech Liguzinski
4244c730b0SWojciech Liguzinski #include <rte_pie.h>
4344c730b0SWojciech Liguzinski
4444c730b0SWojciech Liguzinski #ifdef __INTEL_COMPILER
4544c730b0SWojciech Liguzinski #pragma warning(disable:2259) /* conversion may lose significant bits */
4644c730b0SWojciech Liguzinski #pragma warning(disable:181) /* Arg incompatible with format string */
4744c730b0SWojciech Liguzinski #endif
4844c730b0SWojciech Liguzinski
4944c730b0SWojciech Liguzinski /**< structures for testing rte_pie performance and function */
5044c730b0SWojciech Liguzinski struct test_rte_pie_config { /**< Test structure for RTE_PIE config */
5144c730b0SWojciech Liguzinski struct rte_pie_config *pconfig; /**< RTE_PIE configuration parameters */
5244c730b0SWojciech Liguzinski uint8_t num_cfg; /**< Number of RTE_PIE configs to test */
5344c730b0SWojciech Liguzinski uint16_t qdelay_ref; /**< Latency Target (milliseconds) */
5444c730b0SWojciech Liguzinski uint16_t *dp_update_interval; /**< Update interval for drop probability
5544c730b0SWojciech Liguzinski * (milliseconds)
5644c730b0SWojciech Liguzinski */
5744c730b0SWojciech Liguzinski uint16_t *max_burst; /**< Max Burst Allowance (milliseconds) */
5844c730b0SWojciech Liguzinski uint16_t tailq_th; /**< Tailq drop threshold (packet counts) */
5944c730b0SWojciech Liguzinski };
6044c730b0SWojciech Liguzinski
6144c730b0SWojciech Liguzinski struct test_queue { /**< Test structure for RTE_PIE Queues */
6244c730b0SWojciech Liguzinski struct rte_pie *pdata_in; /**< RTE_PIE runtime data input */
6344c730b0SWojciech Liguzinski struct rte_pie *pdata_out; /**< RTE_PIE runtime data output*/
6444c730b0SWojciech Liguzinski uint32_t num_queues; /**< Number of RTE_PIE queues to test */
6544c730b0SWojciech Liguzinski uint32_t *qlen; /**< Queue size */
6644c730b0SWojciech Liguzinski uint32_t q_ramp_up; /**< Num of enqueues to ramp up the queue */
6744c730b0SWojciech Liguzinski double drop_tolerance; /**< Drop tolerance of packets not enqueued */
6844c730b0SWojciech Liguzinski };
6944c730b0SWojciech Liguzinski
7044c730b0SWojciech Liguzinski struct test_var { /**< Test variables used for testing RTE_PIE */
7144c730b0SWojciech Liguzinski uint32_t num_iterations; /**< Number of test iterations */
7244c730b0SWojciech Liguzinski uint32_t num_ops; /**< Number of test operations */
7344c730b0SWojciech Liguzinski uint64_t clk_freq; /**< CPU clock frequency */
7444c730b0SWojciech Liguzinski uint32_t *dropped; /**< Test operations dropped */
7544c730b0SWojciech Liguzinski uint32_t *enqueued; /**< Test operations enqueued */
7644c730b0SWojciech Liguzinski uint32_t *dequeued; /**< Test operations dequeued */
7744c730b0SWojciech Liguzinski };
7844c730b0SWojciech Liguzinski
7944c730b0SWojciech Liguzinski struct test_config { /**< Primary test structure for RTE_PIE */
8044c730b0SWojciech Liguzinski const char *ifname; /**< Interface name */
8144c730b0SWojciech Liguzinski const char *msg; /**< Test message for display */
8244c730b0SWojciech Liguzinski const char *htxt; /**< Header txt display for result output */
8344c730b0SWojciech Liguzinski struct test_rte_pie_config *tconfig; /**< Test structure for RTE_PIE config */
8444c730b0SWojciech Liguzinski struct test_queue *tqueue; /**< Test structure for RTE_PIE Queues */
8544c730b0SWojciech Liguzinski struct test_var *tvar; /**< Test variables used for testing RTE_PIE */
8644c730b0SWojciech Liguzinski uint32_t *tlevel; /**< Queue levels */
8744c730b0SWojciech Liguzinski };
8844c730b0SWojciech Liguzinski
8944c730b0SWojciech Liguzinski enum test_result {
9044c730b0SWojciech Liguzinski FAIL = 0,
9144c730b0SWojciech Liguzinski PASS
9244c730b0SWojciech Liguzinski };
9344c730b0SWojciech Liguzinski
9444c730b0SWojciech Liguzinski /**< Test structure to define tests to run */
9544c730b0SWojciech Liguzinski struct tests {
9644c730b0SWojciech Liguzinski struct test_config *testcfg;
9744c730b0SWojciech Liguzinski enum test_result (*testfn)(struct test_config *cfg);
9844c730b0SWojciech Liguzinski };
9944c730b0SWojciech Liguzinski
10044c730b0SWojciech Liguzinski struct rdtsc_prof {
10144c730b0SWojciech Liguzinski uint64_t clk_start;
10244c730b0SWojciech Liguzinski uint64_t clk_min; /**< min clocks */
10344c730b0SWojciech Liguzinski uint64_t clk_max; /**< max clocks */
10444c730b0SWojciech Liguzinski uint64_t clk_avgc; /**< count to calc average */
10544c730b0SWojciech Liguzinski double clk_avg; /**< cumulative sum to calc average */
10644c730b0SWojciech Liguzinski const char *name;
10744c730b0SWojciech Liguzinski };
10844c730b0SWojciech Liguzinski
10944c730b0SWojciech Liguzinski static const uint64_t port_speed_bytes = (10ULL*1000ULL*1000ULL*1000ULL)/8ULL;
11044c730b0SWojciech Liguzinski static double inv_cycles_per_byte;
11144c730b0SWojciech Liguzinski
init_port_ts(uint64_t cpu_clock)11244c730b0SWojciech Liguzinski static void init_port_ts(uint64_t cpu_clock)
11344c730b0SWojciech Liguzinski {
11444c730b0SWojciech Liguzinski double cycles_per_byte = (double)(cpu_clock) / (double)(port_speed_bytes);
11544c730b0SWojciech Liguzinski inv_cycles_per_byte = 1.0 / cycles_per_byte;
11644c730b0SWojciech Liguzinski }
11744c730b0SWojciech Liguzinski
get_port_ts(void)11844c730b0SWojciech Liguzinski static uint64_t get_port_ts(void)
11944c730b0SWojciech Liguzinski {
12044c730b0SWojciech Liguzinski return (uint64_t)((double)rte_rdtsc() * inv_cycles_per_byte);
12144c730b0SWojciech Liguzinski }
12244c730b0SWojciech Liguzinski
rdtsc_prof_init(struct rdtsc_prof * p,const char * name)12344c730b0SWojciech Liguzinski static void rdtsc_prof_init(struct rdtsc_prof *p, const char *name)
12444c730b0SWojciech Liguzinski {
12544c730b0SWojciech Liguzinski p->clk_min = (uint64_t)(-1LL);
12644c730b0SWojciech Liguzinski p->clk_max = 0;
12744c730b0SWojciech Liguzinski p->clk_avg = 0;
12844c730b0SWojciech Liguzinski p->clk_avgc = 0;
12944c730b0SWojciech Liguzinski p->name = name;
13044c730b0SWojciech Liguzinski }
13144c730b0SWojciech Liguzinski
rdtsc_prof_start(struct rdtsc_prof * p)13244c730b0SWojciech Liguzinski static inline void rdtsc_prof_start(struct rdtsc_prof *p)
13344c730b0SWojciech Liguzinski {
13444c730b0SWojciech Liguzinski p->clk_start = rte_rdtsc_precise();
13544c730b0SWojciech Liguzinski }
13644c730b0SWojciech Liguzinski
rdtsc_prof_end(struct rdtsc_prof * p)13744c730b0SWojciech Liguzinski static inline void rdtsc_prof_end(struct rdtsc_prof *p)
13844c730b0SWojciech Liguzinski {
13944c730b0SWojciech Liguzinski uint64_t clk_start = rte_rdtsc() - p->clk_start;
14044c730b0SWojciech Liguzinski
14144c730b0SWojciech Liguzinski p->clk_avgc++;
14244c730b0SWojciech Liguzinski p->clk_avg += (double) clk_start;
14344c730b0SWojciech Liguzinski
14444c730b0SWojciech Liguzinski if (clk_start > p->clk_max)
14544c730b0SWojciech Liguzinski p->clk_max = clk_start;
14644c730b0SWojciech Liguzinski if (clk_start < p->clk_min)
14744c730b0SWojciech Liguzinski p->clk_min = clk_start;
14844c730b0SWojciech Liguzinski }
14944c730b0SWojciech Liguzinski
rdtsc_prof_print(struct rdtsc_prof * p)15044c730b0SWojciech Liguzinski static void rdtsc_prof_print(struct rdtsc_prof *p)
15144c730b0SWojciech Liguzinski {
15244c730b0SWojciech Liguzinski if (p->clk_avgc > 0) {
15344c730b0SWojciech Liguzinski printf("RDTSC stats for %s: n=%" PRIu64 ", min=%" PRIu64
15444c730b0SWojciech Liguzinski ",max=%" PRIu64 ", avg=%.1f\n",
15544c730b0SWojciech Liguzinski p->name,
15644c730b0SWojciech Liguzinski p->clk_avgc,
15744c730b0SWojciech Liguzinski p->clk_min,
15844c730b0SWojciech Liguzinski p->clk_max,
15944c730b0SWojciech Liguzinski (p->clk_avg / ((double) p->clk_avgc)));
16044c730b0SWojciech Liguzinski }
16144c730b0SWojciech Liguzinski }
16244c730b0SWojciech Liguzinski
rte_pie_get_active(const struct rte_pie_config * pie_cfg,struct rte_pie * pie)16344c730b0SWojciech Liguzinski static uint16_t rte_pie_get_active(const struct rte_pie_config *pie_cfg,
16444c730b0SWojciech Liguzinski struct rte_pie *pie)
16544c730b0SWojciech Liguzinski {
16644c730b0SWojciech Liguzinski /**< Flag for activating/deactivating pie */
16744c730b0SWojciech Liguzinski RTE_SET_USED(pie_cfg);
16844c730b0SWojciech Liguzinski return pie->active;
16944c730b0SWojciech Liguzinski }
17044c730b0SWojciech Liguzinski
rte_pie_set_active(const struct rte_pie_config * pie_cfg,struct rte_pie * pie,uint16_t active)17144c730b0SWojciech Liguzinski static void rte_pie_set_active(const struct rte_pie_config *pie_cfg,
17244c730b0SWojciech Liguzinski struct rte_pie *pie,
17344c730b0SWojciech Liguzinski uint16_t active)
17444c730b0SWojciech Liguzinski {
17544c730b0SWojciech Liguzinski /**< Flag for activating/deactivating pie */
17644c730b0SWojciech Liguzinski RTE_SET_USED(pie_cfg);
17744c730b0SWojciech Liguzinski pie->active = active;
17844c730b0SWojciech Liguzinski }
17944c730b0SWojciech Liguzinski
18044c730b0SWojciech Liguzinski /**
18144c730b0SWojciech Liguzinski * Read the drop probability
18244c730b0SWojciech Liguzinski */
rte_pie_get_drop_prob(const struct rte_pie_config * pie_cfg,struct rte_pie * pie)18344c730b0SWojciech Liguzinski static double rte_pie_get_drop_prob(const struct rte_pie_config *pie_cfg,
18444c730b0SWojciech Liguzinski struct rte_pie *pie)
18544c730b0SWojciech Liguzinski {
18644c730b0SWojciech Liguzinski /**< Current packet drop probability */
18744c730b0SWojciech Liguzinski RTE_SET_USED(pie_cfg);
18844c730b0SWojciech Liguzinski return pie->drop_prob;
18944c730b0SWojciech Liguzinski }
19044c730b0SWojciech Liguzinski
rte_pie_get_avg_dq_time(const struct rte_pie_config * pie_cfg,struct rte_pie * pie)19144c730b0SWojciech Liguzinski static double rte_pie_get_avg_dq_time(const struct rte_pie_config *pie_cfg,
19244c730b0SWojciech Liguzinski struct rte_pie *pie)
19344c730b0SWojciech Liguzinski {
19444c730b0SWojciech Liguzinski /**< Current packet drop probability */
19544c730b0SWojciech Liguzinski RTE_SET_USED(pie_cfg);
19644c730b0SWojciech Liguzinski return pie->avg_dq_time;
19744c730b0SWojciech Liguzinski }
19844c730b0SWojciech Liguzinski
calc_drop_rate(uint32_t enqueued,uint32_t dropped)19944c730b0SWojciech Liguzinski static double calc_drop_rate(uint32_t enqueued, uint32_t dropped)
20044c730b0SWojciech Liguzinski {
20144c730b0SWojciech Liguzinski return (double)dropped / ((double)enqueued + (double)dropped);
20244c730b0SWojciech Liguzinski }
20344c730b0SWojciech Liguzinski
20444c730b0SWojciech Liguzinski /**
20544c730b0SWojciech Liguzinski * check if drop rate matches drop probability within tolerance
20644c730b0SWojciech Liguzinski */
check_drop_rate(double * diff,double drop_rate,double drop_prob,double tolerance)20744c730b0SWojciech Liguzinski static int check_drop_rate(double *diff, double drop_rate, double drop_prob,
20844c730b0SWojciech Liguzinski double tolerance)
20944c730b0SWojciech Liguzinski {
21044c730b0SWojciech Liguzinski double abs_diff = 0.0;
21144c730b0SWojciech Liguzinski int ret = 1;
21244c730b0SWojciech Liguzinski
21344c730b0SWojciech Liguzinski abs_diff = fabs(drop_rate - drop_prob);
21444c730b0SWojciech Liguzinski if ((int)abs_diff == 0) {
21544c730b0SWojciech Liguzinski *diff = 0.0;
21644c730b0SWojciech Liguzinski } else {
21744c730b0SWojciech Liguzinski *diff = (abs_diff / drop_prob) * 100.0;
21844c730b0SWojciech Liguzinski if (*diff > tolerance)
21944c730b0SWojciech Liguzinski ret = 0;
22044c730b0SWojciech Liguzinski }
22144c730b0SWojciech Liguzinski return ret;
22244c730b0SWojciech Liguzinski }
22344c730b0SWojciech Liguzinski
22444c730b0SWojciech Liguzinski /**
22544c730b0SWojciech Liguzinski * initialize the test rte_pie config
22644c730b0SWojciech Liguzinski */
22744c730b0SWojciech Liguzinski static enum test_result
test_rte_pie_init(struct test_config * tcfg)22844c730b0SWojciech Liguzinski test_rte_pie_init(struct test_config *tcfg)
22944c730b0SWojciech Liguzinski {
23044c730b0SWojciech Liguzinski unsigned int i = 0;
23144c730b0SWojciech Liguzinski
23244c730b0SWojciech Liguzinski tcfg->tvar->clk_freq = rte_get_timer_hz();
23344c730b0SWojciech Liguzinski init_port_ts(tcfg->tvar->clk_freq);
23444c730b0SWojciech Liguzinski
23544c730b0SWojciech Liguzinski for (i = 0; i < tcfg->tconfig->num_cfg; i++) {
23644c730b0SWojciech Liguzinski if (rte_pie_config_init(&tcfg->tconfig->pconfig[i],
23744c730b0SWojciech Liguzinski (uint16_t)tcfg->tconfig->qdelay_ref,
23844c730b0SWojciech Liguzinski (uint16_t)tcfg->tconfig->dp_update_interval[i],
23944c730b0SWojciech Liguzinski (uint16_t)tcfg->tconfig->max_burst[i],
24044c730b0SWojciech Liguzinski (uint16_t)tcfg->tconfig->tailq_th) != 0) {
24144c730b0SWojciech Liguzinski return FAIL;
24244c730b0SWojciech Liguzinski }
24344c730b0SWojciech Liguzinski }
24444c730b0SWojciech Liguzinski
24544c730b0SWojciech Liguzinski *tcfg->tqueue->qlen = 0;
24644c730b0SWojciech Liguzinski *tcfg->tvar->dropped = 0;
24744c730b0SWojciech Liguzinski *tcfg->tvar->enqueued = 0;
24844c730b0SWojciech Liguzinski
24944c730b0SWojciech Liguzinski return PASS;
25044c730b0SWojciech Liguzinski }
25144c730b0SWojciech Liguzinski
25244c730b0SWojciech Liguzinski /**
25344c730b0SWojciech Liguzinski * enqueue until actual queue size reaches target level
25444c730b0SWojciech Liguzinski */
25544c730b0SWojciech Liguzinski static int
increase_qsize(struct rte_pie_config * pie_cfg,struct rte_pie * pie,uint32_t * qlen,uint32_t pkt_len,uint32_t attempts)25644c730b0SWojciech Liguzinski increase_qsize(struct rte_pie_config *pie_cfg,
25744c730b0SWojciech Liguzinski struct rte_pie *pie,
25844c730b0SWojciech Liguzinski uint32_t *qlen,
25944c730b0SWojciech Liguzinski uint32_t pkt_len,
26044c730b0SWojciech Liguzinski uint32_t attempts)
26144c730b0SWojciech Liguzinski {
26244c730b0SWojciech Liguzinski uint32_t i = 0;
26344c730b0SWojciech Liguzinski
26444c730b0SWojciech Liguzinski for (i = 0; i < attempts; i++) {
26544c730b0SWojciech Liguzinski int ret = 0;
26644c730b0SWojciech Liguzinski
26744c730b0SWojciech Liguzinski /**
26844c730b0SWojciech Liguzinski * enqueue
26944c730b0SWojciech Liguzinski */
27044c730b0SWojciech Liguzinski ret = rte_pie_enqueue(pie_cfg, pie, *qlen, pkt_len, get_port_ts());
27144c730b0SWojciech Liguzinski /**
27244c730b0SWojciech Liguzinski * check if target actual queue size has been reached
27344c730b0SWojciech Liguzinski */
27444c730b0SWojciech Liguzinski if (ret == 0)
27544c730b0SWojciech Liguzinski return 0;
27644c730b0SWojciech Liguzinski }
27744c730b0SWojciech Liguzinski /**
27844c730b0SWojciech Liguzinski * no success
27944c730b0SWojciech Liguzinski */
28044c730b0SWojciech Liguzinski return -1;
28144c730b0SWojciech Liguzinski }
28244c730b0SWojciech Liguzinski
28344c730b0SWojciech Liguzinski /**
28444c730b0SWojciech Liguzinski * functional test enqueue/dequeue packets
28544c730b0SWojciech Liguzinski */
28644c730b0SWojciech Liguzinski static void
enqueue_dequeue_func(struct rte_pie_config * pie_cfg,struct rte_pie * pie,uint32_t * qlen,uint32_t num_ops,uint32_t * enqueued,uint32_t * dropped)28744c730b0SWojciech Liguzinski enqueue_dequeue_func(struct rte_pie_config *pie_cfg,
28844c730b0SWojciech Liguzinski struct rte_pie *pie,
28944c730b0SWojciech Liguzinski uint32_t *qlen,
29044c730b0SWojciech Liguzinski uint32_t num_ops,
29144c730b0SWojciech Liguzinski uint32_t *enqueued,
29244c730b0SWojciech Liguzinski uint32_t *dropped)
29344c730b0SWojciech Liguzinski {
29444c730b0SWojciech Liguzinski uint32_t i = 0;
29544c730b0SWojciech Liguzinski
29644c730b0SWojciech Liguzinski for (i = 0; i < num_ops; i++) {
29744c730b0SWojciech Liguzinski int ret = 0;
29844c730b0SWojciech Liguzinski
29944c730b0SWojciech Liguzinski /**
30044c730b0SWojciech Liguzinski * enqueue
30144c730b0SWojciech Liguzinski */
30244c730b0SWojciech Liguzinski ret = rte_pie_enqueue(pie_cfg, pie, *qlen, sizeof(uint32_t),
30344c730b0SWojciech Liguzinski get_port_ts());
30444c730b0SWojciech Liguzinski if (ret == 0)
30544c730b0SWojciech Liguzinski (*enqueued)++;
30644c730b0SWojciech Liguzinski else
30744c730b0SWojciech Liguzinski (*dropped)++;
30844c730b0SWojciech Liguzinski }
30944c730b0SWojciech Liguzinski }
31044c730b0SWojciech Liguzinski
31144c730b0SWojciech Liguzinski /**
31244c730b0SWojciech Liguzinski * setup default values for the Functional test structures
31344c730b0SWojciech Liguzinski */
31444c730b0SWojciech Liguzinski static struct rte_pie_config ft_wpconfig[1];
31544c730b0SWojciech Liguzinski static struct rte_pie ft_rtdata[1];
31644c730b0SWojciech Liguzinski static uint32_t ft_q[] = {0};
31744c730b0SWojciech Liguzinski static uint32_t ft_dropped[] = {0};
31844c730b0SWojciech Liguzinski static uint32_t ft_enqueued[] = {0};
31944c730b0SWojciech Liguzinski static uint16_t ft_max_burst[] = {64};
32044c730b0SWojciech Liguzinski static uint16_t ft_dp_update_interval[] = {150};
32144c730b0SWojciech Liguzinski
32244c730b0SWojciech Liguzinski static struct test_rte_pie_config ft_tconfig = {
32344c730b0SWojciech Liguzinski .pconfig = ft_wpconfig,
32444c730b0SWojciech Liguzinski .num_cfg = RTE_DIM(ft_wpconfig),
32544c730b0SWojciech Liguzinski .qdelay_ref = 15,
32644c730b0SWojciech Liguzinski .dp_update_interval = ft_dp_update_interval,
32744c730b0SWojciech Liguzinski .max_burst = ft_max_burst,
32844c730b0SWojciech Liguzinski .tailq_th = 15,
32944c730b0SWojciech Liguzinski };
33044c730b0SWojciech Liguzinski
33144c730b0SWojciech Liguzinski static struct test_queue ft_tqueue = {
33244c730b0SWojciech Liguzinski .pdata_in = ft_rtdata,
33344c730b0SWojciech Liguzinski .num_queues = RTE_DIM(ft_rtdata),
33444c730b0SWojciech Liguzinski .qlen = ft_q,
33544c730b0SWojciech Liguzinski .q_ramp_up = 10,
33644c730b0SWojciech Liguzinski .drop_tolerance = 0,
33744c730b0SWojciech Liguzinski };
33844c730b0SWojciech Liguzinski
33944c730b0SWojciech Liguzinski static struct test_var ft_tvar = {
34044c730b0SWojciech Liguzinski .num_iterations = 0,
34144c730b0SWojciech Liguzinski .num_ops = 10000,
34244c730b0SWojciech Liguzinski .clk_freq = 0,
34344c730b0SWojciech Liguzinski .dropped = ft_dropped,
34444c730b0SWojciech Liguzinski .enqueued = ft_enqueued,
34544c730b0SWojciech Liguzinski };
34644c730b0SWojciech Liguzinski
34744c730b0SWojciech Liguzinski /**
34844c730b0SWojciech Liguzinski * Test F1: functional test 1
34944c730b0SWojciech Liguzinski */
35044c730b0SWojciech Liguzinski static uint32_t ft_tlevels[] = {6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 66,
35144c730b0SWojciech Liguzinski 72, 78, 84, 90, 96, 102, 108, 114, 120, 126, 132, 138, 144};
35244c730b0SWojciech Liguzinski
35344c730b0SWojciech Liguzinski static struct test_config func_test_config1 = {
35444c730b0SWojciech Liguzinski .ifname = "functional test interface",
35544c730b0SWojciech Liguzinski .msg = "functional test : use one pie configuration\n\n",
35644c730b0SWojciech Liguzinski .htxt = " "
35744c730b0SWojciech Liguzinski "drop probability "
35844c730b0SWojciech Liguzinski "enqueued "
35944c730b0SWojciech Liguzinski "dropped "
36044c730b0SWojciech Liguzinski "drop prob % "
36144c730b0SWojciech Liguzinski "drop rate % "
36244c730b0SWojciech Liguzinski "diff % "
36344c730b0SWojciech Liguzinski "tolerance % "
36444c730b0SWojciech Liguzinski "active "
36544c730b0SWojciech Liguzinski "\n",
36644c730b0SWojciech Liguzinski .tconfig = &ft_tconfig,
36744c730b0SWojciech Liguzinski .tqueue = &ft_tqueue,
36844c730b0SWojciech Liguzinski .tvar = &ft_tvar,
36944c730b0SWojciech Liguzinski .tlevel = ft_tlevels,
37044c730b0SWojciech Liguzinski };
37144c730b0SWojciech Liguzinski
func_test1(struct test_config * tcfg)37244c730b0SWojciech Liguzinski static enum test_result func_test1(struct test_config *tcfg)
37344c730b0SWojciech Liguzinski {
37444c730b0SWojciech Liguzinski enum test_result result = PASS;
37544c730b0SWojciech Liguzinski uint32_t i = 0;
37644c730b0SWojciech Liguzinski
37744c730b0SWojciech Liguzinski printf("%s", tcfg->msg);
37844c730b0SWojciech Liguzinski
37944c730b0SWojciech Liguzinski if (test_rte_pie_init(tcfg) != PASS) {
38044c730b0SWojciech Liguzinski result = FAIL;
38144c730b0SWojciech Liguzinski goto out;
38244c730b0SWojciech Liguzinski }
38344c730b0SWojciech Liguzinski
38444c730b0SWojciech Liguzinski printf("%s", tcfg->htxt);
38544c730b0SWojciech Liguzinski
38644c730b0SWojciech Liguzinski /**
38744c730b0SWojciech Liguzinski * reset rte_pie run-time data
38844c730b0SWojciech Liguzinski */
38944c730b0SWojciech Liguzinski rte_pie_rt_data_init(tcfg->tqueue->pdata_in);
39044c730b0SWojciech Liguzinski rte_pie_set_active(NULL, tcfg->tqueue->pdata_in, 1);
39144c730b0SWojciech Liguzinski *tcfg->tvar->enqueued = 0;
39244c730b0SWojciech Liguzinski *tcfg->tvar->dropped = 0;
39344c730b0SWojciech Liguzinski
39444c730b0SWojciech Liguzinski if (increase_qsize(&tcfg->tconfig->pconfig[i],
39544c730b0SWojciech Liguzinski tcfg->tqueue->pdata_in,
39644c730b0SWojciech Liguzinski tcfg->tqueue->qlen,
39744c730b0SWojciech Liguzinski tcfg->tlevel[i],
39844c730b0SWojciech Liguzinski tcfg->tqueue->q_ramp_up) != 0) {
39944c730b0SWojciech Liguzinski fprintf(stderr, "Fail: increase qsize\n");
40044c730b0SWojciech Liguzinski result = FAIL;
40144c730b0SWojciech Liguzinski goto out;
40244c730b0SWojciech Liguzinski }
40344c730b0SWojciech Liguzinski
40444c730b0SWojciech Liguzinski for (i = 0; i < RTE_DIM(ft_tlevels); i++) {
40544c730b0SWojciech Liguzinski const char *label = NULL;
40644c730b0SWojciech Liguzinski uint16_t prob = 0;
40744c730b0SWojciech Liguzinski uint16_t active = 0;
40844c730b0SWojciech Liguzinski double drop_rate = 1.0;
40944c730b0SWojciech Liguzinski double drop_prob = 0.0;
41044c730b0SWojciech Liguzinski double diff = 0.0;
41144c730b0SWojciech Liguzinski
41244c730b0SWojciech Liguzinski enqueue_dequeue_func(&tcfg->tconfig->pconfig[i],
41344c730b0SWojciech Liguzinski tcfg->tqueue->pdata_in,
41444c730b0SWojciech Liguzinski tcfg->tqueue->qlen,
41544c730b0SWojciech Liguzinski tcfg->tvar->num_ops,
41644c730b0SWojciech Liguzinski tcfg->tvar->enqueued,
41744c730b0SWojciech Liguzinski tcfg->tvar->dropped);
41844c730b0SWojciech Liguzinski
41944c730b0SWojciech Liguzinski drop_rate = calc_drop_rate(*tcfg->tvar->enqueued,
42044c730b0SWojciech Liguzinski *tcfg->tvar->dropped);
42144c730b0SWojciech Liguzinski drop_prob = rte_pie_get_drop_prob(NULL, tcfg->tqueue->pdata_in);
42244c730b0SWojciech Liguzinski
42344c730b0SWojciech Liguzinski if (drop_prob != 0) {
42444c730b0SWojciech Liguzinski fprintf(stderr, "Fail: check drop prob\n");
42544c730b0SWojciech Liguzinski result = FAIL;
42644c730b0SWojciech Liguzinski }
42744c730b0SWojciech Liguzinski
42844c730b0SWojciech Liguzinski if (drop_rate != 0) {
42944c730b0SWojciech Liguzinski fprintf(stderr, "Fail: check drop rate\n");
43044c730b0SWojciech Liguzinski result = FAIL;
43144c730b0SWojciech Liguzinski }
43244c730b0SWojciech Liguzinski
43344c730b0SWojciech Liguzinski label = "Summary ";
43444c730b0SWojciech Liguzinski active = rte_pie_get_active(NULL, tcfg->tqueue->pdata_in);
43544c730b0SWojciech Liguzinski printf("%s%-16u%-12u%-12u%-12.4lf%-12.4lf%-12.4lf%-12.4lf%-8i\n",
43644c730b0SWojciech Liguzinski label, prob, *tcfg->tvar->enqueued, *tcfg->tvar->dropped,
43744c730b0SWojciech Liguzinski drop_prob * 100.0, drop_rate * 100.0, diff,
43844c730b0SWojciech Liguzinski (double)tcfg->tqueue->drop_tolerance, active);
43944c730b0SWojciech Liguzinski }
44044c730b0SWojciech Liguzinski out:
44144c730b0SWojciech Liguzinski return result;
44244c730b0SWojciech Liguzinski }
44344c730b0SWojciech Liguzinski
44444c730b0SWojciech Liguzinski /**
44544c730b0SWojciech Liguzinski * Test F2: functional test 2
44644c730b0SWojciech Liguzinski */
44744c730b0SWojciech Liguzinski static uint32_t ft2_tlevel[] = {127};
44844c730b0SWojciech Liguzinski static uint16_t ft2_max_burst[] = {1, 2, 8, 16, 32, 64, 128, 256, 512, 1024};
44944c730b0SWojciech Liguzinski static uint16_t ft2_dp_update_interval[] = {
45044c730b0SWojciech Liguzinski 10, 20, 50, 150, 300, 600, 900, 1200, 1500, 3000};
45144c730b0SWojciech Liguzinski static struct rte_pie_config ft2_pconfig[10];
45244c730b0SWojciech Liguzinski
45344c730b0SWojciech Liguzinski static struct test_rte_pie_config ft2_tconfig = {
45444c730b0SWojciech Liguzinski .pconfig = ft2_pconfig,
45544c730b0SWojciech Liguzinski .num_cfg = RTE_DIM(ft2_pconfig),
45644c730b0SWojciech Liguzinski .qdelay_ref = 15,
45744c730b0SWojciech Liguzinski .dp_update_interval = ft2_dp_update_interval,
45844c730b0SWojciech Liguzinski .max_burst = ft2_max_burst,
45944c730b0SWojciech Liguzinski .tailq_th = 15,
46044c730b0SWojciech Liguzinski };
46144c730b0SWojciech Liguzinski
46244c730b0SWojciech Liguzinski static struct test_config func_test_config2 = {
46344c730b0SWojciech Liguzinski .ifname = "functional test 2 interface",
46444c730b0SWojciech Liguzinski .msg = "functional test 2 : use several PIE configurations,\n"
46544c730b0SWojciech Liguzinski " compare drop rate to drop probability\n\n",
46644c730b0SWojciech Liguzinski .htxt = "PIE config "
46744c730b0SWojciech Liguzinski "avg queue size "
46844c730b0SWojciech Liguzinski "enqueued "
46944c730b0SWojciech Liguzinski "dropped "
47044c730b0SWojciech Liguzinski "drop prob % "
47144c730b0SWojciech Liguzinski "drop rate % "
47244c730b0SWojciech Liguzinski "diff % "
47344c730b0SWojciech Liguzinski "tolerance % "
47444c730b0SWojciech Liguzinski "\n",
47544c730b0SWojciech Liguzinski .tconfig = &ft2_tconfig,
47644c730b0SWojciech Liguzinski .tqueue = &ft_tqueue,
47744c730b0SWojciech Liguzinski .tvar = &ft_tvar,
47844c730b0SWojciech Liguzinski .tlevel = ft2_tlevel,
47944c730b0SWojciech Liguzinski };
48044c730b0SWojciech Liguzinski
func_test2(struct test_config * tcfg)48144c730b0SWojciech Liguzinski static enum test_result func_test2(struct test_config *tcfg)
48244c730b0SWojciech Liguzinski {
48344c730b0SWojciech Liguzinski enum test_result result = PASS;
48444c730b0SWojciech Liguzinski uint32_t i = 0;
48544c730b0SWojciech Liguzinski
48644c730b0SWojciech Liguzinski printf("%s", tcfg->msg);
48744c730b0SWojciech Liguzinski
48844c730b0SWojciech Liguzinski printf("%s", tcfg->htxt);
48944c730b0SWojciech Liguzinski
49044c730b0SWojciech Liguzinski for (i = 0; i < tcfg->tconfig->num_cfg; i++) {
49144c730b0SWojciech Liguzinski uint32_t avg = 0;
49244c730b0SWojciech Liguzinski double drop_rate = 0.0;
49344c730b0SWojciech Liguzinski double drop_prob = 0.0;
49444c730b0SWojciech Liguzinski double diff = 0.0;
49544c730b0SWojciech Liguzinski
49644c730b0SWojciech Liguzinski if (test_rte_pie_init(tcfg) != PASS) {
49744c730b0SWojciech Liguzinski result = FAIL;
49844c730b0SWojciech Liguzinski goto out;
49944c730b0SWojciech Liguzinski }
50044c730b0SWojciech Liguzinski
50144c730b0SWojciech Liguzinski rte_pie_rt_data_init(tcfg->tqueue->pdata_in);
50244c730b0SWojciech Liguzinski rte_pie_set_active(NULL, tcfg->tqueue->pdata_in, 1);
50344c730b0SWojciech Liguzinski *tcfg->tvar->enqueued = 0;
50444c730b0SWojciech Liguzinski *tcfg->tvar->dropped = 0;
50544c730b0SWojciech Liguzinski
50644c730b0SWojciech Liguzinski if (increase_qsize(&tcfg->tconfig->pconfig[i],
50744c730b0SWojciech Liguzinski tcfg->tqueue->pdata_in,
50844c730b0SWojciech Liguzinski tcfg->tqueue->qlen,
50944c730b0SWojciech Liguzinski *tcfg->tlevel,
51044c730b0SWojciech Liguzinski tcfg->tqueue->q_ramp_up) != 0) {
51144c730b0SWojciech Liguzinski result = FAIL;
51244c730b0SWojciech Liguzinski goto out;
51344c730b0SWojciech Liguzinski }
51444c730b0SWojciech Liguzinski
51544c730b0SWojciech Liguzinski enqueue_dequeue_func(&tcfg->tconfig->pconfig[i],
51644c730b0SWojciech Liguzinski tcfg->tqueue->pdata_in,
51744c730b0SWojciech Liguzinski tcfg->tqueue->qlen,
51844c730b0SWojciech Liguzinski tcfg->tvar->num_ops,
51944c730b0SWojciech Liguzinski tcfg->tvar->enqueued,
52044c730b0SWojciech Liguzinski tcfg->tvar->dropped);
52144c730b0SWojciech Liguzinski
52244c730b0SWojciech Liguzinski avg = rte_pie_get_avg_dq_time(NULL, tcfg->tqueue->pdata_in);
52344c730b0SWojciech Liguzinski
52444c730b0SWojciech Liguzinski drop_rate = calc_drop_rate(*tcfg->tvar->enqueued,
52544c730b0SWojciech Liguzinski *tcfg->tvar->dropped);
52644c730b0SWojciech Liguzinski drop_prob = rte_pie_get_drop_prob(NULL, tcfg->tqueue->pdata_in);
52744c730b0SWojciech Liguzinski
52844c730b0SWojciech Liguzinski if (!check_drop_rate(&diff, drop_rate, drop_prob,
52944c730b0SWojciech Liguzinski (double)tcfg->tqueue->drop_tolerance)) {
53044c730b0SWojciech Liguzinski fprintf(stderr, "Fail: drop rate outside tolerance\n");
53144c730b0SWojciech Liguzinski result = FAIL;
53244c730b0SWojciech Liguzinski }
53344c730b0SWojciech Liguzinski
53444c730b0SWojciech Liguzinski printf("%-15u%-15u%-15u%-15u%-15.4lf%-15.4lf%-15.4lf%-15.4lf\n",
53544c730b0SWojciech Liguzinski i, avg, *tcfg->tvar->enqueued, *tcfg->tvar->dropped,
53644c730b0SWojciech Liguzinski drop_prob * 100.0, drop_rate * 100.0, diff,
53744c730b0SWojciech Liguzinski (double)tcfg->tqueue->drop_tolerance);
53844c730b0SWojciech Liguzinski }
53944c730b0SWojciech Liguzinski out:
54044c730b0SWojciech Liguzinski return result;
54144c730b0SWojciech Liguzinski }
54244c730b0SWojciech Liguzinski
54344c730b0SWojciech Liguzinski static uint32_t ft3_qlen[] = {100};
54444c730b0SWojciech Liguzinski
54544c730b0SWojciech Liguzinski static struct test_rte_pie_config ft3_tconfig = {
54644c730b0SWojciech Liguzinski .pconfig = ft_wpconfig,
54744c730b0SWojciech Liguzinski .num_cfg = RTE_DIM(ft_wpconfig),
54844c730b0SWojciech Liguzinski .qdelay_ref = 15,
54944c730b0SWojciech Liguzinski .dp_update_interval = ft_dp_update_interval,
55044c730b0SWojciech Liguzinski .max_burst = ft_max_burst,
55144c730b0SWojciech Liguzinski .tailq_th = 15,
55244c730b0SWojciech Liguzinski };
55344c730b0SWojciech Liguzinski
55444c730b0SWojciech Liguzinski static struct test_queue ft3_tqueue = {
55544c730b0SWojciech Liguzinski .pdata_in = ft_rtdata,
55644c730b0SWojciech Liguzinski .num_queues = RTE_DIM(ft_rtdata),
55744c730b0SWojciech Liguzinski .qlen = ft3_qlen,
55844c730b0SWojciech Liguzinski .q_ramp_up = 10,
55944c730b0SWojciech Liguzinski .drop_tolerance = 0,
56044c730b0SWojciech Liguzinski };
56144c730b0SWojciech Liguzinski
56244c730b0SWojciech Liguzinski static struct test_var ft3_tvar = {
56344c730b0SWojciech Liguzinski .num_iterations = 0,
56444c730b0SWojciech Liguzinski .num_ops = 10000,
56544c730b0SWojciech Liguzinski .clk_freq = 0,
56644c730b0SWojciech Liguzinski .dropped = ft_dropped,
56744c730b0SWojciech Liguzinski .enqueued = ft_enqueued,
56844c730b0SWojciech Liguzinski };
56944c730b0SWojciech Liguzinski
57044c730b0SWojciech Liguzinski /**
57144c730b0SWojciech Liguzinski * Test F3: functional test 3
57244c730b0SWojciech Liguzinski */
57344c730b0SWojciech Liguzinski static uint32_t ft3_tlevels[] = {64, 127, 222};
57444c730b0SWojciech Liguzinski
57544c730b0SWojciech Liguzinski static struct test_config func_test_config3 = {
57644c730b0SWojciech Liguzinski .ifname = "functional test interface",
57744c730b0SWojciech Liguzinski .msg = "functional test 2 : use one pie configuration\n"
57844c730b0SWojciech Liguzinski "using non zero qlen\n\n",
57944c730b0SWojciech Liguzinski .htxt = " "
58044c730b0SWojciech Liguzinski "drop probability "
58144c730b0SWojciech Liguzinski "enqueued "
58244c730b0SWojciech Liguzinski "dropped "
58344c730b0SWojciech Liguzinski "drop prob % "
58444c730b0SWojciech Liguzinski "drop rate % "
58544c730b0SWojciech Liguzinski "diff % "
58644c730b0SWojciech Liguzinski "tolerance % "
58744c730b0SWojciech Liguzinski "active "
58844c730b0SWojciech Liguzinski "\n",
58944c730b0SWojciech Liguzinski .tconfig = &ft3_tconfig,
59044c730b0SWojciech Liguzinski .tqueue = &ft3_tqueue,
59144c730b0SWojciech Liguzinski .tvar = &ft3_tvar,
59244c730b0SWojciech Liguzinski .tlevel = ft3_tlevels,
59344c730b0SWojciech Liguzinski };
59444c730b0SWojciech Liguzinski
func_test3(struct test_config * tcfg)59544c730b0SWojciech Liguzinski static enum test_result func_test3(struct test_config *tcfg)
59644c730b0SWojciech Liguzinski {
59744c730b0SWojciech Liguzinski enum test_result result = PASS;
59844c730b0SWojciech Liguzinski uint32_t i = 0;
59944c730b0SWojciech Liguzinski
60044c730b0SWojciech Liguzinski printf("%s", tcfg->msg);
60144c730b0SWojciech Liguzinski
60244c730b0SWojciech Liguzinski if (test_rte_pie_init(tcfg) != PASS) {
60344c730b0SWojciech Liguzinski result = FAIL;
60444c730b0SWojciech Liguzinski goto out;
60544c730b0SWojciech Liguzinski }
60644c730b0SWojciech Liguzinski
60744c730b0SWojciech Liguzinski printf("%s", tcfg->htxt);
60844c730b0SWojciech Liguzinski
60944c730b0SWojciech Liguzinski /**
61044c730b0SWojciech Liguzinski * reset rte_pie run-time data
61144c730b0SWojciech Liguzinski */
61244c730b0SWojciech Liguzinski rte_pie_rt_data_init(tcfg->tqueue->pdata_in);
61344c730b0SWojciech Liguzinski rte_pie_set_active(NULL, tcfg->tqueue->pdata_in, 1);
61444c730b0SWojciech Liguzinski *tcfg->tvar->enqueued = 0;
61544c730b0SWojciech Liguzinski *tcfg->tvar->dropped = 0;
61644c730b0SWojciech Liguzinski
61744c730b0SWojciech Liguzinski if (increase_qsize(&tcfg->tconfig->pconfig[i],
61844c730b0SWojciech Liguzinski tcfg->tqueue->pdata_in,
61944c730b0SWojciech Liguzinski tcfg->tqueue->qlen,
62044c730b0SWojciech Liguzinski tcfg->tlevel[i],
62144c730b0SWojciech Liguzinski tcfg->tqueue->q_ramp_up) != 0) {
62244c730b0SWojciech Liguzinski fprintf(stderr, "Fail: increase qsize\n");
62344c730b0SWojciech Liguzinski result = FAIL;
62444c730b0SWojciech Liguzinski goto out;
62544c730b0SWojciech Liguzinski }
62644c730b0SWojciech Liguzinski
62744c730b0SWojciech Liguzinski for (i = 0; i < RTE_DIM(ft_tlevels); i++) {
62844c730b0SWojciech Liguzinski const char *label = NULL;
62944c730b0SWojciech Liguzinski uint16_t prob = 0;
63044c730b0SWojciech Liguzinski uint16_t active = 0;
63144c730b0SWojciech Liguzinski double drop_rate = 1.0;
63244c730b0SWojciech Liguzinski double drop_prob = 0.0;
63344c730b0SWojciech Liguzinski double diff = 0.0;
63444c730b0SWojciech Liguzinski
63544c730b0SWojciech Liguzinski enqueue_dequeue_func(&tcfg->tconfig->pconfig[i],
63644c730b0SWojciech Liguzinski tcfg->tqueue->pdata_in,
63744c730b0SWojciech Liguzinski tcfg->tqueue->qlen,
63844c730b0SWojciech Liguzinski tcfg->tvar->num_ops,
63944c730b0SWojciech Liguzinski tcfg->tvar->enqueued,
64044c730b0SWojciech Liguzinski tcfg->tvar->dropped);
64144c730b0SWojciech Liguzinski
64244c730b0SWojciech Liguzinski drop_rate = calc_drop_rate(*tcfg->tvar->enqueued,
64344c730b0SWojciech Liguzinski *tcfg->tvar->dropped);
64444c730b0SWojciech Liguzinski drop_prob = rte_pie_get_drop_prob(NULL, tcfg->tqueue->pdata_in);
64544c730b0SWojciech Liguzinski
64644c730b0SWojciech Liguzinski if (drop_prob != 0) {
64744c730b0SWojciech Liguzinski fprintf(stderr, "Fail: check drop prob\n");
64844c730b0SWojciech Liguzinski result = FAIL;
64944c730b0SWojciech Liguzinski }
65044c730b0SWojciech Liguzinski
65144c730b0SWojciech Liguzinski if (drop_rate != 0) {
65244c730b0SWojciech Liguzinski fprintf(stderr, "Fail: check drop rate\n");
65344c730b0SWojciech Liguzinski result = FAIL;
65444c730b0SWojciech Liguzinski }
65544c730b0SWojciech Liguzinski
65644c730b0SWojciech Liguzinski label = "Summary ";
65744c730b0SWojciech Liguzinski active = rte_pie_get_active(NULL, tcfg->tqueue->pdata_in);
65844c730b0SWojciech Liguzinski printf("%s%-16u%-12u%-12u%-12.4lf%-12.4lf%-12.4lf%-12.4lf%-8i\n",
65944c730b0SWojciech Liguzinski label, prob, *tcfg->tvar->enqueued, *tcfg->tvar->dropped,
66044c730b0SWojciech Liguzinski drop_prob * 100.0, drop_rate * 100.0, diff,
66144c730b0SWojciech Liguzinski (double)tcfg->tqueue->drop_tolerance, active);
66244c730b0SWojciech Liguzinski }
66344c730b0SWojciech Liguzinski out:
66444c730b0SWojciech Liguzinski return result;
66544c730b0SWojciech Liguzinski }
66644c730b0SWojciech Liguzinski
66744c730b0SWojciech Liguzinski /**
66844c730b0SWojciech Liguzinski * setup default values for the Performance test structures
66944c730b0SWojciech Liguzinski */
67044c730b0SWojciech Liguzinski static struct rte_pie_config pt_wrconfig[1];
67144c730b0SWojciech Liguzinski static struct rte_pie pt_rtdata[1];
67244c730b0SWojciech Liguzinski static struct rte_pie pt_wtdata[1];
67344c730b0SWojciech Liguzinski static uint32_t pt_q[] = {0};
67444c730b0SWojciech Liguzinski static uint32_t pt_dropped[] = {0};
67544c730b0SWojciech Liguzinski static uint32_t pt_enqueued[] = {0};
67644c730b0SWojciech Liguzinski static uint32_t pt_dequeued[] = {0};
67744c730b0SWojciech Liguzinski static uint16_t pt_max_burst[] = {64};
67844c730b0SWojciech Liguzinski static uint16_t pt_dp_update_interval[] = {150};
67944c730b0SWojciech Liguzinski
68044c730b0SWojciech Liguzinski static struct test_rte_pie_config pt_tconfig = {
68144c730b0SWojciech Liguzinski .pconfig = pt_wrconfig,
68244c730b0SWojciech Liguzinski .num_cfg = RTE_DIM(pt_wrconfig),
68344c730b0SWojciech Liguzinski .qdelay_ref = 15,
68444c730b0SWojciech Liguzinski .dp_update_interval = pt_dp_update_interval,
68544c730b0SWojciech Liguzinski .max_burst = pt_max_burst,
68644c730b0SWojciech Liguzinski .tailq_th = 150,
68744c730b0SWojciech Liguzinski };
68844c730b0SWojciech Liguzinski
68944c730b0SWojciech Liguzinski static struct test_queue pt_tqueue = {
69044c730b0SWojciech Liguzinski .pdata_in = pt_rtdata,
69144c730b0SWojciech Liguzinski .num_queues = RTE_DIM(pt_rtdata),
69244c730b0SWojciech Liguzinski .qlen = pt_q,
69344c730b0SWojciech Liguzinski .q_ramp_up = 1000000,
69444c730b0SWojciech Liguzinski .drop_tolerance = 0, /* 0 percent */
69544c730b0SWojciech Liguzinski };
69644c730b0SWojciech Liguzinski
69744c730b0SWojciech Liguzinski static struct test_rte_pie_config pt_tconfig2 = {
69844c730b0SWojciech Liguzinski .pconfig = pt_wrconfig,
69944c730b0SWojciech Liguzinski .num_cfg = RTE_DIM(pt_wrconfig),
70044c730b0SWojciech Liguzinski .qdelay_ref = 15,
70144c730b0SWojciech Liguzinski .dp_update_interval = pt_dp_update_interval,
70244c730b0SWojciech Liguzinski .max_burst = pt_max_burst,
70344c730b0SWojciech Liguzinski .tailq_th = 150,
70444c730b0SWojciech Liguzinski };
70544c730b0SWojciech Liguzinski
70644c730b0SWojciech Liguzinski static struct test_queue pt_tqueue2 = {
70744c730b0SWojciech Liguzinski .pdata_in = pt_rtdata,
70844c730b0SWojciech Liguzinski .pdata_out = pt_wtdata,
70944c730b0SWojciech Liguzinski .num_queues = RTE_DIM(pt_rtdata),
71044c730b0SWojciech Liguzinski .qlen = pt_q,
71144c730b0SWojciech Liguzinski .q_ramp_up = 1000000,
71244c730b0SWojciech Liguzinski .drop_tolerance = 0, /* 0 percent */
71344c730b0SWojciech Liguzinski };
71444c730b0SWojciech Liguzinski
71544c730b0SWojciech Liguzinski /**
71644c730b0SWojciech Liguzinski * enqueue/dequeue packets
71744c730b0SWojciech Liguzinski * aka
71844c730b0SWojciech Liguzinski * rte_sched_port_enqueue(port, in_mbufs, 10);
71944c730b0SWojciech Liguzinski * rte_sched_port_dequeue(port, out_mbufs, 10);
72044c730b0SWojciech Liguzinski */
enqueue_dequeue_perf(struct rte_pie_config * pie_cfg,struct rte_pie * pie_in,struct rte_pie * pie_out,uint32_t * qlen,uint32_t num_ops,uint32_t * enqueued,uint32_t * dropped,uint32_t * dequeued,struct rdtsc_prof * prof)72144c730b0SWojciech Liguzinski static void enqueue_dequeue_perf(struct rte_pie_config *pie_cfg,
72244c730b0SWojciech Liguzinski struct rte_pie *pie_in,
72344c730b0SWojciech Liguzinski struct rte_pie *pie_out,
72444c730b0SWojciech Liguzinski uint32_t *qlen,
72544c730b0SWojciech Liguzinski uint32_t num_ops,
72644c730b0SWojciech Liguzinski uint32_t *enqueued,
72744c730b0SWojciech Liguzinski uint32_t *dropped,
72844c730b0SWojciech Liguzinski uint32_t *dequeued,
72944c730b0SWojciech Liguzinski struct rdtsc_prof *prof)
73044c730b0SWojciech Liguzinski {
73144c730b0SWojciech Liguzinski uint32_t i = 0;
73244c730b0SWojciech Liguzinski
73344c730b0SWojciech Liguzinski if (pie_cfg == NULL) {
73444c730b0SWojciech Liguzinski printf("%s: Error: PIE configuration cannot be empty.\n", __func__);
73544c730b0SWojciech Liguzinski return;
73644c730b0SWojciech Liguzinski }
73744c730b0SWojciech Liguzinski
73844c730b0SWojciech Liguzinski if (pie_in == NULL) {
73944c730b0SWojciech Liguzinski printf("%s: Error: PIE enqueue data cannot be empty.\n", __func__);
74044c730b0SWojciech Liguzinski return;
74144c730b0SWojciech Liguzinski }
74244c730b0SWojciech Liguzinski
74344c730b0SWojciech Liguzinski for (i = 0; i < num_ops; i++) {
74444c730b0SWojciech Liguzinski uint64_t ts = 0;
74544c730b0SWojciech Liguzinski int ret = 0;
74644c730b0SWojciech Liguzinski
74744c730b0SWojciech Liguzinski /**
74844c730b0SWojciech Liguzinski * enqueue
74944c730b0SWojciech Liguzinski */
75044c730b0SWojciech Liguzinski ts = get_port_ts();
75144c730b0SWojciech Liguzinski rdtsc_prof_start(prof);
75244c730b0SWojciech Liguzinski ret = rte_pie_enqueue(pie_cfg, pie_in, *qlen,
75344c730b0SWojciech Liguzinski 1000*sizeof(uint32_t), ts);
75444c730b0SWojciech Liguzinski rdtsc_prof_end(prof);
75544c730b0SWojciech Liguzinski
75644c730b0SWojciech Liguzinski if (ret == 0)
75744c730b0SWojciech Liguzinski (*enqueued)++;
75844c730b0SWojciech Liguzinski else
75944c730b0SWojciech Liguzinski (*dropped)++;
76044c730b0SWojciech Liguzinski
76144c730b0SWojciech Liguzinski if (pie_out != NULL) {
76244c730b0SWojciech Liguzinski ts = get_port_ts();
76344c730b0SWojciech Liguzinski rdtsc_prof_start(prof);
76444c730b0SWojciech Liguzinski rte_pie_dequeue(pie_out, 1000*sizeof(uint32_t), ts);
76544c730b0SWojciech Liguzinski rdtsc_prof_end(prof);
76644c730b0SWojciech Liguzinski
76744c730b0SWojciech Liguzinski (*dequeued)++;
76844c730b0SWojciech Liguzinski }
76944c730b0SWojciech Liguzinski }
77044c730b0SWojciech Liguzinski }
77144c730b0SWojciech Liguzinski
77244c730b0SWojciech Liguzinski /**
77344c730b0SWojciech Liguzinski * Setup test structures for tests P1
77444c730b0SWojciech Liguzinski * performance tests 1
77544c730b0SWojciech Liguzinski */
77644c730b0SWojciech Liguzinski static uint32_t pt1_tlevel[] = {80};
77744c730b0SWojciech Liguzinski
77844c730b0SWojciech Liguzinski static struct test_var perf1_tvar = {
77944c730b0SWojciech Liguzinski .num_iterations = 0,
78044c730b0SWojciech Liguzinski .num_ops = 30000,
78144c730b0SWojciech Liguzinski .clk_freq = 0,
78244c730b0SWojciech Liguzinski .dropped = pt_dropped,
78344c730b0SWojciech Liguzinski .enqueued = pt_enqueued
78444c730b0SWojciech Liguzinski };
78544c730b0SWojciech Liguzinski
78644c730b0SWojciech Liguzinski static struct test_config perf_test_config = {
78744c730b0SWojciech Liguzinski .ifname = "performance test 1 interface",
78844c730b0SWojciech Liguzinski .msg = "performance test 1 : use one PIE configuration,\n"
78944c730b0SWojciech Liguzinski " measure enqueue performance\n\n",
79044c730b0SWojciech Liguzinski .tconfig = &pt_tconfig,
79144c730b0SWojciech Liguzinski .tqueue = &pt_tqueue,
79244c730b0SWojciech Liguzinski .tvar = &perf1_tvar,
79344c730b0SWojciech Liguzinski .tlevel = pt1_tlevel,
79444c730b0SWojciech Liguzinski };
79544c730b0SWojciech Liguzinski
79644c730b0SWojciech Liguzinski /**
79744c730b0SWojciech Liguzinski * Performance test function to measure enqueue performance.
79844c730b0SWojciech Liguzinski *
79944c730b0SWojciech Liguzinski */
perf_test(struct test_config * tcfg)80044c730b0SWojciech Liguzinski static enum test_result perf_test(struct test_config *tcfg)
80144c730b0SWojciech Liguzinski {
80244c730b0SWojciech Liguzinski enum test_result result = PASS;
80344c730b0SWojciech Liguzinski struct rdtsc_prof prof = {0, 0, 0, 0, 0.0, NULL};
80444c730b0SWojciech Liguzinski uint32_t total = 0;
80544c730b0SWojciech Liguzinski
80644c730b0SWojciech Liguzinski printf("%s", tcfg->msg);
80744c730b0SWojciech Liguzinski
80844c730b0SWojciech Liguzinski rdtsc_prof_init(&prof, "enqueue");
80944c730b0SWojciech Liguzinski
81044c730b0SWojciech Liguzinski if (test_rte_pie_init(tcfg) != PASS) {
81144c730b0SWojciech Liguzinski result = FAIL;
81244c730b0SWojciech Liguzinski goto out;
81344c730b0SWojciech Liguzinski }
81444c730b0SWojciech Liguzinski
81544c730b0SWojciech Liguzinski /**
81644c730b0SWojciech Liguzinski * initialize the rte_pie run time data structure
81744c730b0SWojciech Liguzinski */
81844c730b0SWojciech Liguzinski rte_pie_rt_data_init(tcfg->tqueue->pdata_in);
81944c730b0SWojciech Liguzinski rte_pie_set_active(NULL, tcfg->tqueue->pdata_in, 1);
82044c730b0SWojciech Liguzinski *tcfg->tvar->enqueued = 0;
82144c730b0SWojciech Liguzinski *tcfg->tvar->dropped = 0;
82244c730b0SWojciech Liguzinski
82344c730b0SWojciech Liguzinski enqueue_dequeue_perf(tcfg->tconfig->pconfig,
82444c730b0SWojciech Liguzinski tcfg->tqueue->pdata_in,
82544c730b0SWojciech Liguzinski NULL,
82644c730b0SWojciech Liguzinski tcfg->tqueue->qlen,
82744c730b0SWojciech Liguzinski tcfg->tvar->num_ops,
82844c730b0SWojciech Liguzinski tcfg->tvar->enqueued,
82944c730b0SWojciech Liguzinski tcfg->tvar->dropped,
83044c730b0SWojciech Liguzinski tcfg->tvar->dequeued,
83144c730b0SWojciech Liguzinski &prof);
83244c730b0SWojciech Liguzinski
83344c730b0SWojciech Liguzinski total = *tcfg->tvar->enqueued + *tcfg->tvar->dropped;
83444c730b0SWojciech Liguzinski
83544c730b0SWojciech Liguzinski printf("\ntotal: %u, enqueued: %u (%.2lf%%), dropped: %u (%.2lf%%)\n",
83644c730b0SWojciech Liguzinski total, *tcfg->tvar->enqueued,
83744c730b0SWojciech Liguzinski ((double)(*tcfg->tvar->enqueued) / (double)total) * 100.0,
83844c730b0SWojciech Liguzinski *tcfg->tvar->dropped,
83944c730b0SWojciech Liguzinski ((double)(*tcfg->tvar->dropped) / (double)total) * 100.0);
84044c730b0SWojciech Liguzinski
84144c730b0SWojciech Liguzinski rdtsc_prof_print(&prof);
84244c730b0SWojciech Liguzinski out:
84344c730b0SWojciech Liguzinski return result;
84444c730b0SWojciech Liguzinski }
84544c730b0SWojciech Liguzinski
84644c730b0SWojciech Liguzinski
84744c730b0SWojciech Liguzinski
84844c730b0SWojciech Liguzinski /**
84944c730b0SWojciech Liguzinski * Setup test structures for tests P2
85044c730b0SWojciech Liguzinski * performance tests 2
85144c730b0SWojciech Liguzinski */
85244c730b0SWojciech Liguzinski static uint32_t pt2_tlevel[] = {80};
85344c730b0SWojciech Liguzinski
85444c730b0SWojciech Liguzinski static struct test_var perf2_tvar = {
85544c730b0SWojciech Liguzinski .num_iterations = 0,
85644c730b0SWojciech Liguzinski .num_ops = 30000,
85744c730b0SWojciech Liguzinski .clk_freq = 0,
85844c730b0SWojciech Liguzinski .dropped = pt_dropped,
85944c730b0SWojciech Liguzinski .enqueued = pt_enqueued,
86044c730b0SWojciech Liguzinski .dequeued = pt_dequeued
86144c730b0SWojciech Liguzinski };
86244c730b0SWojciech Liguzinski
86344c730b0SWojciech Liguzinski static struct test_config perf_test_config2 = {
86444c730b0SWojciech Liguzinski .ifname = "performance test 2 interface",
86544c730b0SWojciech Liguzinski .msg = "performance test 2 : use one PIE configuration,\n"
86644c730b0SWojciech Liguzinski " measure enqueue & dequeue performance\n\n",
86744c730b0SWojciech Liguzinski .tconfig = &pt_tconfig2,
86844c730b0SWojciech Liguzinski .tqueue = &pt_tqueue2,
86944c730b0SWojciech Liguzinski .tvar = &perf2_tvar,
87044c730b0SWojciech Liguzinski .tlevel = pt2_tlevel,
87144c730b0SWojciech Liguzinski };
87244c730b0SWojciech Liguzinski
87344c730b0SWojciech Liguzinski /**
87444c730b0SWojciech Liguzinski * Performance test function to measure enqueue & dequeue performance.
87544c730b0SWojciech Liguzinski *
87644c730b0SWojciech Liguzinski */
perf_test2(struct test_config * tcfg)87744c730b0SWojciech Liguzinski static enum test_result perf_test2(struct test_config *tcfg)
87844c730b0SWojciech Liguzinski {
87944c730b0SWojciech Liguzinski enum test_result result = PASS;
88044c730b0SWojciech Liguzinski struct rdtsc_prof prof = {0, 0, 0, 0, 0.0, NULL};
88144c730b0SWojciech Liguzinski uint32_t total = 0;
88244c730b0SWojciech Liguzinski
88344c730b0SWojciech Liguzinski printf("%s", tcfg->msg);
88444c730b0SWojciech Liguzinski
88544c730b0SWojciech Liguzinski rdtsc_prof_init(&prof, "enqueue");
88644c730b0SWojciech Liguzinski
88744c730b0SWojciech Liguzinski if (test_rte_pie_init(tcfg) != PASS) {
88844c730b0SWojciech Liguzinski result = FAIL;
88944c730b0SWojciech Liguzinski goto out;
89044c730b0SWojciech Liguzinski }
89144c730b0SWojciech Liguzinski
89244c730b0SWojciech Liguzinski /**
89344c730b0SWojciech Liguzinski * initialize the rte_pie run time data structure
89444c730b0SWojciech Liguzinski */
89544c730b0SWojciech Liguzinski rte_pie_rt_data_init(tcfg->tqueue->pdata_in);
89644c730b0SWojciech Liguzinski rte_pie_set_active(NULL, tcfg->tqueue->pdata_in, 1);
89744c730b0SWojciech Liguzinski *tcfg->tvar->enqueued = 0;
89844c730b0SWojciech Liguzinski *tcfg->tvar->dequeued = 0;
89944c730b0SWojciech Liguzinski *tcfg->tvar->dropped = 0;
90044c730b0SWojciech Liguzinski
90144c730b0SWojciech Liguzinski enqueue_dequeue_perf(tcfg->tconfig->pconfig,
90244c730b0SWojciech Liguzinski tcfg->tqueue->pdata_in,
90344c730b0SWojciech Liguzinski tcfg->tqueue->pdata_out,
90444c730b0SWojciech Liguzinski tcfg->tqueue->qlen,
90544c730b0SWojciech Liguzinski tcfg->tvar->num_ops,
90644c730b0SWojciech Liguzinski tcfg->tvar->enqueued,
90744c730b0SWojciech Liguzinski tcfg->tvar->dropped,
90844c730b0SWojciech Liguzinski tcfg->tvar->dequeued,
90944c730b0SWojciech Liguzinski &prof);
91044c730b0SWojciech Liguzinski
91144c730b0SWojciech Liguzinski total = *tcfg->tvar->enqueued + *tcfg->tvar->dropped;
91244c730b0SWojciech Liguzinski
91344c730b0SWojciech Liguzinski printf("\ntotal: %u, dequeued: %u (%.2lf%%), dropped: %u (%.2lf%%)\n",
91444c730b0SWojciech Liguzinski total, *tcfg->tvar->dequeued,
91544c730b0SWojciech Liguzinski ((double)(*tcfg->tvar->dequeued) / (double)total) * 100.0,
91644c730b0SWojciech Liguzinski *tcfg->tvar->dropped,
91744c730b0SWojciech Liguzinski ((double)(*tcfg->tvar->dropped) / (double)total) * 100.0);
91844c730b0SWojciech Liguzinski
91944c730b0SWojciech Liguzinski rdtsc_prof_print(&prof);
92044c730b0SWojciech Liguzinski out:
92144c730b0SWojciech Liguzinski return result;
92244c730b0SWojciech Liguzinski }
92344c730b0SWojciech Liguzinski
92444c730b0SWojciech Liguzinski /**
92544c730b0SWojciech Liguzinski * define the functional tests to be executed fast
92644c730b0SWojciech Liguzinski */
92744c730b0SWojciech Liguzinski struct tests func_pie_tests_quick[] = {
92844c730b0SWojciech Liguzinski { &func_test_config1, func_test1 },
92944c730b0SWojciech Liguzinski { &func_test_config2, func_test2 },
93044c730b0SWojciech Liguzinski };
93144c730b0SWojciech Liguzinski
93244c730b0SWojciech Liguzinski /**
93344c730b0SWojciech Liguzinski * define the functional and performance tests to be executed
93444c730b0SWojciech Liguzinski */
93544c730b0SWojciech Liguzinski struct tests func_pie_tests[] = {
93644c730b0SWojciech Liguzinski { &func_test_config1, func_test1 },
93744c730b0SWojciech Liguzinski { &func_test_config2, func_test2 },
93844c730b0SWojciech Liguzinski { &func_test_config3, func_test3 },
93944c730b0SWojciech Liguzinski };
94044c730b0SWojciech Liguzinski
94144c730b0SWojciech Liguzinski struct tests perf_pie_tests[] = {
94244c730b0SWojciech Liguzinski { &perf_test_config, perf_test },
94344c730b0SWojciech Liguzinski { &perf_test_config2, perf_test2 },
94444c730b0SWojciech Liguzinski };
94544c730b0SWojciech Liguzinski
94644c730b0SWojciech Liguzinski /**
94744c730b0SWojciech Liguzinski * function to execute the required pie tests
94844c730b0SWojciech Liguzinski */
run_tests(struct tests * test_type,uint32_t test_count,uint32_t * num_tests,uint32_t * num_pass)94944c730b0SWojciech Liguzinski static void run_tests(struct tests *test_type, uint32_t test_count,
95044c730b0SWojciech Liguzinski uint32_t *num_tests, uint32_t *num_pass)
95144c730b0SWojciech Liguzinski {
95244c730b0SWojciech Liguzinski enum test_result result = PASS;
95344c730b0SWojciech Liguzinski uint32_t i = 0;
95444c730b0SWojciech Liguzinski static const char *bar_str = "-------------------------------------"
95544c730b0SWojciech Liguzinski "-------------------------------------------";
95644c730b0SWojciech Liguzinski static const char *bar_pass_str = "-------------------------------------"
95744c730b0SWojciech Liguzinski "<pass>-------------------------------------";
95844c730b0SWojciech Liguzinski static const char *bar_fail_str = "-------------------------------------"
95944c730b0SWojciech Liguzinski "<fail>-------------------------------------";
96044c730b0SWojciech Liguzinski
96144c730b0SWojciech Liguzinski for (i = 0; i < test_count; i++) {
96244c730b0SWojciech Liguzinski printf("\n%s\n", bar_str);
96344c730b0SWojciech Liguzinski result = test_type[i].testfn(test_type[i].testcfg);
96444c730b0SWojciech Liguzinski (*num_tests)++;
96544c730b0SWojciech Liguzinski if (result == PASS) {
96644c730b0SWojciech Liguzinski (*num_pass)++;
96744c730b0SWojciech Liguzinski printf("%s\n", bar_pass_str);
96844c730b0SWojciech Liguzinski } else {
96944c730b0SWojciech Liguzinski printf("%s\n", bar_fail_str);
97044c730b0SWojciech Liguzinski }
97144c730b0SWojciech Liguzinski }
97244c730b0SWojciech Liguzinski }
97344c730b0SWojciech Liguzinski
97444c730b0SWojciech Liguzinski /**
97544c730b0SWojciech Liguzinski * check if functions accept invalid parameters
97644c730b0SWojciech Liguzinski *
97744c730b0SWojciech Liguzinski * First, all functions will be called without initialized PIE
97844c730b0SWojciech Liguzinski * Then, all of them will be called with NULL/invalid parameters
97944c730b0SWojciech Liguzinski *
98044c730b0SWojciech Liguzinski * Some functions are not tested as they are performance-critical and thus
98144c730b0SWojciech Liguzinski * don't do any parameter checking.
98244c730b0SWojciech Liguzinski */
98344c730b0SWojciech Liguzinski static int
test_invalid_parameters(void)98444c730b0SWojciech Liguzinski test_invalid_parameters(void)
98544c730b0SWojciech Liguzinski {
98644c730b0SWojciech Liguzinski struct rte_pie_config config;
98744c730b0SWojciech Liguzinski static const char *shf_str = "rte_pie_config_init should have failed!";
98844c730b0SWojciech Liguzinski static const char *shf_rt_str = "rte_pie_rt_data_init should have failed!";
98944c730b0SWojciech Liguzinski
99044c730b0SWojciech Liguzinski /* NULL config */
99144c730b0SWojciech Liguzinski if (rte_pie_rt_data_init(NULL) == 0) {
99244c730b0SWojciech Liguzinski printf("%i: %s\n", __LINE__, shf_rt_str);
99344c730b0SWojciech Liguzinski return -1;
99444c730b0SWojciech Liguzinski }
99544c730b0SWojciech Liguzinski
99644c730b0SWojciech Liguzinski /* NULL config */
99744c730b0SWojciech Liguzinski if (rte_pie_config_init(NULL, 0, 0, 0, 0) == 0) {
99844c730b0SWojciech Liguzinski printf("%i%s\n", __LINE__, shf_str);
99944c730b0SWojciech Liguzinski return -1;
100044c730b0SWojciech Liguzinski }
100144c730b0SWojciech Liguzinski
100244c730b0SWojciech Liguzinski /* qdelay_ref <= 0 */
100344c730b0SWojciech Liguzinski if (rte_pie_config_init(&config, 0, 1, 1, 1) == 0) {
100444c730b0SWojciech Liguzinski printf("%i%s\n", __LINE__, shf_str);
100544c730b0SWojciech Liguzinski return -1;
100644c730b0SWojciech Liguzinski }
100744c730b0SWojciech Liguzinski
100844c730b0SWojciech Liguzinski /* dp_update_interval <= 0 */
100944c730b0SWojciech Liguzinski if (rte_pie_config_init(&config, 1, 0, 1, 1) == 0) {
101044c730b0SWojciech Liguzinski printf("%i%s\n", __LINE__, shf_str);
101144c730b0SWojciech Liguzinski return -1;
101244c730b0SWojciech Liguzinski }
101344c730b0SWojciech Liguzinski
101444c730b0SWojciech Liguzinski /* max_burst <= 0 */
101544c730b0SWojciech Liguzinski if (rte_pie_config_init(&config, 1, 1, 0, 1) == 0) {
101644c730b0SWojciech Liguzinski printf("%i%s\n", __LINE__, shf_str);
101744c730b0SWojciech Liguzinski return -1;
101844c730b0SWojciech Liguzinski }
101944c730b0SWojciech Liguzinski
102044c730b0SWojciech Liguzinski /* tailq_th <= 0 */
102144c730b0SWojciech Liguzinski if (rte_pie_config_init(&config, 1, 1, 1, 0) == 0) {
102244c730b0SWojciech Liguzinski printf("%i%s\n", __LINE__, shf_str);
102344c730b0SWojciech Liguzinski return -1;
102444c730b0SWojciech Liguzinski }
102544c730b0SWojciech Liguzinski
102644c730b0SWojciech Liguzinski RTE_SET_USED(config);
102744c730b0SWojciech Liguzinski
102844c730b0SWojciech Liguzinski return 0;
102944c730b0SWojciech Liguzinski }
103044c730b0SWojciech Liguzinski
103144c730b0SWojciech Liguzinski static void
show_stats(const uint32_t num_tests,const uint32_t num_pass)103244c730b0SWojciech Liguzinski show_stats(const uint32_t num_tests, const uint32_t num_pass)
103344c730b0SWojciech Liguzinski {
103444c730b0SWojciech Liguzinski if (num_pass == num_tests)
103544c730b0SWojciech Liguzinski printf("[total: %u, pass: %u]\n", num_tests, num_pass);
103644c730b0SWojciech Liguzinski else
103744c730b0SWojciech Liguzinski printf("[total: %u, pass: %u, fail: %u]\n", num_tests, num_pass,
103844c730b0SWojciech Liguzinski num_tests - num_pass);
103944c730b0SWojciech Liguzinski }
104044c730b0SWojciech Liguzinski
104144c730b0SWojciech Liguzinski static int
tell_the_result(const uint32_t num_tests,const uint32_t num_pass)104244c730b0SWojciech Liguzinski tell_the_result(const uint32_t num_tests, const uint32_t num_pass)
104344c730b0SWojciech Liguzinski {
104444c730b0SWojciech Liguzinski return (num_pass == num_tests) ? 0 : 1;
104544c730b0SWojciech Liguzinski }
104644c730b0SWojciech Liguzinski
104744c730b0SWojciech Liguzinski static int
test_pie(void)104844c730b0SWojciech Liguzinski test_pie(void)
104944c730b0SWojciech Liguzinski {
105044c730b0SWojciech Liguzinski uint32_t num_tests = 0;
105144c730b0SWojciech Liguzinski uint32_t num_pass = 0;
105244c730b0SWojciech Liguzinski
105344c730b0SWojciech Liguzinski if (test_invalid_parameters() < 0)
105444c730b0SWojciech Liguzinski return -1;
105544c730b0SWojciech Liguzinski
105644c730b0SWojciech Liguzinski run_tests(func_pie_tests_quick, RTE_DIM(func_pie_tests_quick),
105744c730b0SWojciech Liguzinski &num_tests, &num_pass);
105844c730b0SWojciech Liguzinski show_stats(num_tests, num_pass);
105944c730b0SWojciech Liguzinski return tell_the_result(num_tests, num_pass);
106044c730b0SWojciech Liguzinski }
106144c730b0SWojciech Liguzinski
106244c730b0SWojciech Liguzinski static int
test_pie_perf(void)106344c730b0SWojciech Liguzinski test_pie_perf(void)
106444c730b0SWojciech Liguzinski {
106544c730b0SWojciech Liguzinski uint32_t num_tests = 0;
106644c730b0SWojciech Liguzinski uint32_t num_pass = 0;
106744c730b0SWojciech Liguzinski
106844c730b0SWojciech Liguzinski run_tests(perf_pie_tests, RTE_DIM(perf_pie_tests), &num_tests, &num_pass);
106944c730b0SWojciech Liguzinski show_stats(num_tests, num_pass);
107044c730b0SWojciech Liguzinski return tell_the_result(num_tests, num_pass);
107144c730b0SWojciech Liguzinski }
107244c730b0SWojciech Liguzinski
107344c730b0SWojciech Liguzinski static int
test_pie_all(void)107444c730b0SWojciech Liguzinski test_pie_all(void)
107544c730b0SWojciech Liguzinski {
107644c730b0SWojciech Liguzinski uint32_t num_tests = 0;
107744c730b0SWojciech Liguzinski uint32_t num_pass = 0;
107844c730b0SWojciech Liguzinski
107944c730b0SWojciech Liguzinski if (test_invalid_parameters() < 0)
108044c730b0SWojciech Liguzinski return -1;
108144c730b0SWojciech Liguzinski
108244c730b0SWojciech Liguzinski run_tests(func_pie_tests, RTE_DIM(func_pie_tests), &num_tests, &num_pass);
108344c730b0SWojciech Liguzinski run_tests(perf_pie_tests, RTE_DIM(perf_pie_tests), &num_tests, &num_pass);
108444c730b0SWojciech Liguzinski show_stats(num_tests, num_pass);
108544c730b0SWojciech Liguzinski return tell_the_result(num_tests, num_pass);
108644c730b0SWojciech Liguzinski }
108744c730b0SWojciech Liguzinski
10883c60274cSJie Zhou #endif /* !RTE_EXEC_ENV_WINDOWS */
10893c60274cSJie Zhou
1090*e0a8442cSBruce Richardson REGISTER_FAST_TEST(pie_autotest, true, true, test_pie);
1091*e0a8442cSBruce Richardson REGISTER_PERF_TEST(pie_perf, test_pie_perf);
1092*e0a8442cSBruce Richardson REGISTER_PERF_TEST(pie_all, test_pie_all);
1093