185fb515bSPavan Nikhilesh /* SPDX-License-Identifier: BSD-3-Clause 285fb515bSPavan Nikhilesh * Copyright(c) 2016-2017 Intel Corporation 385fb515bSPavan Nikhilesh */ 485fb515bSPavan Nikhilesh 585fb515bSPavan Nikhilesh #include <stdio.h> 685fb515bSPavan Nikhilesh #include <string.h> 785fb515bSPavan Nikhilesh #include <stdint.h> 885fb515bSPavan Nikhilesh #include <errno.h> 985fb515bSPavan Nikhilesh #include <unistd.h> 1085fb515bSPavan Nikhilesh #include <sys/queue.h> 1185fb515bSPavan Nikhilesh 1285fb515bSPavan Nikhilesh #include <rte_memory.h> 1385fb515bSPavan Nikhilesh #include <rte_launch.h> 1485fb515bSPavan Nikhilesh #include <rte_eal.h> 1585fb515bSPavan Nikhilesh #include <rte_per_lcore.h> 1685fb515bSPavan Nikhilesh #include <rte_lcore.h> 1785fb515bSPavan Nikhilesh #include <rte_debug.h> 1885fb515bSPavan Nikhilesh #include <rte_ethdev.h> 1985fb515bSPavan Nikhilesh #include <rte_cycles.h> 2085fb515bSPavan Nikhilesh #include <rte_eventdev.h> 2185fb515bSPavan Nikhilesh #include <rte_pause.h> 2285fb515bSPavan Nikhilesh #include <rte_service.h> 2385fb515bSPavan Nikhilesh #include <rte_service_component.h> 2485fb515bSPavan Nikhilesh #include <rte_bus_vdev.h> 2585fb515bSPavan Nikhilesh 265e6eb5ccSPavan Nikhilesh #include "sw_evdev.h" 2785fb515bSPavan Nikhilesh 2885fb515bSPavan Nikhilesh #define MAX_PORTS 16 2985fb515bSPavan Nikhilesh #define MAX_QIDS 16 3085fb515bSPavan Nikhilesh #define NUM_PACKETS (1<<18) 318490488aSGage Eads #define DEQUEUE_DEPTH 128 3285fb515bSPavan Nikhilesh 3385fb515bSPavan Nikhilesh static int evdev; 3485fb515bSPavan Nikhilesh 3585fb515bSPavan Nikhilesh struct test { 3685fb515bSPavan Nikhilesh struct rte_mempool *mbuf_pool; 3785fb515bSPavan Nikhilesh uint8_t port[MAX_PORTS]; 3885fb515bSPavan Nikhilesh uint8_t qid[MAX_QIDS]; 3985fb515bSPavan Nikhilesh int nb_qids; 4085fb515bSPavan Nikhilesh uint32_t service_id; 4185fb515bSPavan Nikhilesh }; 4285fb515bSPavan Nikhilesh 43*70418e32SThomas Monjalon typedef uint8_t counter_dynfield_t; 44*70418e32SThomas Monjalon static int counter_dynfield_offset = -1; 45*70418e32SThomas Monjalon 46*70418e32SThomas Monjalon static inline counter_dynfield_t * 47*70418e32SThomas Monjalon counter_field(struct rte_mbuf *mbuf) 48*70418e32SThomas Monjalon { 49*70418e32SThomas Monjalon return RTE_MBUF_DYNFIELD(mbuf, \ 50*70418e32SThomas Monjalon counter_dynfield_offset, counter_dynfield_t *); 51*70418e32SThomas Monjalon } 52*70418e32SThomas Monjalon 5385fb515bSPavan Nikhilesh static struct rte_event release_ev; 5485fb515bSPavan Nikhilesh 5585fb515bSPavan Nikhilesh static inline struct rte_mbuf * 5685fb515bSPavan Nikhilesh rte_gen_arp(int portid, struct rte_mempool *mp) 5785fb515bSPavan Nikhilesh { 5885fb515bSPavan Nikhilesh /* 5985fb515bSPavan Nikhilesh * len = 14 + 46 6085fb515bSPavan Nikhilesh * ARP, Request who-has 10.0.0.1 tell 10.0.0.2, length 46 6185fb515bSPavan Nikhilesh */ 6285fb515bSPavan Nikhilesh static const uint8_t arp_request[] = { 6385fb515bSPavan Nikhilesh /*0x0000:*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xa8, 6485fb515bSPavan Nikhilesh 0x6b, 0xfd, 0x02, 0x29, 0x08, 0x06, 0x00, 0x01, 6585fb515bSPavan Nikhilesh /*0x0010:*/ 0x08, 0x00, 0x06, 0x04, 0x00, 0x01, 0xec, 0xa8, 6685fb515bSPavan Nikhilesh 0x6b, 0xfd, 0x02, 0x29, 0x0a, 0x00, 0x00, 0x01, 6785fb515bSPavan Nikhilesh /*0x0020:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 6885fb515bSPavan Nikhilesh 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 6985fb515bSPavan Nikhilesh /*0x0030:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 7085fb515bSPavan Nikhilesh 0x00, 0x00, 0x00, 0x00 7185fb515bSPavan Nikhilesh }; 7285fb515bSPavan Nikhilesh struct rte_mbuf *m; 7385fb515bSPavan Nikhilesh int pkt_len = sizeof(arp_request) - 1; 7485fb515bSPavan Nikhilesh 7585fb515bSPavan Nikhilesh m = rte_pktmbuf_alloc(mp); 7685fb515bSPavan Nikhilesh if (!m) 7785fb515bSPavan Nikhilesh return 0; 7885fb515bSPavan Nikhilesh 7985fb515bSPavan Nikhilesh memcpy((void *)((uintptr_t)m->buf_addr + m->data_off), 8085fb515bSPavan Nikhilesh arp_request, pkt_len); 8185fb515bSPavan Nikhilesh rte_pktmbuf_pkt_len(m) = pkt_len; 8285fb515bSPavan Nikhilesh rte_pktmbuf_data_len(m) = pkt_len; 8385fb515bSPavan Nikhilesh 8485fb515bSPavan Nikhilesh RTE_SET_USED(portid); 8585fb515bSPavan Nikhilesh 8685fb515bSPavan Nikhilesh return m; 8785fb515bSPavan Nikhilesh } 8885fb515bSPavan Nikhilesh 8985fb515bSPavan Nikhilesh static void 9085fb515bSPavan Nikhilesh xstats_print(void) 9185fb515bSPavan Nikhilesh { 9285fb515bSPavan Nikhilesh const uint32_t XSTATS_MAX = 1024; 9385fb515bSPavan Nikhilesh uint32_t i; 9485fb515bSPavan Nikhilesh uint32_t ids[XSTATS_MAX]; 9585fb515bSPavan Nikhilesh uint64_t values[XSTATS_MAX]; 9685fb515bSPavan Nikhilesh struct rte_event_dev_xstats_name xstats_names[XSTATS_MAX]; 9785fb515bSPavan Nikhilesh 9885fb515bSPavan Nikhilesh for (i = 0; i < XSTATS_MAX; i++) 9985fb515bSPavan Nikhilesh ids[i] = i; 10085fb515bSPavan Nikhilesh 10185fb515bSPavan Nikhilesh /* Device names / values */ 10285fb515bSPavan Nikhilesh int ret = rte_event_dev_xstats_names_get(evdev, 10385fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_DEVICE, 0, 10485fb515bSPavan Nikhilesh xstats_names, ids, XSTATS_MAX); 10585fb515bSPavan Nikhilesh if (ret < 0) { 10685fb515bSPavan Nikhilesh printf("%d: xstats names get() returned error\n", 10785fb515bSPavan Nikhilesh __LINE__); 10885fb515bSPavan Nikhilesh return; 10985fb515bSPavan Nikhilesh } 11085fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_get(evdev, 11185fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_DEVICE, 11285fb515bSPavan Nikhilesh 0, ids, values, ret); 11385fb515bSPavan Nikhilesh if (ret > (signed int)XSTATS_MAX) 11485fb515bSPavan Nikhilesh printf("%s %d: more xstats available than space\n", 11585fb515bSPavan Nikhilesh __func__, __LINE__); 11685fb515bSPavan Nikhilesh for (i = 0; (signed int)i < ret; i++) { 11785fb515bSPavan Nikhilesh printf("%d : %s : %"PRIu64"\n", 11885fb515bSPavan Nikhilesh i, xstats_names[i].name, values[i]); 11985fb515bSPavan Nikhilesh } 12085fb515bSPavan Nikhilesh 12185fb515bSPavan Nikhilesh /* Port names / values */ 12285fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_names_get(evdev, 12385fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_PORT, 0, 12485fb515bSPavan Nikhilesh xstats_names, ids, XSTATS_MAX); 12585fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_get(evdev, 12685fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_PORT, 1, 12785fb515bSPavan Nikhilesh ids, values, ret); 12885fb515bSPavan Nikhilesh if (ret > (signed int)XSTATS_MAX) 12985fb515bSPavan Nikhilesh printf("%s %d: more xstats available than space\n", 13085fb515bSPavan Nikhilesh __func__, __LINE__); 13185fb515bSPavan Nikhilesh for (i = 0; (signed int)i < ret; i++) { 13285fb515bSPavan Nikhilesh printf("%d : %s : %"PRIu64"\n", 13385fb515bSPavan Nikhilesh i, xstats_names[i].name, values[i]); 13485fb515bSPavan Nikhilesh } 13585fb515bSPavan Nikhilesh 13685fb515bSPavan Nikhilesh /* Queue names / values */ 13785fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_names_get(evdev, 13885fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_QUEUE, 0, 13985fb515bSPavan Nikhilesh xstats_names, ids, XSTATS_MAX); 14085fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_get(evdev, 14185fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_QUEUE, 14285fb515bSPavan Nikhilesh 1, ids, values, ret); 14385fb515bSPavan Nikhilesh if (ret > (signed int)XSTATS_MAX) 14485fb515bSPavan Nikhilesh printf("%s %d: more xstats available than space\n", 14585fb515bSPavan Nikhilesh __func__, __LINE__); 14685fb515bSPavan Nikhilesh for (i = 0; (signed int)i < ret; i++) { 14785fb515bSPavan Nikhilesh printf("%d : %s : %"PRIu64"\n", 14885fb515bSPavan Nikhilesh i, xstats_names[i].name, values[i]); 14985fb515bSPavan Nikhilesh } 15085fb515bSPavan Nikhilesh } 15185fb515bSPavan Nikhilesh 15285fb515bSPavan Nikhilesh /* initialization and config */ 15385fb515bSPavan Nikhilesh static inline int 15485fb515bSPavan Nikhilesh init(struct test *t, int nb_queues, int nb_ports) 15585fb515bSPavan Nikhilesh { 15685fb515bSPavan Nikhilesh struct rte_event_dev_config config = { 15785fb515bSPavan Nikhilesh .nb_event_queues = nb_queues, 15885fb515bSPavan Nikhilesh .nb_event_ports = nb_ports, 15985fb515bSPavan Nikhilesh .nb_event_queue_flows = 1024, 16085fb515bSPavan Nikhilesh .nb_events_limit = 4096, 1618490488aSGage Eads .nb_event_port_dequeue_depth = DEQUEUE_DEPTH, 16285fb515bSPavan Nikhilesh .nb_event_port_enqueue_depth = 128, 16385fb515bSPavan Nikhilesh }; 16485fb515bSPavan Nikhilesh int ret; 16585fb515bSPavan Nikhilesh 16685fb515bSPavan Nikhilesh void *temp = t->mbuf_pool; /* save and restore mbuf pool */ 16785fb515bSPavan Nikhilesh 16885fb515bSPavan Nikhilesh memset(t, 0, sizeof(*t)); 16985fb515bSPavan Nikhilesh t->mbuf_pool = temp; 17085fb515bSPavan Nikhilesh 17185fb515bSPavan Nikhilesh ret = rte_event_dev_configure(evdev, &config); 17285fb515bSPavan Nikhilesh if (ret < 0) 17385fb515bSPavan Nikhilesh printf("%d: Error configuring device\n", __LINE__); 17485fb515bSPavan Nikhilesh return ret; 17585fb515bSPavan Nikhilesh }; 17685fb515bSPavan Nikhilesh 17785fb515bSPavan Nikhilesh static inline int 17885fb515bSPavan Nikhilesh create_ports(struct test *t, int num_ports) 17985fb515bSPavan Nikhilesh { 18085fb515bSPavan Nikhilesh int i; 18185fb515bSPavan Nikhilesh static const struct rte_event_port_conf conf = { 18285fb515bSPavan Nikhilesh .new_event_threshold = 1024, 18385fb515bSPavan Nikhilesh .dequeue_depth = 32, 18485fb515bSPavan Nikhilesh .enqueue_depth = 64, 18585fb515bSPavan Nikhilesh }; 18685fb515bSPavan Nikhilesh if (num_ports > MAX_PORTS) 18785fb515bSPavan Nikhilesh return -1; 18885fb515bSPavan Nikhilesh 18985fb515bSPavan Nikhilesh for (i = 0; i < num_ports; i++) { 19085fb515bSPavan Nikhilesh if (rte_event_port_setup(evdev, i, &conf) < 0) { 19185fb515bSPavan Nikhilesh printf("Error setting up port %d\n", i); 19285fb515bSPavan Nikhilesh return -1; 19385fb515bSPavan Nikhilesh } 19485fb515bSPavan Nikhilesh t->port[i] = i; 19585fb515bSPavan Nikhilesh } 19685fb515bSPavan Nikhilesh 19785fb515bSPavan Nikhilesh return 0; 19885fb515bSPavan Nikhilesh } 19985fb515bSPavan Nikhilesh 20085fb515bSPavan Nikhilesh static inline int 20185fb515bSPavan Nikhilesh create_lb_qids(struct test *t, int num_qids, uint32_t flags) 20285fb515bSPavan Nikhilesh { 20385fb515bSPavan Nikhilesh int i; 20485fb515bSPavan Nikhilesh 20585fb515bSPavan Nikhilesh /* Q creation */ 20685fb515bSPavan Nikhilesh const struct rte_event_queue_conf conf = { 20785fb515bSPavan Nikhilesh .schedule_type = flags, 20885fb515bSPavan Nikhilesh .priority = RTE_EVENT_DEV_PRIORITY_NORMAL, 20985fb515bSPavan Nikhilesh .nb_atomic_flows = 1024, 21085fb515bSPavan Nikhilesh .nb_atomic_order_sequences = 1024, 21185fb515bSPavan Nikhilesh }; 21285fb515bSPavan Nikhilesh 21385fb515bSPavan Nikhilesh for (i = t->nb_qids; i < t->nb_qids + num_qids; i++) { 21485fb515bSPavan Nikhilesh if (rte_event_queue_setup(evdev, i, &conf) < 0) { 21585fb515bSPavan Nikhilesh printf("%d: error creating qid %d\n", __LINE__, i); 21685fb515bSPavan Nikhilesh return -1; 21785fb515bSPavan Nikhilesh } 21885fb515bSPavan Nikhilesh t->qid[i] = i; 21985fb515bSPavan Nikhilesh } 22085fb515bSPavan Nikhilesh t->nb_qids += num_qids; 22185fb515bSPavan Nikhilesh if (t->nb_qids > MAX_QIDS) 22285fb515bSPavan Nikhilesh return -1; 22385fb515bSPavan Nikhilesh 22485fb515bSPavan Nikhilesh return 0; 22585fb515bSPavan Nikhilesh } 22685fb515bSPavan Nikhilesh 22785fb515bSPavan Nikhilesh static inline int 22885fb515bSPavan Nikhilesh create_atomic_qids(struct test *t, int num_qids) 22985fb515bSPavan Nikhilesh { 23085fb515bSPavan Nikhilesh return create_lb_qids(t, num_qids, RTE_SCHED_TYPE_ATOMIC); 23185fb515bSPavan Nikhilesh } 23285fb515bSPavan Nikhilesh 23385fb515bSPavan Nikhilesh static inline int 23485fb515bSPavan Nikhilesh create_ordered_qids(struct test *t, int num_qids) 23585fb515bSPavan Nikhilesh { 23685fb515bSPavan Nikhilesh return create_lb_qids(t, num_qids, RTE_SCHED_TYPE_ORDERED); 23785fb515bSPavan Nikhilesh } 23885fb515bSPavan Nikhilesh 23985fb515bSPavan Nikhilesh 24085fb515bSPavan Nikhilesh static inline int 24185fb515bSPavan Nikhilesh create_unordered_qids(struct test *t, int num_qids) 24285fb515bSPavan Nikhilesh { 24385fb515bSPavan Nikhilesh return create_lb_qids(t, num_qids, RTE_SCHED_TYPE_PARALLEL); 24485fb515bSPavan Nikhilesh } 24585fb515bSPavan Nikhilesh 24685fb515bSPavan Nikhilesh static inline int 24785fb515bSPavan Nikhilesh create_directed_qids(struct test *t, int num_qids, const uint8_t ports[]) 24885fb515bSPavan Nikhilesh { 24985fb515bSPavan Nikhilesh int i; 25085fb515bSPavan Nikhilesh 25185fb515bSPavan Nikhilesh /* Q creation */ 25285fb515bSPavan Nikhilesh static const struct rte_event_queue_conf conf = { 25385fb515bSPavan Nikhilesh .priority = RTE_EVENT_DEV_PRIORITY_NORMAL, 25485fb515bSPavan Nikhilesh .event_queue_cfg = RTE_EVENT_QUEUE_CFG_SINGLE_LINK, 25585fb515bSPavan Nikhilesh }; 25685fb515bSPavan Nikhilesh 25785fb515bSPavan Nikhilesh for (i = t->nb_qids; i < t->nb_qids + num_qids; i++) { 25885fb515bSPavan Nikhilesh if (rte_event_queue_setup(evdev, i, &conf) < 0) { 25985fb515bSPavan Nikhilesh printf("%d: error creating qid %d\n", __LINE__, i); 26085fb515bSPavan Nikhilesh return -1; 26185fb515bSPavan Nikhilesh } 26285fb515bSPavan Nikhilesh t->qid[i] = i; 26385fb515bSPavan Nikhilesh 26485fb515bSPavan Nikhilesh if (rte_event_port_link(evdev, ports[i - t->nb_qids], 26585fb515bSPavan Nikhilesh &t->qid[i], NULL, 1) != 1) { 26685fb515bSPavan Nikhilesh printf("%d: error creating link for qid %d\n", 26785fb515bSPavan Nikhilesh __LINE__, i); 26885fb515bSPavan Nikhilesh return -1; 26985fb515bSPavan Nikhilesh } 27085fb515bSPavan Nikhilesh } 27185fb515bSPavan Nikhilesh t->nb_qids += num_qids; 27285fb515bSPavan Nikhilesh if (t->nb_qids > MAX_QIDS) 27385fb515bSPavan Nikhilesh return -1; 27485fb515bSPavan Nikhilesh 27585fb515bSPavan Nikhilesh return 0; 27685fb515bSPavan Nikhilesh } 27785fb515bSPavan Nikhilesh 27885fb515bSPavan Nikhilesh /* destruction */ 27985fb515bSPavan Nikhilesh static inline int 28085fb515bSPavan Nikhilesh cleanup(struct test *t __rte_unused) 28185fb515bSPavan Nikhilesh { 28285fb515bSPavan Nikhilesh rte_event_dev_stop(evdev); 28385fb515bSPavan Nikhilesh rte_event_dev_close(evdev); 28485fb515bSPavan Nikhilesh return 0; 28585fb515bSPavan Nikhilesh }; 28685fb515bSPavan Nikhilesh 28785fb515bSPavan Nikhilesh struct test_event_dev_stats { 28885fb515bSPavan Nikhilesh uint64_t rx_pkts; /**< Total packets received */ 28985fb515bSPavan Nikhilesh uint64_t rx_dropped; /**< Total packets dropped (Eg Invalid QID) */ 29085fb515bSPavan Nikhilesh uint64_t tx_pkts; /**< Total packets transmitted */ 29185fb515bSPavan Nikhilesh 29285fb515bSPavan Nikhilesh /** Packets received on this port */ 29385fb515bSPavan Nikhilesh uint64_t port_rx_pkts[MAX_PORTS]; 29485fb515bSPavan Nikhilesh /** Packets dropped on this port */ 29585fb515bSPavan Nikhilesh uint64_t port_rx_dropped[MAX_PORTS]; 29685fb515bSPavan Nikhilesh /** Packets inflight on this port */ 29785fb515bSPavan Nikhilesh uint64_t port_inflight[MAX_PORTS]; 29885fb515bSPavan Nikhilesh /** Packets transmitted on this port */ 29985fb515bSPavan Nikhilesh uint64_t port_tx_pkts[MAX_PORTS]; 30085fb515bSPavan Nikhilesh /** Packets received on this qid */ 30185fb515bSPavan Nikhilesh uint64_t qid_rx_pkts[MAX_QIDS]; 30285fb515bSPavan Nikhilesh /** Packets dropped on this qid */ 30385fb515bSPavan Nikhilesh uint64_t qid_rx_dropped[MAX_QIDS]; 30485fb515bSPavan Nikhilesh /** Packets transmitted on this qid */ 30585fb515bSPavan Nikhilesh uint64_t qid_tx_pkts[MAX_QIDS]; 30685fb515bSPavan Nikhilesh }; 30785fb515bSPavan Nikhilesh 30885fb515bSPavan Nikhilesh static inline int 30985fb515bSPavan Nikhilesh test_event_dev_stats_get(int dev_id, struct test_event_dev_stats *stats) 31085fb515bSPavan Nikhilesh { 31185fb515bSPavan Nikhilesh static uint32_t i; 31285fb515bSPavan Nikhilesh static uint32_t total_ids[3]; /* rx, tx and drop */ 31385fb515bSPavan Nikhilesh static uint32_t port_rx_pkts_ids[MAX_PORTS]; 31485fb515bSPavan Nikhilesh static uint32_t port_rx_dropped_ids[MAX_PORTS]; 31585fb515bSPavan Nikhilesh static uint32_t port_inflight_ids[MAX_PORTS]; 31685fb515bSPavan Nikhilesh static uint32_t port_tx_pkts_ids[MAX_PORTS]; 31785fb515bSPavan Nikhilesh static uint32_t qid_rx_pkts_ids[MAX_QIDS]; 31885fb515bSPavan Nikhilesh static uint32_t qid_rx_dropped_ids[MAX_QIDS]; 31985fb515bSPavan Nikhilesh static uint32_t qid_tx_pkts_ids[MAX_QIDS]; 32085fb515bSPavan Nikhilesh 32185fb515bSPavan Nikhilesh 32285fb515bSPavan Nikhilesh stats->rx_pkts = rte_event_dev_xstats_by_name_get(dev_id, 32385fb515bSPavan Nikhilesh "dev_rx", &total_ids[0]); 32485fb515bSPavan Nikhilesh stats->rx_dropped = rte_event_dev_xstats_by_name_get(dev_id, 32585fb515bSPavan Nikhilesh "dev_drop", &total_ids[1]); 32685fb515bSPavan Nikhilesh stats->tx_pkts = rte_event_dev_xstats_by_name_get(dev_id, 32785fb515bSPavan Nikhilesh "dev_tx", &total_ids[2]); 32885fb515bSPavan Nikhilesh for (i = 0; i < MAX_PORTS; i++) { 32985fb515bSPavan Nikhilesh char name[32]; 33085fb515bSPavan Nikhilesh snprintf(name, sizeof(name), "port_%u_rx", i); 33185fb515bSPavan Nikhilesh stats->port_rx_pkts[i] = rte_event_dev_xstats_by_name_get( 33285fb515bSPavan Nikhilesh dev_id, name, &port_rx_pkts_ids[i]); 33385fb515bSPavan Nikhilesh snprintf(name, sizeof(name), "port_%u_drop", i); 33485fb515bSPavan Nikhilesh stats->port_rx_dropped[i] = rte_event_dev_xstats_by_name_get( 33585fb515bSPavan Nikhilesh dev_id, name, &port_rx_dropped_ids[i]); 33685fb515bSPavan Nikhilesh snprintf(name, sizeof(name), "port_%u_inflight", i); 33785fb515bSPavan Nikhilesh stats->port_inflight[i] = rte_event_dev_xstats_by_name_get( 33885fb515bSPavan Nikhilesh dev_id, name, &port_inflight_ids[i]); 33985fb515bSPavan Nikhilesh snprintf(name, sizeof(name), "port_%u_tx", i); 34085fb515bSPavan Nikhilesh stats->port_tx_pkts[i] = rte_event_dev_xstats_by_name_get( 34185fb515bSPavan Nikhilesh dev_id, name, &port_tx_pkts_ids[i]); 34285fb515bSPavan Nikhilesh } 34385fb515bSPavan Nikhilesh for (i = 0; i < MAX_QIDS; i++) { 34485fb515bSPavan Nikhilesh char name[32]; 34585fb515bSPavan Nikhilesh snprintf(name, sizeof(name), "qid_%u_rx", i); 34685fb515bSPavan Nikhilesh stats->qid_rx_pkts[i] = rte_event_dev_xstats_by_name_get( 34785fb515bSPavan Nikhilesh dev_id, name, &qid_rx_pkts_ids[i]); 34885fb515bSPavan Nikhilesh snprintf(name, sizeof(name), "qid_%u_drop", i); 34985fb515bSPavan Nikhilesh stats->qid_rx_dropped[i] = rte_event_dev_xstats_by_name_get( 35085fb515bSPavan Nikhilesh dev_id, name, &qid_rx_dropped_ids[i]); 35185fb515bSPavan Nikhilesh snprintf(name, sizeof(name), "qid_%u_tx", i); 35285fb515bSPavan Nikhilesh stats->qid_tx_pkts[i] = rte_event_dev_xstats_by_name_get( 35385fb515bSPavan Nikhilesh dev_id, name, &qid_tx_pkts_ids[i]); 35485fb515bSPavan Nikhilesh } 35585fb515bSPavan Nikhilesh 35685fb515bSPavan Nikhilesh return 0; 35785fb515bSPavan Nikhilesh } 35885fb515bSPavan Nikhilesh 35985fb515bSPavan Nikhilesh /* run_prio_packet_test 36085fb515bSPavan Nikhilesh * This performs a basic packet priority check on the test instance passed in. 36185fb515bSPavan Nikhilesh * It is factored out of the main priority tests as the same tests must be 36285fb515bSPavan Nikhilesh * performed to ensure prioritization of each type of QID. 36385fb515bSPavan Nikhilesh * 36485fb515bSPavan Nikhilesh * Requirements: 36585fb515bSPavan Nikhilesh * - An initialized test structure, including mempool 36685fb515bSPavan Nikhilesh * - t->port[0] is initialized for both Enq / Deq of packets to the QID 36785fb515bSPavan Nikhilesh * - t->qid[0] is the QID to be tested 36885fb515bSPavan Nikhilesh * - if LB QID, the CQ must be mapped to the QID. 36985fb515bSPavan Nikhilesh */ 37085fb515bSPavan Nikhilesh static int 37185fb515bSPavan Nikhilesh run_prio_packet_test(struct test *t) 37285fb515bSPavan Nikhilesh { 37385fb515bSPavan Nikhilesh int err; 37485fb515bSPavan Nikhilesh const uint32_t MAGIC_SEQN[] = {4711, 1234}; 37585fb515bSPavan Nikhilesh const uint32_t PRIORITY[] = { 37685fb515bSPavan Nikhilesh RTE_EVENT_DEV_PRIORITY_NORMAL, 37785fb515bSPavan Nikhilesh RTE_EVENT_DEV_PRIORITY_HIGHEST 37885fb515bSPavan Nikhilesh }; 37985fb515bSPavan Nikhilesh unsigned int i; 38085fb515bSPavan Nikhilesh for (i = 0; i < RTE_DIM(MAGIC_SEQN); i++) { 38185fb515bSPavan Nikhilesh /* generate pkt and enqueue */ 38285fb515bSPavan Nikhilesh struct rte_event ev; 38385fb515bSPavan Nikhilesh struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool); 38485fb515bSPavan Nikhilesh if (!arp) { 38585fb515bSPavan Nikhilesh printf("%d: gen of pkt failed\n", __LINE__); 38685fb515bSPavan Nikhilesh return -1; 38785fb515bSPavan Nikhilesh } 38885fb515bSPavan Nikhilesh arp->seqn = MAGIC_SEQN[i]; 38985fb515bSPavan Nikhilesh 39085fb515bSPavan Nikhilesh ev = (struct rte_event){ 39185fb515bSPavan Nikhilesh .priority = PRIORITY[i], 39285fb515bSPavan Nikhilesh .op = RTE_EVENT_OP_NEW, 39385fb515bSPavan Nikhilesh .queue_id = t->qid[0], 39485fb515bSPavan Nikhilesh .mbuf = arp 39585fb515bSPavan Nikhilesh }; 39685fb515bSPavan Nikhilesh err = rte_event_enqueue_burst(evdev, t->port[0], &ev, 1); 3971b03e292SHarry van Haaren if (err != 1) { 39885fb515bSPavan Nikhilesh printf("%d: error failed to enqueue\n", __LINE__); 39985fb515bSPavan Nikhilesh return -1; 40085fb515bSPavan Nikhilesh } 40185fb515bSPavan Nikhilesh } 40285fb515bSPavan Nikhilesh 40385fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 40485fb515bSPavan Nikhilesh 40585fb515bSPavan Nikhilesh struct test_event_dev_stats stats; 40685fb515bSPavan Nikhilesh err = test_event_dev_stats_get(evdev, &stats); 40785fb515bSPavan Nikhilesh if (err) { 40885fb515bSPavan Nikhilesh printf("%d: error failed to get stats\n", __LINE__); 40985fb515bSPavan Nikhilesh return -1; 41085fb515bSPavan Nikhilesh } 41185fb515bSPavan Nikhilesh 41285fb515bSPavan Nikhilesh if (stats.port_rx_pkts[t->port[0]] != 2) { 41385fb515bSPavan Nikhilesh printf("%d: error stats incorrect for directed port\n", 41485fb515bSPavan Nikhilesh __LINE__); 41585fb515bSPavan Nikhilesh rte_event_dev_dump(evdev, stdout); 41685fb515bSPavan Nikhilesh return -1; 41785fb515bSPavan Nikhilesh } 41885fb515bSPavan Nikhilesh 41985fb515bSPavan Nikhilesh struct rte_event ev, ev2; 42085fb515bSPavan Nikhilesh uint32_t deq_pkts; 42185fb515bSPavan Nikhilesh deq_pkts = rte_event_dequeue_burst(evdev, t->port[0], &ev, 1, 0); 42285fb515bSPavan Nikhilesh if (deq_pkts != 1) { 42385fb515bSPavan Nikhilesh printf("%d: error failed to deq\n", __LINE__); 42485fb515bSPavan Nikhilesh rte_event_dev_dump(evdev, stdout); 42585fb515bSPavan Nikhilesh return -1; 42685fb515bSPavan Nikhilesh } 42785fb515bSPavan Nikhilesh if (ev.mbuf->seqn != MAGIC_SEQN[1]) { 42885fb515bSPavan Nikhilesh printf("%d: first packet out not highest priority\n", 42985fb515bSPavan Nikhilesh __LINE__); 43085fb515bSPavan Nikhilesh rte_event_dev_dump(evdev, stdout); 43185fb515bSPavan Nikhilesh return -1; 43285fb515bSPavan Nikhilesh } 43385fb515bSPavan Nikhilesh rte_pktmbuf_free(ev.mbuf); 43485fb515bSPavan Nikhilesh 43585fb515bSPavan Nikhilesh deq_pkts = rte_event_dequeue_burst(evdev, t->port[0], &ev2, 1, 0); 43685fb515bSPavan Nikhilesh if (deq_pkts != 1) { 43785fb515bSPavan Nikhilesh printf("%d: error failed to deq\n", __LINE__); 43885fb515bSPavan Nikhilesh rte_event_dev_dump(evdev, stdout); 43985fb515bSPavan Nikhilesh return -1; 44085fb515bSPavan Nikhilesh } 44185fb515bSPavan Nikhilesh if (ev2.mbuf->seqn != MAGIC_SEQN[0]) { 44285fb515bSPavan Nikhilesh printf("%d: second packet out not lower priority\n", 44385fb515bSPavan Nikhilesh __LINE__); 44485fb515bSPavan Nikhilesh rte_event_dev_dump(evdev, stdout); 44585fb515bSPavan Nikhilesh return -1; 44685fb515bSPavan Nikhilesh } 44785fb515bSPavan Nikhilesh rte_pktmbuf_free(ev2.mbuf); 44885fb515bSPavan Nikhilesh 44985fb515bSPavan Nikhilesh cleanup(t); 45085fb515bSPavan Nikhilesh return 0; 45185fb515bSPavan Nikhilesh } 45285fb515bSPavan Nikhilesh 45385fb515bSPavan Nikhilesh static int 45485fb515bSPavan Nikhilesh test_single_directed_packet(struct test *t) 45585fb515bSPavan Nikhilesh { 45685fb515bSPavan Nikhilesh const int rx_enq = 0; 45785fb515bSPavan Nikhilesh const int wrk_enq = 2; 45885fb515bSPavan Nikhilesh int err; 45985fb515bSPavan Nikhilesh 46085fb515bSPavan Nikhilesh /* Create instance with 3 directed QIDs going to 3 ports */ 46185fb515bSPavan Nikhilesh if (init(t, 3, 3) < 0 || 46285fb515bSPavan Nikhilesh create_ports(t, 3) < 0 || 46385fb515bSPavan Nikhilesh create_directed_qids(t, 3, t->port) < 0) 46485fb515bSPavan Nikhilesh return -1; 46585fb515bSPavan Nikhilesh 46685fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 46785fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 46885fb515bSPavan Nikhilesh return -1; 46985fb515bSPavan Nikhilesh } 47085fb515bSPavan Nikhilesh 47185fb515bSPavan Nikhilesh /************** FORWARD ****************/ 47285fb515bSPavan Nikhilesh struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool); 47385fb515bSPavan Nikhilesh struct rte_event ev = { 47485fb515bSPavan Nikhilesh .op = RTE_EVENT_OP_NEW, 47585fb515bSPavan Nikhilesh .queue_id = wrk_enq, 47685fb515bSPavan Nikhilesh .mbuf = arp, 47785fb515bSPavan Nikhilesh }; 47885fb515bSPavan Nikhilesh 47985fb515bSPavan Nikhilesh if (!arp) { 48085fb515bSPavan Nikhilesh printf("%d: gen of pkt failed\n", __LINE__); 48185fb515bSPavan Nikhilesh return -1; 48285fb515bSPavan Nikhilesh } 48385fb515bSPavan Nikhilesh 48485fb515bSPavan Nikhilesh const uint32_t MAGIC_SEQN = 4711; 48585fb515bSPavan Nikhilesh arp->seqn = MAGIC_SEQN; 48685fb515bSPavan Nikhilesh 48785fb515bSPavan Nikhilesh /* generate pkt and enqueue */ 48885fb515bSPavan Nikhilesh err = rte_event_enqueue_burst(evdev, rx_enq, &ev, 1); 4891b03e292SHarry van Haaren if (err != 1) { 49085fb515bSPavan Nikhilesh printf("%d: error failed to enqueue\n", __LINE__); 49185fb515bSPavan Nikhilesh return -1; 49285fb515bSPavan Nikhilesh } 49385fb515bSPavan Nikhilesh 49485fb515bSPavan Nikhilesh /* Run schedule() as dir packets may need to be re-ordered */ 49585fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 49685fb515bSPavan Nikhilesh 49785fb515bSPavan Nikhilesh struct test_event_dev_stats stats; 49885fb515bSPavan Nikhilesh err = test_event_dev_stats_get(evdev, &stats); 49985fb515bSPavan Nikhilesh if (err) { 50085fb515bSPavan Nikhilesh printf("%d: error failed to get stats\n", __LINE__); 50185fb515bSPavan Nikhilesh return -1; 50285fb515bSPavan Nikhilesh } 50385fb515bSPavan Nikhilesh 50485fb515bSPavan Nikhilesh if (stats.port_rx_pkts[rx_enq] != 1) { 50585fb515bSPavan Nikhilesh printf("%d: error stats incorrect for directed port\n", 50685fb515bSPavan Nikhilesh __LINE__); 50785fb515bSPavan Nikhilesh return -1; 50885fb515bSPavan Nikhilesh } 50985fb515bSPavan Nikhilesh 51085fb515bSPavan Nikhilesh uint32_t deq_pkts; 51185fb515bSPavan Nikhilesh deq_pkts = rte_event_dequeue_burst(evdev, wrk_enq, &ev, 1, 0); 51285fb515bSPavan Nikhilesh if (deq_pkts != 1) { 51385fb515bSPavan Nikhilesh printf("%d: error failed to deq\n", __LINE__); 51485fb515bSPavan Nikhilesh return -1; 51585fb515bSPavan Nikhilesh } 51685fb515bSPavan Nikhilesh 51785fb515bSPavan Nikhilesh err = test_event_dev_stats_get(evdev, &stats); 51885fb515bSPavan Nikhilesh if (stats.port_rx_pkts[wrk_enq] != 0 && 51985fb515bSPavan Nikhilesh stats.port_rx_pkts[wrk_enq] != 1) { 52085fb515bSPavan Nikhilesh printf("%d: error directed stats post-dequeue\n", __LINE__); 52185fb515bSPavan Nikhilesh return -1; 52285fb515bSPavan Nikhilesh } 52385fb515bSPavan Nikhilesh 52485fb515bSPavan Nikhilesh if (ev.mbuf->seqn != MAGIC_SEQN) { 52585fb515bSPavan Nikhilesh printf("%d: error magic sequence number not dequeued\n", 52685fb515bSPavan Nikhilesh __LINE__); 52785fb515bSPavan Nikhilesh return -1; 52885fb515bSPavan Nikhilesh } 52985fb515bSPavan Nikhilesh 53085fb515bSPavan Nikhilesh rte_pktmbuf_free(ev.mbuf); 53185fb515bSPavan Nikhilesh cleanup(t); 53285fb515bSPavan Nikhilesh return 0; 53385fb515bSPavan Nikhilesh } 53485fb515bSPavan Nikhilesh 53585fb515bSPavan Nikhilesh static int 53685fb515bSPavan Nikhilesh test_directed_forward_credits(struct test *t) 53785fb515bSPavan Nikhilesh { 53885fb515bSPavan Nikhilesh uint32_t i; 53985fb515bSPavan Nikhilesh int32_t err; 54085fb515bSPavan Nikhilesh 54185fb515bSPavan Nikhilesh if (init(t, 1, 1) < 0 || 54285fb515bSPavan Nikhilesh create_ports(t, 1) < 0 || 54385fb515bSPavan Nikhilesh create_directed_qids(t, 1, t->port) < 0) 54485fb515bSPavan Nikhilesh return -1; 54585fb515bSPavan Nikhilesh 54685fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 54785fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 54885fb515bSPavan Nikhilesh return -1; 54985fb515bSPavan Nikhilesh } 55085fb515bSPavan Nikhilesh 55185fb515bSPavan Nikhilesh struct rte_event ev = { 55285fb515bSPavan Nikhilesh .op = RTE_EVENT_OP_NEW, 55385fb515bSPavan Nikhilesh .queue_id = 0, 55485fb515bSPavan Nikhilesh }; 55585fb515bSPavan Nikhilesh 55685fb515bSPavan Nikhilesh for (i = 0; i < 1000; i++) { 55785fb515bSPavan Nikhilesh err = rte_event_enqueue_burst(evdev, 0, &ev, 1); 5581b03e292SHarry van Haaren if (err != 1) { 55985fb515bSPavan Nikhilesh printf("%d: error failed to enqueue\n", __LINE__); 56085fb515bSPavan Nikhilesh return -1; 56185fb515bSPavan Nikhilesh } 56285fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 56385fb515bSPavan Nikhilesh 56485fb515bSPavan Nikhilesh uint32_t deq_pkts; 56585fb515bSPavan Nikhilesh deq_pkts = rte_event_dequeue_burst(evdev, 0, &ev, 1, 0); 56685fb515bSPavan Nikhilesh if (deq_pkts != 1) { 56785fb515bSPavan Nikhilesh printf("%d: error failed to deq\n", __LINE__); 56885fb515bSPavan Nikhilesh return -1; 56985fb515bSPavan Nikhilesh } 57085fb515bSPavan Nikhilesh 57185fb515bSPavan Nikhilesh /* re-write event to be a forward, and continue looping it */ 57285fb515bSPavan Nikhilesh ev.op = RTE_EVENT_OP_FORWARD; 57385fb515bSPavan Nikhilesh } 57485fb515bSPavan Nikhilesh 57585fb515bSPavan Nikhilesh cleanup(t); 57685fb515bSPavan Nikhilesh return 0; 57785fb515bSPavan Nikhilesh } 57885fb515bSPavan Nikhilesh 57985fb515bSPavan Nikhilesh 58085fb515bSPavan Nikhilesh static int 58185fb515bSPavan Nikhilesh test_priority_directed(struct test *t) 58285fb515bSPavan Nikhilesh { 58385fb515bSPavan Nikhilesh if (init(t, 1, 1) < 0 || 58485fb515bSPavan Nikhilesh create_ports(t, 1) < 0 || 58585fb515bSPavan Nikhilesh create_directed_qids(t, 1, t->port) < 0) { 58685fb515bSPavan Nikhilesh printf("%d: Error initializing device\n", __LINE__); 58785fb515bSPavan Nikhilesh return -1; 58885fb515bSPavan Nikhilesh } 58985fb515bSPavan Nikhilesh 59085fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 59185fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 59285fb515bSPavan Nikhilesh return -1; 59385fb515bSPavan Nikhilesh } 59485fb515bSPavan Nikhilesh 59585fb515bSPavan Nikhilesh return run_prio_packet_test(t); 59685fb515bSPavan Nikhilesh } 59785fb515bSPavan Nikhilesh 59885fb515bSPavan Nikhilesh static int 59985fb515bSPavan Nikhilesh test_priority_atomic(struct test *t) 60085fb515bSPavan Nikhilesh { 60185fb515bSPavan Nikhilesh if (init(t, 1, 1) < 0 || 60285fb515bSPavan Nikhilesh create_ports(t, 1) < 0 || 60385fb515bSPavan Nikhilesh create_atomic_qids(t, 1) < 0) { 60485fb515bSPavan Nikhilesh printf("%d: Error initializing device\n", __LINE__); 60585fb515bSPavan Nikhilesh return -1; 60685fb515bSPavan Nikhilesh } 60785fb515bSPavan Nikhilesh 60885fb515bSPavan Nikhilesh /* map the QID */ 60985fb515bSPavan Nikhilesh if (rte_event_port_link(evdev, t->port[0], &t->qid[0], NULL, 1) != 1) { 61085fb515bSPavan Nikhilesh printf("%d: error mapping qid to port\n", __LINE__); 61185fb515bSPavan Nikhilesh return -1; 61285fb515bSPavan Nikhilesh } 61385fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 61485fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 61585fb515bSPavan Nikhilesh return -1; 61685fb515bSPavan Nikhilesh } 61785fb515bSPavan Nikhilesh 61885fb515bSPavan Nikhilesh return run_prio_packet_test(t); 61985fb515bSPavan Nikhilesh } 62085fb515bSPavan Nikhilesh 62185fb515bSPavan Nikhilesh static int 62285fb515bSPavan Nikhilesh test_priority_ordered(struct test *t) 62385fb515bSPavan Nikhilesh { 62485fb515bSPavan Nikhilesh if (init(t, 1, 1) < 0 || 62585fb515bSPavan Nikhilesh create_ports(t, 1) < 0 || 62685fb515bSPavan Nikhilesh create_ordered_qids(t, 1) < 0) { 62785fb515bSPavan Nikhilesh printf("%d: Error initializing device\n", __LINE__); 62885fb515bSPavan Nikhilesh return -1; 62985fb515bSPavan Nikhilesh } 63085fb515bSPavan Nikhilesh 63185fb515bSPavan Nikhilesh /* map the QID */ 63285fb515bSPavan Nikhilesh if (rte_event_port_link(evdev, t->port[0], &t->qid[0], NULL, 1) != 1) { 63385fb515bSPavan Nikhilesh printf("%d: error mapping qid to port\n", __LINE__); 63485fb515bSPavan Nikhilesh return -1; 63585fb515bSPavan Nikhilesh } 63685fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 63785fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 63885fb515bSPavan Nikhilesh return -1; 63985fb515bSPavan Nikhilesh } 64085fb515bSPavan Nikhilesh 64185fb515bSPavan Nikhilesh return run_prio_packet_test(t); 64285fb515bSPavan Nikhilesh } 64385fb515bSPavan Nikhilesh 64485fb515bSPavan Nikhilesh static int 64585fb515bSPavan Nikhilesh test_priority_unordered(struct test *t) 64685fb515bSPavan Nikhilesh { 64785fb515bSPavan Nikhilesh if (init(t, 1, 1) < 0 || 64885fb515bSPavan Nikhilesh create_ports(t, 1) < 0 || 64985fb515bSPavan Nikhilesh create_unordered_qids(t, 1) < 0) { 65085fb515bSPavan Nikhilesh printf("%d: Error initializing device\n", __LINE__); 65185fb515bSPavan Nikhilesh return -1; 65285fb515bSPavan Nikhilesh } 65385fb515bSPavan Nikhilesh 65485fb515bSPavan Nikhilesh /* map the QID */ 65585fb515bSPavan Nikhilesh if (rte_event_port_link(evdev, t->port[0], &t->qid[0], NULL, 1) != 1) { 65685fb515bSPavan Nikhilesh printf("%d: error mapping qid to port\n", __LINE__); 65785fb515bSPavan Nikhilesh return -1; 65885fb515bSPavan Nikhilesh } 65985fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 66085fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 66185fb515bSPavan Nikhilesh return -1; 66285fb515bSPavan Nikhilesh } 66385fb515bSPavan Nikhilesh 66485fb515bSPavan Nikhilesh return run_prio_packet_test(t); 66585fb515bSPavan Nikhilesh } 66685fb515bSPavan Nikhilesh 66785fb515bSPavan Nikhilesh static int 66885fb515bSPavan Nikhilesh burst_packets(struct test *t) 66985fb515bSPavan Nikhilesh { 67085fb515bSPavan Nikhilesh /************** CONFIG ****************/ 67185fb515bSPavan Nikhilesh uint32_t i; 67285fb515bSPavan Nikhilesh int err; 67385fb515bSPavan Nikhilesh int ret; 67485fb515bSPavan Nikhilesh 67585fb515bSPavan Nikhilesh /* Create instance with 2 ports and 2 queues */ 67685fb515bSPavan Nikhilesh if (init(t, 2, 2) < 0 || 67785fb515bSPavan Nikhilesh create_ports(t, 2) < 0 || 67885fb515bSPavan Nikhilesh create_atomic_qids(t, 2) < 0) { 67985fb515bSPavan Nikhilesh printf("%d: Error initializing device\n", __LINE__); 68085fb515bSPavan Nikhilesh return -1; 68185fb515bSPavan Nikhilesh } 68285fb515bSPavan Nikhilesh 68385fb515bSPavan Nikhilesh /* CQ mapping to QID */ 68485fb515bSPavan Nikhilesh ret = rte_event_port_link(evdev, t->port[0], &t->qid[0], NULL, 1); 68585fb515bSPavan Nikhilesh if (ret != 1) { 68685fb515bSPavan Nikhilesh printf("%d: error mapping lb qid0\n", __LINE__); 68785fb515bSPavan Nikhilesh return -1; 68885fb515bSPavan Nikhilesh } 68985fb515bSPavan Nikhilesh ret = rte_event_port_link(evdev, t->port[1], &t->qid[1], NULL, 1); 69085fb515bSPavan Nikhilesh if (ret != 1) { 69185fb515bSPavan Nikhilesh printf("%d: error mapping lb qid1\n", __LINE__); 69285fb515bSPavan Nikhilesh return -1; 69385fb515bSPavan Nikhilesh } 69485fb515bSPavan Nikhilesh 69585fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 69685fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 69785fb515bSPavan Nikhilesh return -1; 69885fb515bSPavan Nikhilesh } 69985fb515bSPavan Nikhilesh 70085fb515bSPavan Nikhilesh /************** FORWARD ****************/ 70185fb515bSPavan Nikhilesh const uint32_t rx_port = 0; 70285fb515bSPavan Nikhilesh const uint32_t NUM_PKTS = 2; 70385fb515bSPavan Nikhilesh 70485fb515bSPavan Nikhilesh for (i = 0; i < NUM_PKTS; i++) { 70585fb515bSPavan Nikhilesh struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool); 70685fb515bSPavan Nikhilesh if (!arp) { 70785fb515bSPavan Nikhilesh printf("%d: error generating pkt\n", __LINE__); 70885fb515bSPavan Nikhilesh return -1; 70985fb515bSPavan Nikhilesh } 71085fb515bSPavan Nikhilesh 71185fb515bSPavan Nikhilesh struct rte_event ev = { 71285fb515bSPavan Nikhilesh .op = RTE_EVENT_OP_NEW, 71385fb515bSPavan Nikhilesh .queue_id = i % 2, 71485fb515bSPavan Nikhilesh .flow_id = i % 3, 71585fb515bSPavan Nikhilesh .mbuf = arp, 71685fb515bSPavan Nikhilesh }; 71785fb515bSPavan Nikhilesh /* generate pkt and enqueue */ 71885fb515bSPavan Nikhilesh err = rte_event_enqueue_burst(evdev, t->port[rx_port], &ev, 1); 7191b03e292SHarry van Haaren if (err != 1) { 72085fb515bSPavan Nikhilesh printf("%d: Failed to enqueue\n", __LINE__); 72185fb515bSPavan Nikhilesh return -1; 72285fb515bSPavan Nikhilesh } 72385fb515bSPavan Nikhilesh } 72485fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 72585fb515bSPavan Nikhilesh 72685fb515bSPavan Nikhilesh /* Check stats for all NUM_PKTS arrived to sched core */ 72785fb515bSPavan Nikhilesh struct test_event_dev_stats stats; 72885fb515bSPavan Nikhilesh 72985fb515bSPavan Nikhilesh err = test_event_dev_stats_get(evdev, &stats); 73085fb515bSPavan Nikhilesh if (err) { 73185fb515bSPavan Nikhilesh printf("%d: failed to get stats\n", __LINE__); 73285fb515bSPavan Nikhilesh return -1; 73385fb515bSPavan Nikhilesh } 73485fb515bSPavan Nikhilesh if (stats.rx_pkts != NUM_PKTS || stats.tx_pkts != NUM_PKTS) { 73585fb515bSPavan Nikhilesh printf("%d: Sched core didn't receive all %d pkts\n", 73685fb515bSPavan Nikhilesh __LINE__, NUM_PKTS); 73785fb515bSPavan Nikhilesh rte_event_dev_dump(evdev, stdout); 73885fb515bSPavan Nikhilesh return -1; 73985fb515bSPavan Nikhilesh } 74085fb515bSPavan Nikhilesh 74185fb515bSPavan Nikhilesh uint32_t deq_pkts; 74285fb515bSPavan Nikhilesh int p; 74385fb515bSPavan Nikhilesh 74485fb515bSPavan Nikhilesh deq_pkts = 0; 74585fb515bSPavan Nikhilesh /******** DEQ QID 1 *******/ 74685fb515bSPavan Nikhilesh do { 74785fb515bSPavan Nikhilesh struct rte_event ev; 74885fb515bSPavan Nikhilesh p = rte_event_dequeue_burst(evdev, t->port[0], &ev, 1, 0); 74985fb515bSPavan Nikhilesh deq_pkts += p; 75085fb515bSPavan Nikhilesh rte_pktmbuf_free(ev.mbuf); 75185fb515bSPavan Nikhilesh } while (p); 75285fb515bSPavan Nikhilesh 75385fb515bSPavan Nikhilesh if (deq_pkts != NUM_PKTS/2) { 75485fb515bSPavan Nikhilesh printf("%d: Half of NUM_PKTS didn't arrive at port 1\n", 75585fb515bSPavan Nikhilesh __LINE__); 75685fb515bSPavan Nikhilesh return -1; 75785fb515bSPavan Nikhilesh } 75885fb515bSPavan Nikhilesh 75985fb515bSPavan Nikhilesh /******** DEQ QID 2 *******/ 76085fb515bSPavan Nikhilesh deq_pkts = 0; 76185fb515bSPavan Nikhilesh do { 76285fb515bSPavan Nikhilesh struct rte_event ev; 76385fb515bSPavan Nikhilesh p = rte_event_dequeue_burst(evdev, t->port[1], &ev, 1, 0); 76485fb515bSPavan Nikhilesh deq_pkts += p; 76585fb515bSPavan Nikhilesh rte_pktmbuf_free(ev.mbuf); 76685fb515bSPavan Nikhilesh } while (p); 76785fb515bSPavan Nikhilesh if (deq_pkts != NUM_PKTS/2) { 76885fb515bSPavan Nikhilesh printf("%d: Half of NUM_PKTS didn't arrive at port 2\n", 76985fb515bSPavan Nikhilesh __LINE__); 77085fb515bSPavan Nikhilesh return -1; 77185fb515bSPavan Nikhilesh } 77285fb515bSPavan Nikhilesh 77385fb515bSPavan Nikhilesh cleanup(t); 77485fb515bSPavan Nikhilesh return 0; 77585fb515bSPavan Nikhilesh } 77685fb515bSPavan Nikhilesh 77785fb515bSPavan Nikhilesh static int 77885fb515bSPavan Nikhilesh abuse_inflights(struct test *t) 77985fb515bSPavan Nikhilesh { 78085fb515bSPavan Nikhilesh const int rx_enq = 0; 78185fb515bSPavan Nikhilesh const int wrk_enq = 2; 78285fb515bSPavan Nikhilesh int err; 78385fb515bSPavan Nikhilesh 78485fb515bSPavan Nikhilesh /* Create instance with 4 ports */ 78585fb515bSPavan Nikhilesh if (init(t, 1, 4) < 0 || 78685fb515bSPavan Nikhilesh create_ports(t, 4) < 0 || 78785fb515bSPavan Nikhilesh create_atomic_qids(t, 1) < 0) { 78885fb515bSPavan Nikhilesh printf("%d: Error initializing device\n", __LINE__); 78985fb515bSPavan Nikhilesh return -1; 79085fb515bSPavan Nikhilesh } 79185fb515bSPavan Nikhilesh 79285fb515bSPavan Nikhilesh /* CQ mapping to QID */ 79385fb515bSPavan Nikhilesh err = rte_event_port_link(evdev, t->port[wrk_enq], NULL, NULL, 0); 79485fb515bSPavan Nikhilesh if (err != 1) { 79585fb515bSPavan Nikhilesh printf("%d: error mapping lb qid\n", __LINE__); 79685fb515bSPavan Nikhilesh cleanup(t); 79785fb515bSPavan Nikhilesh return -1; 79885fb515bSPavan Nikhilesh } 79985fb515bSPavan Nikhilesh 80085fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 80185fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 80285fb515bSPavan Nikhilesh return -1; 80385fb515bSPavan Nikhilesh } 80485fb515bSPavan Nikhilesh 80585fb515bSPavan Nikhilesh /* Enqueue op only */ 80685fb515bSPavan Nikhilesh err = rte_event_enqueue_burst(evdev, t->port[rx_enq], &release_ev, 1); 8071b03e292SHarry van Haaren if (err != 1) { 80885fb515bSPavan Nikhilesh printf("%d: Failed to enqueue\n", __LINE__); 80985fb515bSPavan Nikhilesh return -1; 81085fb515bSPavan Nikhilesh } 81185fb515bSPavan Nikhilesh 81285fb515bSPavan Nikhilesh /* schedule */ 81385fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 81485fb515bSPavan Nikhilesh 81585fb515bSPavan Nikhilesh struct test_event_dev_stats stats; 81685fb515bSPavan Nikhilesh 81785fb515bSPavan Nikhilesh err = test_event_dev_stats_get(evdev, &stats); 81885fb515bSPavan Nikhilesh if (err) { 81985fb515bSPavan Nikhilesh printf("%d: failed to get stats\n", __LINE__); 82085fb515bSPavan Nikhilesh return -1; 82185fb515bSPavan Nikhilesh } 82285fb515bSPavan Nikhilesh 82385fb515bSPavan Nikhilesh if (stats.rx_pkts != 0 || 82485fb515bSPavan Nikhilesh stats.tx_pkts != 0 || 82585fb515bSPavan Nikhilesh stats.port_inflight[wrk_enq] != 0) { 82685fb515bSPavan Nikhilesh printf("%d: Sched core didn't handle pkt as expected\n", 82785fb515bSPavan Nikhilesh __LINE__); 82885fb515bSPavan Nikhilesh return -1; 82985fb515bSPavan Nikhilesh } 83085fb515bSPavan Nikhilesh 83185fb515bSPavan Nikhilesh cleanup(t); 83285fb515bSPavan Nikhilesh return 0; 83385fb515bSPavan Nikhilesh } 83485fb515bSPavan Nikhilesh 83585fb515bSPavan Nikhilesh static int 83685fb515bSPavan Nikhilesh xstats_tests(struct test *t) 83785fb515bSPavan Nikhilesh { 83885fb515bSPavan Nikhilesh const int wrk_enq = 2; 83985fb515bSPavan Nikhilesh int err; 84085fb515bSPavan Nikhilesh 84185fb515bSPavan Nikhilesh /* Create instance with 4 ports */ 84285fb515bSPavan Nikhilesh if (init(t, 1, 4) < 0 || 84385fb515bSPavan Nikhilesh create_ports(t, 4) < 0 || 84485fb515bSPavan Nikhilesh create_atomic_qids(t, 1) < 0) { 84585fb515bSPavan Nikhilesh printf("%d: Error initializing device\n", __LINE__); 84685fb515bSPavan Nikhilesh return -1; 84785fb515bSPavan Nikhilesh } 84885fb515bSPavan Nikhilesh 84985fb515bSPavan Nikhilesh /* CQ mapping to QID */ 85085fb515bSPavan Nikhilesh err = rte_event_port_link(evdev, t->port[wrk_enq], NULL, NULL, 0); 85185fb515bSPavan Nikhilesh if (err != 1) { 85285fb515bSPavan Nikhilesh printf("%d: error mapping lb qid\n", __LINE__); 85385fb515bSPavan Nikhilesh cleanup(t); 85485fb515bSPavan Nikhilesh return -1; 85585fb515bSPavan Nikhilesh } 85685fb515bSPavan Nikhilesh 85785fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 85885fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 85985fb515bSPavan Nikhilesh return -1; 86085fb515bSPavan Nikhilesh } 86185fb515bSPavan Nikhilesh 86285fb515bSPavan Nikhilesh const uint32_t XSTATS_MAX = 1024; 86385fb515bSPavan Nikhilesh 86485fb515bSPavan Nikhilesh uint32_t i; 86585fb515bSPavan Nikhilesh uint32_t ids[XSTATS_MAX]; 86685fb515bSPavan Nikhilesh uint64_t values[XSTATS_MAX]; 86785fb515bSPavan Nikhilesh struct rte_event_dev_xstats_name xstats_names[XSTATS_MAX]; 86885fb515bSPavan Nikhilesh 86985fb515bSPavan Nikhilesh for (i = 0; i < XSTATS_MAX; i++) 87085fb515bSPavan Nikhilesh ids[i] = i; 87185fb515bSPavan Nikhilesh 87285fb515bSPavan Nikhilesh /* Device names / values */ 87385fb515bSPavan Nikhilesh int ret = rte_event_dev_xstats_names_get(evdev, 87485fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_DEVICE, 87585fb515bSPavan Nikhilesh 0, xstats_names, ids, XSTATS_MAX); 87685fb515bSPavan Nikhilesh if (ret != 6) { 87785fb515bSPavan Nikhilesh printf("%d: expected 6 stats, got return %d\n", __LINE__, ret); 87885fb515bSPavan Nikhilesh return -1; 87985fb515bSPavan Nikhilesh } 88085fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_get(evdev, 88185fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_DEVICE, 88285fb515bSPavan Nikhilesh 0, ids, values, ret); 88385fb515bSPavan Nikhilesh if (ret != 6) { 88485fb515bSPavan Nikhilesh printf("%d: expected 6 stats, got return %d\n", __LINE__, ret); 88585fb515bSPavan Nikhilesh return -1; 88685fb515bSPavan Nikhilesh } 88785fb515bSPavan Nikhilesh 88885fb515bSPavan Nikhilesh /* Port names / values */ 88985fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_names_get(evdev, 89085fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_PORT, 0, 89185fb515bSPavan Nikhilesh xstats_names, ids, XSTATS_MAX); 89285fb515bSPavan Nikhilesh if (ret != 21) { 89385fb515bSPavan Nikhilesh printf("%d: expected 21 stats, got return %d\n", __LINE__, ret); 89485fb515bSPavan Nikhilesh return -1; 89585fb515bSPavan Nikhilesh } 89685fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_get(evdev, 89785fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_PORT, 0, 89885fb515bSPavan Nikhilesh ids, values, ret); 89985fb515bSPavan Nikhilesh if (ret != 21) { 90085fb515bSPavan Nikhilesh printf("%d: expected 21 stats, got return %d\n", __LINE__, ret); 90185fb515bSPavan Nikhilesh return -1; 90285fb515bSPavan Nikhilesh } 90385fb515bSPavan Nikhilesh 90485fb515bSPavan Nikhilesh /* Queue names / values */ 90585fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_names_get(evdev, 90685fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_QUEUE, 90785fb515bSPavan Nikhilesh 0, xstats_names, ids, XSTATS_MAX); 90885fb515bSPavan Nikhilesh if (ret != 16) { 90985fb515bSPavan Nikhilesh printf("%d: expected 16 stats, got return %d\n", __LINE__, ret); 91085fb515bSPavan Nikhilesh return -1; 91185fb515bSPavan Nikhilesh } 91285fb515bSPavan Nikhilesh 91385fb515bSPavan Nikhilesh /* NEGATIVE TEST: with wrong queue passed, 0 stats should be returned */ 91485fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_get(evdev, 91585fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_QUEUE, 91685fb515bSPavan Nikhilesh 1, ids, values, ret); 91785fb515bSPavan Nikhilesh if (ret != -EINVAL) { 91885fb515bSPavan Nikhilesh printf("%d: expected 0 stats, got return %d\n", __LINE__, ret); 91985fb515bSPavan Nikhilesh return -1; 92085fb515bSPavan Nikhilesh } 92185fb515bSPavan Nikhilesh 92285fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_get(evdev, 92385fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_QUEUE, 92485fb515bSPavan Nikhilesh 0, ids, values, ret); 92585fb515bSPavan Nikhilesh if (ret != 16) { 92685fb515bSPavan Nikhilesh printf("%d: expected 16 stats, got return %d\n", __LINE__, ret); 92785fb515bSPavan Nikhilesh return -1; 92885fb515bSPavan Nikhilesh } 92985fb515bSPavan Nikhilesh 93085fb515bSPavan Nikhilesh /* enqueue packets to check values */ 93185fb515bSPavan Nikhilesh for (i = 0; i < 3; i++) { 93285fb515bSPavan Nikhilesh struct rte_event ev; 93385fb515bSPavan Nikhilesh struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool); 93485fb515bSPavan Nikhilesh if (!arp) { 93585fb515bSPavan Nikhilesh printf("%d: gen of pkt failed\n", __LINE__); 93685fb515bSPavan Nikhilesh return -1; 93785fb515bSPavan Nikhilesh } 93885fb515bSPavan Nikhilesh ev.queue_id = t->qid[i]; 93985fb515bSPavan Nikhilesh ev.op = RTE_EVENT_OP_NEW; 94085fb515bSPavan Nikhilesh ev.mbuf = arp; 94185fb515bSPavan Nikhilesh ev.flow_id = 7; 94285fb515bSPavan Nikhilesh arp->seqn = i; 94385fb515bSPavan Nikhilesh 94485fb515bSPavan Nikhilesh int err = rte_event_enqueue_burst(evdev, t->port[0], &ev, 1); 94585fb515bSPavan Nikhilesh if (err != 1) { 94685fb515bSPavan Nikhilesh printf("%d: Failed to enqueue\n", __LINE__); 94785fb515bSPavan Nikhilesh return -1; 94885fb515bSPavan Nikhilesh } 94985fb515bSPavan Nikhilesh } 95085fb515bSPavan Nikhilesh 95185fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 95285fb515bSPavan Nikhilesh 95385fb515bSPavan Nikhilesh /* Device names / values */ 95485fb515bSPavan Nikhilesh int num_stats = rte_event_dev_xstats_names_get(evdev, 95585fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_DEVICE, 0, 95685fb515bSPavan Nikhilesh xstats_names, ids, XSTATS_MAX); 95785fb515bSPavan Nikhilesh if (num_stats < 0) 95885fb515bSPavan Nikhilesh goto fail; 95985fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_get(evdev, 96085fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_DEVICE, 96185fb515bSPavan Nikhilesh 0, ids, values, num_stats); 96285fb515bSPavan Nikhilesh static const uint64_t expected[] = {3, 3, 0, 1, 0, 0}; 96385fb515bSPavan Nikhilesh for (i = 0; (signed int)i < ret; i++) { 96485fb515bSPavan Nikhilesh if (expected[i] != values[i]) { 96585fb515bSPavan Nikhilesh printf( 96685fb515bSPavan Nikhilesh "%d Error xstat %d (id %d) %s : %"PRIu64 96785fb515bSPavan Nikhilesh ", expect %"PRIu64"\n", 96885fb515bSPavan Nikhilesh __LINE__, i, ids[i], xstats_names[i].name, 96985fb515bSPavan Nikhilesh values[i], expected[i]); 97085fb515bSPavan Nikhilesh goto fail; 97185fb515bSPavan Nikhilesh } 97285fb515bSPavan Nikhilesh } 97385fb515bSPavan Nikhilesh 97485fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_reset(evdev, RTE_EVENT_DEV_XSTATS_DEVICE, 97585fb515bSPavan Nikhilesh 0, NULL, 0); 97685fb515bSPavan Nikhilesh 97785fb515bSPavan Nikhilesh /* ensure reset statistics are zero-ed */ 97885fb515bSPavan Nikhilesh static const uint64_t expected_zero[] = {0, 0, 0, 0, 0, 0}; 97985fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_get(evdev, 98085fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_DEVICE, 98185fb515bSPavan Nikhilesh 0, ids, values, num_stats); 98285fb515bSPavan Nikhilesh for (i = 0; (signed int)i < ret; i++) { 98385fb515bSPavan Nikhilesh if (expected_zero[i] != values[i]) { 98485fb515bSPavan Nikhilesh printf( 98585fb515bSPavan Nikhilesh "%d Error, xstat %d (id %d) %s : %"PRIu64 98685fb515bSPavan Nikhilesh ", expect %"PRIu64"\n", 98785fb515bSPavan Nikhilesh __LINE__, i, ids[i], xstats_names[i].name, 98885fb515bSPavan Nikhilesh values[i], expected_zero[i]); 98985fb515bSPavan Nikhilesh goto fail; 99085fb515bSPavan Nikhilesh } 99185fb515bSPavan Nikhilesh } 99285fb515bSPavan Nikhilesh 99385fb515bSPavan Nikhilesh /* port reset checks */ 99485fb515bSPavan Nikhilesh num_stats = rte_event_dev_xstats_names_get(evdev, 99585fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_PORT, 0, 99685fb515bSPavan Nikhilesh xstats_names, ids, XSTATS_MAX); 99785fb515bSPavan Nikhilesh if (num_stats < 0) 99885fb515bSPavan Nikhilesh goto fail; 99985fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_get(evdev, RTE_EVENT_DEV_XSTATS_PORT, 100085fb515bSPavan Nikhilesh 0, ids, values, num_stats); 100185fb515bSPavan Nikhilesh 100285fb515bSPavan Nikhilesh static const uint64_t port_expected[] = { 100385fb515bSPavan Nikhilesh 3 /* rx */, 100485fb515bSPavan Nikhilesh 0 /* tx */, 100585fb515bSPavan Nikhilesh 0 /* drop */, 100685fb515bSPavan Nikhilesh 0 /* inflights */, 100785fb515bSPavan Nikhilesh 0 /* avg pkt cycles */, 100885fb515bSPavan Nikhilesh 29 /* credits */, 100985fb515bSPavan Nikhilesh 0 /* rx ring used */, 101085fb515bSPavan Nikhilesh 4096 /* rx ring free */, 101185fb515bSPavan Nikhilesh 0 /* cq ring used */, 101285fb515bSPavan Nikhilesh 32 /* cq ring free */, 101385fb515bSPavan Nikhilesh 0 /* dequeue calls */, 101485fb515bSPavan Nikhilesh /* 10 dequeue burst buckets */ 101585fb515bSPavan Nikhilesh 0, 0, 0, 0, 0, 101685fb515bSPavan Nikhilesh 0, 0, 0, 0, 0, 101785fb515bSPavan Nikhilesh }; 101885fb515bSPavan Nikhilesh if (ret != RTE_DIM(port_expected)) { 101985fb515bSPavan Nikhilesh printf( 102085fb515bSPavan Nikhilesh "%s %d: wrong number of port stats (%d), expected %zu\n", 102185fb515bSPavan Nikhilesh __func__, __LINE__, ret, RTE_DIM(port_expected)); 102285fb515bSPavan Nikhilesh } 102385fb515bSPavan Nikhilesh 102485fb515bSPavan Nikhilesh for (i = 0; (signed int)i < ret; i++) { 102585fb515bSPavan Nikhilesh if (port_expected[i] != values[i]) { 102685fb515bSPavan Nikhilesh printf( 102785fb515bSPavan Nikhilesh "%s : %d: Error stat %s is %"PRIu64 102885fb515bSPavan Nikhilesh ", expected %"PRIu64"\n", 102985fb515bSPavan Nikhilesh __func__, __LINE__, xstats_names[i].name, 103085fb515bSPavan Nikhilesh values[i], port_expected[i]); 103185fb515bSPavan Nikhilesh goto fail; 103285fb515bSPavan Nikhilesh } 103385fb515bSPavan Nikhilesh } 103485fb515bSPavan Nikhilesh 103585fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_reset(evdev, RTE_EVENT_DEV_XSTATS_PORT, 103685fb515bSPavan Nikhilesh 0, NULL, 0); 103785fb515bSPavan Nikhilesh 103885fb515bSPavan Nikhilesh /* ensure reset statistics are zero-ed */ 103985fb515bSPavan Nikhilesh static const uint64_t port_expected_zero[] = { 104085fb515bSPavan Nikhilesh 0 /* rx */, 104185fb515bSPavan Nikhilesh 0 /* tx */, 104285fb515bSPavan Nikhilesh 0 /* drop */, 104385fb515bSPavan Nikhilesh 0 /* inflights */, 104485fb515bSPavan Nikhilesh 0 /* avg pkt cycles */, 104585fb515bSPavan Nikhilesh 29 /* credits */, 104685fb515bSPavan Nikhilesh 0 /* rx ring used */, 104785fb515bSPavan Nikhilesh 4096 /* rx ring free */, 104885fb515bSPavan Nikhilesh 0 /* cq ring used */, 104985fb515bSPavan Nikhilesh 32 /* cq ring free */, 105085fb515bSPavan Nikhilesh 0 /* dequeue calls */, 105185fb515bSPavan Nikhilesh /* 10 dequeue burst buckets */ 105285fb515bSPavan Nikhilesh 0, 0, 0, 0, 0, 105385fb515bSPavan Nikhilesh 0, 0, 0, 0, 0, 105485fb515bSPavan Nikhilesh }; 105585fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_get(evdev, 105685fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_PORT, 105785fb515bSPavan Nikhilesh 0, ids, values, num_stats); 105885fb515bSPavan Nikhilesh for (i = 0; (signed int)i < ret; i++) { 105985fb515bSPavan Nikhilesh if (port_expected_zero[i] != values[i]) { 106085fb515bSPavan Nikhilesh printf( 106185fb515bSPavan Nikhilesh "%d, Error, xstat %d (id %d) %s : %"PRIu64 106285fb515bSPavan Nikhilesh ", expect %"PRIu64"\n", 106385fb515bSPavan Nikhilesh __LINE__, i, ids[i], xstats_names[i].name, 106485fb515bSPavan Nikhilesh values[i], port_expected_zero[i]); 106585fb515bSPavan Nikhilesh goto fail; 106685fb515bSPavan Nikhilesh } 106785fb515bSPavan Nikhilesh } 106885fb515bSPavan Nikhilesh 106985fb515bSPavan Nikhilesh /* QUEUE STATS TESTS */ 107085fb515bSPavan Nikhilesh num_stats = rte_event_dev_xstats_names_get(evdev, 107185fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_QUEUE, 0, 107285fb515bSPavan Nikhilesh xstats_names, ids, XSTATS_MAX); 107385fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_get(evdev, RTE_EVENT_DEV_XSTATS_QUEUE, 107485fb515bSPavan Nikhilesh 0, ids, values, num_stats); 107585fb515bSPavan Nikhilesh if (ret < 0) { 107685fb515bSPavan Nikhilesh printf("xstats get returned %d\n", ret); 107785fb515bSPavan Nikhilesh goto fail; 107885fb515bSPavan Nikhilesh } 107985fb515bSPavan Nikhilesh if ((unsigned int)ret > XSTATS_MAX) 108085fb515bSPavan Nikhilesh printf("%s %d: more xstats available than space\n", 108185fb515bSPavan Nikhilesh __func__, __LINE__); 108285fb515bSPavan Nikhilesh 108385fb515bSPavan Nikhilesh static const uint64_t queue_expected[] = { 108485fb515bSPavan Nikhilesh 3 /* rx */, 108585fb515bSPavan Nikhilesh 3 /* tx */, 108685fb515bSPavan Nikhilesh 0 /* drop */, 108785fb515bSPavan Nikhilesh 3 /* inflights */, 108885fb515bSPavan Nikhilesh 0, 0, 0, 0, /* iq 0, 1, 2, 3 used */ 108985fb515bSPavan Nikhilesh /* QID-to-Port: pinned_flows, packets */ 109085fb515bSPavan Nikhilesh 0, 0, 109185fb515bSPavan Nikhilesh 0, 0, 109285fb515bSPavan Nikhilesh 1, 3, 109385fb515bSPavan Nikhilesh 0, 0, 109485fb515bSPavan Nikhilesh }; 109585fb515bSPavan Nikhilesh for (i = 0; (signed int)i < ret; i++) { 109685fb515bSPavan Nikhilesh if (queue_expected[i] != values[i]) { 109785fb515bSPavan Nikhilesh printf( 109885fb515bSPavan Nikhilesh "%d, Error, xstat %d (id %d) %s : %"PRIu64 109985fb515bSPavan Nikhilesh ", expect %"PRIu64"\n", 110085fb515bSPavan Nikhilesh __LINE__, i, ids[i], xstats_names[i].name, 110185fb515bSPavan Nikhilesh values[i], queue_expected[i]); 110285fb515bSPavan Nikhilesh goto fail; 110385fb515bSPavan Nikhilesh } 110485fb515bSPavan Nikhilesh } 110585fb515bSPavan Nikhilesh 110685fb515bSPavan Nikhilesh /* Reset the queue stats here */ 110785fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_reset(evdev, 110885fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_QUEUE, 0, 110985fb515bSPavan Nikhilesh NULL, 111085fb515bSPavan Nikhilesh 0); 111185fb515bSPavan Nikhilesh 111285fb515bSPavan Nikhilesh /* Verify that the resetable stats are reset, and others are not */ 111385fb515bSPavan Nikhilesh static const uint64_t queue_expected_zero[] = { 111485fb515bSPavan Nikhilesh 0 /* rx */, 111585fb515bSPavan Nikhilesh 0 /* tx */, 111685fb515bSPavan Nikhilesh 0 /* drop */, 111785fb515bSPavan Nikhilesh 3 /* inflight */, 111885fb515bSPavan Nikhilesh 0, 0, 0, 0, /* 4 iq used */ 111985fb515bSPavan Nikhilesh /* QID-to-Port: pinned_flows, packets */ 112085fb515bSPavan Nikhilesh 0, 0, 112185fb515bSPavan Nikhilesh 0, 0, 112285fb515bSPavan Nikhilesh 1, 0, 112385fb515bSPavan Nikhilesh 0, 0, 112485fb515bSPavan Nikhilesh }; 112585fb515bSPavan Nikhilesh 112685fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_get(evdev, RTE_EVENT_DEV_XSTATS_QUEUE, 0, 112785fb515bSPavan Nikhilesh ids, values, num_stats); 112885fb515bSPavan Nikhilesh int fails = 0; 112985fb515bSPavan Nikhilesh for (i = 0; (signed int)i < ret; i++) { 113085fb515bSPavan Nikhilesh if (queue_expected_zero[i] != values[i]) { 113185fb515bSPavan Nikhilesh printf( 113285fb515bSPavan Nikhilesh "%d, Error, xstat %d (id %d) %s : %"PRIu64 113385fb515bSPavan Nikhilesh ", expect %"PRIu64"\n", 113485fb515bSPavan Nikhilesh __LINE__, i, ids[i], xstats_names[i].name, 113585fb515bSPavan Nikhilesh values[i], queue_expected_zero[i]); 113685fb515bSPavan Nikhilesh fails++; 113785fb515bSPavan Nikhilesh } 113885fb515bSPavan Nikhilesh } 113985fb515bSPavan Nikhilesh if (fails) { 114085fb515bSPavan Nikhilesh printf("%d : %d of values were not as expected above\n", 114185fb515bSPavan Nikhilesh __LINE__, fails); 114285fb515bSPavan Nikhilesh goto fail; 114385fb515bSPavan Nikhilesh } 114485fb515bSPavan Nikhilesh 114585fb515bSPavan Nikhilesh cleanup(t); 114685fb515bSPavan Nikhilesh return 0; 114785fb515bSPavan Nikhilesh 114885fb515bSPavan Nikhilesh fail: 114985fb515bSPavan Nikhilesh rte_event_dev_dump(0, stdout); 115085fb515bSPavan Nikhilesh cleanup(t); 115185fb515bSPavan Nikhilesh return -1; 115285fb515bSPavan Nikhilesh } 115385fb515bSPavan Nikhilesh 115485fb515bSPavan Nikhilesh 115585fb515bSPavan Nikhilesh static int 115685fb515bSPavan Nikhilesh xstats_id_abuse_tests(struct test *t) 115785fb515bSPavan Nikhilesh { 115885fb515bSPavan Nikhilesh int err; 115985fb515bSPavan Nikhilesh const uint32_t XSTATS_MAX = 1024; 116085fb515bSPavan Nikhilesh const uint32_t link_port = 2; 116185fb515bSPavan Nikhilesh 116285fb515bSPavan Nikhilesh uint32_t ids[XSTATS_MAX]; 116385fb515bSPavan Nikhilesh struct rte_event_dev_xstats_name xstats_names[XSTATS_MAX]; 116485fb515bSPavan Nikhilesh 116585fb515bSPavan Nikhilesh /* Create instance with 4 ports */ 116685fb515bSPavan Nikhilesh if (init(t, 1, 4) < 0 || 116785fb515bSPavan Nikhilesh create_ports(t, 4) < 0 || 116885fb515bSPavan Nikhilesh create_atomic_qids(t, 1) < 0) { 116985fb515bSPavan Nikhilesh printf("%d: Error initializing device\n", __LINE__); 117085fb515bSPavan Nikhilesh goto fail; 117185fb515bSPavan Nikhilesh } 117285fb515bSPavan Nikhilesh 117385fb515bSPavan Nikhilesh err = rte_event_port_link(evdev, t->port[link_port], NULL, NULL, 0); 117485fb515bSPavan Nikhilesh if (err != 1) { 117585fb515bSPavan Nikhilesh printf("%d: error mapping lb qid\n", __LINE__); 117685fb515bSPavan Nikhilesh goto fail; 117785fb515bSPavan Nikhilesh } 117885fb515bSPavan Nikhilesh 117985fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 118085fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 118185fb515bSPavan Nikhilesh goto fail; 118285fb515bSPavan Nikhilesh } 118385fb515bSPavan Nikhilesh 118485fb515bSPavan Nikhilesh /* no test for device, as it ignores the port/q number */ 118585fb515bSPavan Nikhilesh int num_stats = rte_event_dev_xstats_names_get(evdev, 118685fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_PORT, 118785fb515bSPavan Nikhilesh UINT8_MAX-1, xstats_names, ids, 118885fb515bSPavan Nikhilesh XSTATS_MAX); 118985fb515bSPavan Nikhilesh if (num_stats != 0) { 119085fb515bSPavan Nikhilesh printf("%d: expected %d stats, got return %d\n", __LINE__, 119185fb515bSPavan Nikhilesh 0, num_stats); 119285fb515bSPavan Nikhilesh goto fail; 119385fb515bSPavan Nikhilesh } 119485fb515bSPavan Nikhilesh 119585fb515bSPavan Nikhilesh num_stats = rte_event_dev_xstats_names_get(evdev, 119685fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_QUEUE, 119785fb515bSPavan Nikhilesh UINT8_MAX-1, xstats_names, ids, 119885fb515bSPavan Nikhilesh XSTATS_MAX); 119985fb515bSPavan Nikhilesh if (num_stats != 0) { 120085fb515bSPavan Nikhilesh printf("%d: expected %d stats, got return %d\n", __LINE__, 120185fb515bSPavan Nikhilesh 0, num_stats); 120285fb515bSPavan Nikhilesh goto fail; 120385fb515bSPavan Nikhilesh } 120485fb515bSPavan Nikhilesh 120585fb515bSPavan Nikhilesh cleanup(t); 120685fb515bSPavan Nikhilesh return 0; 120785fb515bSPavan Nikhilesh fail: 120885fb515bSPavan Nikhilesh cleanup(t); 120985fb515bSPavan Nikhilesh return -1; 121085fb515bSPavan Nikhilesh } 121185fb515bSPavan Nikhilesh 121285fb515bSPavan Nikhilesh static int 121385fb515bSPavan Nikhilesh port_reconfig_credits(struct test *t) 121485fb515bSPavan Nikhilesh { 121585fb515bSPavan Nikhilesh if (init(t, 1, 1) < 0) { 121685fb515bSPavan Nikhilesh printf("%d: Error initializing device\n", __LINE__); 121785fb515bSPavan Nikhilesh return -1; 121885fb515bSPavan Nikhilesh } 121985fb515bSPavan Nikhilesh 122085fb515bSPavan Nikhilesh uint32_t i; 122185fb515bSPavan Nikhilesh const uint32_t NUM_ITERS = 32; 122285fb515bSPavan Nikhilesh for (i = 0; i < NUM_ITERS; i++) { 122385fb515bSPavan Nikhilesh const struct rte_event_queue_conf conf = { 122485fb515bSPavan Nikhilesh .schedule_type = RTE_SCHED_TYPE_ATOMIC, 122585fb515bSPavan Nikhilesh .priority = RTE_EVENT_DEV_PRIORITY_NORMAL, 122685fb515bSPavan Nikhilesh .nb_atomic_flows = 1024, 122785fb515bSPavan Nikhilesh .nb_atomic_order_sequences = 1024, 122885fb515bSPavan Nikhilesh }; 122985fb515bSPavan Nikhilesh if (rte_event_queue_setup(evdev, 0, &conf) < 0) { 123085fb515bSPavan Nikhilesh printf("%d: error creating qid\n", __LINE__); 123185fb515bSPavan Nikhilesh return -1; 123285fb515bSPavan Nikhilesh } 123385fb515bSPavan Nikhilesh t->qid[0] = 0; 123485fb515bSPavan Nikhilesh 123585fb515bSPavan Nikhilesh static const struct rte_event_port_conf port_conf = { 123685fb515bSPavan Nikhilesh .new_event_threshold = 128, 123785fb515bSPavan Nikhilesh .dequeue_depth = 32, 123885fb515bSPavan Nikhilesh .enqueue_depth = 64, 123985fb515bSPavan Nikhilesh }; 124085fb515bSPavan Nikhilesh if (rte_event_port_setup(evdev, 0, &port_conf) < 0) { 124185fb515bSPavan Nikhilesh printf("%d Error setting up port\n", __LINE__); 124285fb515bSPavan Nikhilesh return -1; 124385fb515bSPavan Nikhilesh } 124485fb515bSPavan Nikhilesh 124585fb515bSPavan Nikhilesh int links = rte_event_port_link(evdev, 0, NULL, NULL, 0); 124685fb515bSPavan Nikhilesh if (links != 1) { 124785fb515bSPavan Nikhilesh printf("%d: error mapping lb qid\n", __LINE__); 124885fb515bSPavan Nikhilesh goto fail; 124985fb515bSPavan Nikhilesh } 125085fb515bSPavan Nikhilesh 125185fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 125285fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 125385fb515bSPavan Nikhilesh goto fail; 125485fb515bSPavan Nikhilesh } 125585fb515bSPavan Nikhilesh 125685fb515bSPavan Nikhilesh const uint32_t NPKTS = 1; 125785fb515bSPavan Nikhilesh uint32_t j; 125885fb515bSPavan Nikhilesh for (j = 0; j < NPKTS; j++) { 125985fb515bSPavan Nikhilesh struct rte_event ev; 126085fb515bSPavan Nikhilesh struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool); 126185fb515bSPavan Nikhilesh if (!arp) { 126285fb515bSPavan Nikhilesh printf("%d: gen of pkt failed\n", __LINE__); 126385fb515bSPavan Nikhilesh goto fail; 126485fb515bSPavan Nikhilesh } 126585fb515bSPavan Nikhilesh ev.queue_id = t->qid[0]; 126685fb515bSPavan Nikhilesh ev.op = RTE_EVENT_OP_NEW; 126785fb515bSPavan Nikhilesh ev.mbuf = arp; 126885fb515bSPavan Nikhilesh int err = rte_event_enqueue_burst(evdev, 0, &ev, 1); 126985fb515bSPavan Nikhilesh if (err != 1) { 127085fb515bSPavan Nikhilesh printf("%d: Failed to enqueue\n", __LINE__); 127185fb515bSPavan Nikhilesh rte_event_dev_dump(0, stdout); 127285fb515bSPavan Nikhilesh goto fail; 127385fb515bSPavan Nikhilesh } 127485fb515bSPavan Nikhilesh } 127585fb515bSPavan Nikhilesh 127685fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 127785fb515bSPavan Nikhilesh 127885fb515bSPavan Nikhilesh struct rte_event ev[NPKTS]; 127985fb515bSPavan Nikhilesh int deq = rte_event_dequeue_burst(evdev, t->port[0], ev, 128085fb515bSPavan Nikhilesh NPKTS, 0); 128185fb515bSPavan Nikhilesh if (deq != 1) 128285fb515bSPavan Nikhilesh printf("%d error; no packet dequeued\n", __LINE__); 128385fb515bSPavan Nikhilesh 128485fb515bSPavan Nikhilesh /* let cleanup below stop the device on last iter */ 128585fb515bSPavan Nikhilesh if (i != NUM_ITERS-1) 128685fb515bSPavan Nikhilesh rte_event_dev_stop(evdev); 128785fb515bSPavan Nikhilesh } 128885fb515bSPavan Nikhilesh 128985fb515bSPavan Nikhilesh cleanup(t); 129085fb515bSPavan Nikhilesh return 0; 129185fb515bSPavan Nikhilesh fail: 129285fb515bSPavan Nikhilesh cleanup(t); 129385fb515bSPavan Nikhilesh return -1; 129485fb515bSPavan Nikhilesh } 129585fb515bSPavan Nikhilesh 129685fb515bSPavan Nikhilesh static int 129785fb515bSPavan Nikhilesh port_single_lb_reconfig(struct test *t) 129885fb515bSPavan Nikhilesh { 129985fb515bSPavan Nikhilesh if (init(t, 2, 2) < 0) { 130085fb515bSPavan Nikhilesh printf("%d: Error initializing device\n", __LINE__); 130185fb515bSPavan Nikhilesh goto fail; 130285fb515bSPavan Nikhilesh } 130385fb515bSPavan Nikhilesh 130485fb515bSPavan Nikhilesh static const struct rte_event_queue_conf conf_lb_atomic = { 130585fb515bSPavan Nikhilesh .priority = RTE_EVENT_DEV_PRIORITY_NORMAL, 130685fb515bSPavan Nikhilesh .schedule_type = RTE_SCHED_TYPE_ATOMIC, 130785fb515bSPavan Nikhilesh .nb_atomic_flows = 1024, 130885fb515bSPavan Nikhilesh .nb_atomic_order_sequences = 1024, 130985fb515bSPavan Nikhilesh }; 131085fb515bSPavan Nikhilesh if (rte_event_queue_setup(evdev, 0, &conf_lb_atomic) < 0) { 131185fb515bSPavan Nikhilesh printf("%d: error creating qid\n", __LINE__); 131285fb515bSPavan Nikhilesh goto fail; 131385fb515bSPavan Nikhilesh } 131485fb515bSPavan Nikhilesh 131585fb515bSPavan Nikhilesh static const struct rte_event_queue_conf conf_single_link = { 131685fb515bSPavan Nikhilesh .priority = RTE_EVENT_DEV_PRIORITY_NORMAL, 131785fb515bSPavan Nikhilesh .event_queue_cfg = RTE_EVENT_QUEUE_CFG_SINGLE_LINK, 131885fb515bSPavan Nikhilesh }; 131985fb515bSPavan Nikhilesh if (rte_event_queue_setup(evdev, 1, &conf_single_link) < 0) { 132085fb515bSPavan Nikhilesh printf("%d: error creating qid\n", __LINE__); 132185fb515bSPavan Nikhilesh goto fail; 132285fb515bSPavan Nikhilesh } 132385fb515bSPavan Nikhilesh 132485fb515bSPavan Nikhilesh struct rte_event_port_conf port_conf = { 132585fb515bSPavan Nikhilesh .new_event_threshold = 128, 132685fb515bSPavan Nikhilesh .dequeue_depth = 32, 132785fb515bSPavan Nikhilesh .enqueue_depth = 64, 132885fb515bSPavan Nikhilesh }; 132985fb515bSPavan Nikhilesh if (rte_event_port_setup(evdev, 0, &port_conf) < 0) { 133085fb515bSPavan Nikhilesh printf("%d Error setting up port\n", __LINE__); 133185fb515bSPavan Nikhilesh goto fail; 133285fb515bSPavan Nikhilesh } 133385fb515bSPavan Nikhilesh if (rte_event_port_setup(evdev, 1, &port_conf) < 0) { 133485fb515bSPavan Nikhilesh printf("%d Error setting up port\n", __LINE__); 133585fb515bSPavan Nikhilesh goto fail; 133685fb515bSPavan Nikhilesh } 133785fb515bSPavan Nikhilesh 133885fb515bSPavan Nikhilesh /* link port to lb queue */ 133985fb515bSPavan Nikhilesh uint8_t queue_id = 0; 134085fb515bSPavan Nikhilesh if (rte_event_port_link(evdev, 0, &queue_id, NULL, 1) != 1) { 134185fb515bSPavan Nikhilesh printf("%d: error creating link for qid\n", __LINE__); 134285fb515bSPavan Nikhilesh goto fail; 134385fb515bSPavan Nikhilesh } 134485fb515bSPavan Nikhilesh 134585fb515bSPavan Nikhilesh int ret = rte_event_port_unlink(evdev, 0, &queue_id, 1); 134685fb515bSPavan Nikhilesh if (ret != 1) { 134785fb515bSPavan Nikhilesh printf("%d: Error unlinking lb port\n", __LINE__); 134885fb515bSPavan Nikhilesh goto fail; 134985fb515bSPavan Nikhilesh } 135085fb515bSPavan Nikhilesh 135185fb515bSPavan Nikhilesh queue_id = 1; 135285fb515bSPavan Nikhilesh if (rte_event_port_link(evdev, 0, &queue_id, NULL, 1) != 1) { 135385fb515bSPavan Nikhilesh printf("%d: error creating link for qid\n", __LINE__); 135485fb515bSPavan Nikhilesh goto fail; 135585fb515bSPavan Nikhilesh } 135685fb515bSPavan Nikhilesh 135785fb515bSPavan Nikhilesh queue_id = 0; 135885fb515bSPavan Nikhilesh int err = rte_event_port_link(evdev, 1, &queue_id, NULL, 1); 135985fb515bSPavan Nikhilesh if (err != 1) { 136085fb515bSPavan Nikhilesh printf("%d: error mapping lb qid\n", __LINE__); 136185fb515bSPavan Nikhilesh goto fail; 136285fb515bSPavan Nikhilesh } 136385fb515bSPavan Nikhilesh 136485fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 136585fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 136685fb515bSPavan Nikhilesh goto fail; 136785fb515bSPavan Nikhilesh } 136885fb515bSPavan Nikhilesh 136985fb515bSPavan Nikhilesh cleanup(t); 137085fb515bSPavan Nikhilesh return 0; 137185fb515bSPavan Nikhilesh fail: 137285fb515bSPavan Nikhilesh cleanup(t); 137385fb515bSPavan Nikhilesh return -1; 137485fb515bSPavan Nikhilesh } 137585fb515bSPavan Nikhilesh 137685fb515bSPavan Nikhilesh static int 137785fb515bSPavan Nikhilesh xstats_brute_force(struct test *t) 137885fb515bSPavan Nikhilesh { 137985fb515bSPavan Nikhilesh uint32_t i; 138085fb515bSPavan Nikhilesh const uint32_t XSTATS_MAX = 1024; 138185fb515bSPavan Nikhilesh uint32_t ids[XSTATS_MAX]; 138285fb515bSPavan Nikhilesh uint64_t values[XSTATS_MAX]; 138385fb515bSPavan Nikhilesh struct rte_event_dev_xstats_name xstats_names[XSTATS_MAX]; 138485fb515bSPavan Nikhilesh 138585fb515bSPavan Nikhilesh 138685fb515bSPavan Nikhilesh /* Create instance with 4 ports */ 138785fb515bSPavan Nikhilesh if (init(t, 1, 4) < 0 || 138885fb515bSPavan Nikhilesh create_ports(t, 4) < 0 || 138985fb515bSPavan Nikhilesh create_atomic_qids(t, 1) < 0) { 139085fb515bSPavan Nikhilesh printf("%d: Error initializing device\n", __LINE__); 139185fb515bSPavan Nikhilesh return -1; 139285fb515bSPavan Nikhilesh } 139385fb515bSPavan Nikhilesh 139485fb515bSPavan Nikhilesh int err = rte_event_port_link(evdev, t->port[0], NULL, NULL, 0); 139585fb515bSPavan Nikhilesh if (err != 1) { 139685fb515bSPavan Nikhilesh printf("%d: error mapping lb qid\n", __LINE__); 139785fb515bSPavan Nikhilesh goto fail; 139885fb515bSPavan Nikhilesh } 139985fb515bSPavan Nikhilesh 140085fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 140185fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 140285fb515bSPavan Nikhilesh goto fail; 140385fb515bSPavan Nikhilesh } 140485fb515bSPavan Nikhilesh 140585fb515bSPavan Nikhilesh for (i = 0; i < XSTATS_MAX; i++) 140685fb515bSPavan Nikhilesh ids[i] = i; 140785fb515bSPavan Nikhilesh 140885fb515bSPavan Nikhilesh for (i = 0; i < 3; i++) { 140985fb515bSPavan Nikhilesh uint32_t mode = RTE_EVENT_DEV_XSTATS_DEVICE + i; 141085fb515bSPavan Nikhilesh uint32_t j; 141185fb515bSPavan Nikhilesh for (j = 0; j < UINT8_MAX; j++) { 141285fb515bSPavan Nikhilesh rte_event_dev_xstats_names_get(evdev, mode, 141385fb515bSPavan Nikhilesh j, xstats_names, ids, XSTATS_MAX); 141485fb515bSPavan Nikhilesh 141585fb515bSPavan Nikhilesh rte_event_dev_xstats_get(evdev, mode, j, ids, 141685fb515bSPavan Nikhilesh values, XSTATS_MAX); 141785fb515bSPavan Nikhilesh } 141885fb515bSPavan Nikhilesh } 141985fb515bSPavan Nikhilesh 142085fb515bSPavan Nikhilesh cleanup(t); 142185fb515bSPavan Nikhilesh return 0; 142285fb515bSPavan Nikhilesh fail: 142385fb515bSPavan Nikhilesh cleanup(t); 142485fb515bSPavan Nikhilesh return -1; 142585fb515bSPavan Nikhilesh } 142685fb515bSPavan Nikhilesh 142785fb515bSPavan Nikhilesh static int 142885fb515bSPavan Nikhilesh xstats_id_reset_tests(struct test *t) 142985fb515bSPavan Nikhilesh { 143085fb515bSPavan Nikhilesh const int wrk_enq = 2; 143185fb515bSPavan Nikhilesh int err; 143285fb515bSPavan Nikhilesh 143385fb515bSPavan Nikhilesh /* Create instance with 4 ports */ 143485fb515bSPavan Nikhilesh if (init(t, 1, 4) < 0 || 143585fb515bSPavan Nikhilesh create_ports(t, 4) < 0 || 143685fb515bSPavan Nikhilesh create_atomic_qids(t, 1) < 0) { 143785fb515bSPavan Nikhilesh printf("%d: Error initializing device\n", __LINE__); 143885fb515bSPavan Nikhilesh return -1; 143985fb515bSPavan Nikhilesh } 144085fb515bSPavan Nikhilesh 144185fb515bSPavan Nikhilesh /* CQ mapping to QID */ 144285fb515bSPavan Nikhilesh err = rte_event_port_link(evdev, t->port[wrk_enq], NULL, NULL, 0); 144385fb515bSPavan Nikhilesh if (err != 1) { 144485fb515bSPavan Nikhilesh printf("%d: error mapping lb qid\n", __LINE__); 144585fb515bSPavan Nikhilesh goto fail; 144685fb515bSPavan Nikhilesh } 144785fb515bSPavan Nikhilesh 144885fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 144985fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 145085fb515bSPavan Nikhilesh goto fail; 145185fb515bSPavan Nikhilesh } 145285fb515bSPavan Nikhilesh 145385fb515bSPavan Nikhilesh #define XSTATS_MAX 1024 145485fb515bSPavan Nikhilesh int ret; 145585fb515bSPavan Nikhilesh uint32_t i; 145685fb515bSPavan Nikhilesh uint32_t ids[XSTATS_MAX]; 145785fb515bSPavan Nikhilesh uint64_t values[XSTATS_MAX]; 145885fb515bSPavan Nikhilesh struct rte_event_dev_xstats_name xstats_names[XSTATS_MAX]; 145985fb515bSPavan Nikhilesh 146085fb515bSPavan Nikhilesh for (i = 0; i < XSTATS_MAX; i++) 146185fb515bSPavan Nikhilesh ids[i] = i; 146285fb515bSPavan Nikhilesh 146385fb515bSPavan Nikhilesh #define NUM_DEV_STATS 6 146485fb515bSPavan Nikhilesh /* Device names / values */ 146585fb515bSPavan Nikhilesh int num_stats = rte_event_dev_xstats_names_get(evdev, 146685fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_DEVICE, 146785fb515bSPavan Nikhilesh 0, xstats_names, ids, XSTATS_MAX); 146885fb515bSPavan Nikhilesh if (num_stats != NUM_DEV_STATS) { 146985fb515bSPavan Nikhilesh printf("%d: expected %d stats, got return %d\n", __LINE__, 147085fb515bSPavan Nikhilesh NUM_DEV_STATS, num_stats); 147185fb515bSPavan Nikhilesh goto fail; 147285fb515bSPavan Nikhilesh } 147385fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_get(evdev, 147485fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_DEVICE, 147585fb515bSPavan Nikhilesh 0, ids, values, num_stats); 147685fb515bSPavan Nikhilesh if (ret != NUM_DEV_STATS) { 147785fb515bSPavan Nikhilesh printf("%d: expected %d stats, got return %d\n", __LINE__, 147885fb515bSPavan Nikhilesh NUM_DEV_STATS, ret); 147985fb515bSPavan Nikhilesh goto fail; 148085fb515bSPavan Nikhilesh } 148185fb515bSPavan Nikhilesh 148285fb515bSPavan Nikhilesh #define NPKTS 7 148385fb515bSPavan Nikhilesh for (i = 0; i < NPKTS; i++) { 148485fb515bSPavan Nikhilesh struct rte_event ev; 148585fb515bSPavan Nikhilesh struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool); 148685fb515bSPavan Nikhilesh if (!arp) { 148785fb515bSPavan Nikhilesh printf("%d: gen of pkt failed\n", __LINE__); 148885fb515bSPavan Nikhilesh goto fail; 148985fb515bSPavan Nikhilesh } 149085fb515bSPavan Nikhilesh ev.queue_id = t->qid[i]; 149185fb515bSPavan Nikhilesh ev.op = RTE_EVENT_OP_NEW; 149285fb515bSPavan Nikhilesh ev.mbuf = arp; 149385fb515bSPavan Nikhilesh arp->seqn = i; 149485fb515bSPavan Nikhilesh 149585fb515bSPavan Nikhilesh int err = rte_event_enqueue_burst(evdev, t->port[0], &ev, 1); 149685fb515bSPavan Nikhilesh if (err != 1) { 149785fb515bSPavan Nikhilesh printf("%d: Failed to enqueue\n", __LINE__); 149885fb515bSPavan Nikhilesh goto fail; 149985fb515bSPavan Nikhilesh } 150085fb515bSPavan Nikhilesh } 150185fb515bSPavan Nikhilesh 150285fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 150385fb515bSPavan Nikhilesh 150485fb515bSPavan Nikhilesh static const char * const dev_names[] = { 150585fb515bSPavan Nikhilesh "dev_rx", "dev_tx", "dev_drop", "dev_sched_calls", 150685fb515bSPavan Nikhilesh "dev_sched_no_iq_enq", "dev_sched_no_cq_enq", 150785fb515bSPavan Nikhilesh }; 150885fb515bSPavan Nikhilesh uint64_t dev_expected[] = {NPKTS, NPKTS, 0, 1, 0, 0}; 150985fb515bSPavan Nikhilesh for (i = 0; (int)i < ret; i++) { 151085fb515bSPavan Nikhilesh unsigned int id; 151185fb515bSPavan Nikhilesh uint64_t val = rte_event_dev_xstats_by_name_get(evdev, 151285fb515bSPavan Nikhilesh dev_names[i], 151385fb515bSPavan Nikhilesh &id); 151485fb515bSPavan Nikhilesh if (id != i) { 151585fb515bSPavan Nikhilesh printf("%d: %s id incorrect, expected %d got %d\n", 151685fb515bSPavan Nikhilesh __LINE__, dev_names[i], i, id); 151785fb515bSPavan Nikhilesh goto fail; 151885fb515bSPavan Nikhilesh } 151985fb515bSPavan Nikhilesh if (val != dev_expected[i]) { 152085fb515bSPavan Nikhilesh printf("%d: %s value incorrect, expected %" 152185fb515bSPavan Nikhilesh PRIu64" got %d\n", __LINE__, dev_names[i], 152285fb515bSPavan Nikhilesh dev_expected[i], id); 152385fb515bSPavan Nikhilesh goto fail; 152485fb515bSPavan Nikhilesh } 152585fb515bSPavan Nikhilesh /* reset to zero */ 152685fb515bSPavan Nikhilesh int reset_ret = rte_event_dev_xstats_reset(evdev, 152785fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_DEVICE, 0, 152885fb515bSPavan Nikhilesh &id, 152985fb515bSPavan Nikhilesh 1); 153085fb515bSPavan Nikhilesh if (reset_ret) { 153185fb515bSPavan Nikhilesh printf("%d: failed to reset successfully\n", __LINE__); 153285fb515bSPavan Nikhilesh goto fail; 153385fb515bSPavan Nikhilesh } 153485fb515bSPavan Nikhilesh dev_expected[i] = 0; 153585fb515bSPavan Nikhilesh /* check value again */ 153685fb515bSPavan Nikhilesh val = rte_event_dev_xstats_by_name_get(evdev, dev_names[i], 0); 153785fb515bSPavan Nikhilesh if (val != dev_expected[i]) { 153885fb515bSPavan Nikhilesh printf("%d: %s value incorrect, expected %"PRIu64 153985fb515bSPavan Nikhilesh " got %"PRIu64"\n", __LINE__, dev_names[i], 154085fb515bSPavan Nikhilesh dev_expected[i], val); 154185fb515bSPavan Nikhilesh goto fail; 154285fb515bSPavan Nikhilesh } 154385fb515bSPavan Nikhilesh }; 154485fb515bSPavan Nikhilesh 154585fb515bSPavan Nikhilesh /* 48 is stat offset from start of the devices whole xstats. 154685fb515bSPavan Nikhilesh * This WILL break every time we add a statistic to a port 154785fb515bSPavan Nikhilesh * or the device, but there is no other way to test 154885fb515bSPavan Nikhilesh */ 154985fb515bSPavan Nikhilesh #define PORT_OFF 48 155085fb515bSPavan Nikhilesh /* num stats for the tested port. CQ size adds more stats to a port */ 155185fb515bSPavan Nikhilesh #define NUM_PORT_STATS 21 155285fb515bSPavan Nikhilesh /* the port to test. */ 155385fb515bSPavan Nikhilesh #define PORT 2 155485fb515bSPavan Nikhilesh num_stats = rte_event_dev_xstats_names_get(evdev, 155585fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_PORT, PORT, 155685fb515bSPavan Nikhilesh xstats_names, ids, XSTATS_MAX); 155785fb515bSPavan Nikhilesh if (num_stats != NUM_PORT_STATS) { 155885fb515bSPavan Nikhilesh printf("%d: expected %d stats, got return %d\n", 155985fb515bSPavan Nikhilesh __LINE__, NUM_PORT_STATS, num_stats); 156085fb515bSPavan Nikhilesh goto fail; 156185fb515bSPavan Nikhilesh } 156285fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_get(evdev, RTE_EVENT_DEV_XSTATS_PORT, PORT, 156385fb515bSPavan Nikhilesh ids, values, num_stats); 156485fb515bSPavan Nikhilesh 156585fb515bSPavan Nikhilesh if (ret != NUM_PORT_STATS) { 156685fb515bSPavan Nikhilesh printf("%d: expected %d stats, got return %d\n", 156785fb515bSPavan Nikhilesh __LINE__, NUM_PORT_STATS, ret); 156885fb515bSPavan Nikhilesh goto fail; 156985fb515bSPavan Nikhilesh } 157085fb515bSPavan Nikhilesh static const char * const port_names[] = { 157185fb515bSPavan Nikhilesh "port_2_rx", 157285fb515bSPavan Nikhilesh "port_2_tx", 157385fb515bSPavan Nikhilesh "port_2_drop", 157485fb515bSPavan Nikhilesh "port_2_inflight", 157585fb515bSPavan Nikhilesh "port_2_avg_pkt_cycles", 157685fb515bSPavan Nikhilesh "port_2_credits", 157785fb515bSPavan Nikhilesh "port_2_rx_ring_used", 157885fb515bSPavan Nikhilesh "port_2_rx_ring_free", 157985fb515bSPavan Nikhilesh "port_2_cq_ring_used", 158085fb515bSPavan Nikhilesh "port_2_cq_ring_free", 158185fb515bSPavan Nikhilesh "port_2_dequeue_calls", 158285fb515bSPavan Nikhilesh "port_2_dequeues_returning_0", 158385fb515bSPavan Nikhilesh "port_2_dequeues_returning_1-4", 158485fb515bSPavan Nikhilesh "port_2_dequeues_returning_5-8", 158585fb515bSPavan Nikhilesh "port_2_dequeues_returning_9-12", 158685fb515bSPavan Nikhilesh "port_2_dequeues_returning_13-16", 158785fb515bSPavan Nikhilesh "port_2_dequeues_returning_17-20", 158885fb515bSPavan Nikhilesh "port_2_dequeues_returning_21-24", 158985fb515bSPavan Nikhilesh "port_2_dequeues_returning_25-28", 159085fb515bSPavan Nikhilesh "port_2_dequeues_returning_29-32", 159185fb515bSPavan Nikhilesh "port_2_dequeues_returning_33-36", 159285fb515bSPavan Nikhilesh }; 159385fb515bSPavan Nikhilesh uint64_t port_expected[] = { 159485fb515bSPavan Nikhilesh 0, /* rx */ 159585fb515bSPavan Nikhilesh NPKTS, /* tx */ 159685fb515bSPavan Nikhilesh 0, /* drop */ 159785fb515bSPavan Nikhilesh NPKTS, /* inflight */ 159885fb515bSPavan Nikhilesh 0, /* avg pkt cycles */ 159985fb515bSPavan Nikhilesh 0, /* credits */ 160085fb515bSPavan Nikhilesh 0, /* rx ring used */ 160185fb515bSPavan Nikhilesh 4096, /* rx ring free */ 160285fb515bSPavan Nikhilesh NPKTS, /* cq ring used */ 160385fb515bSPavan Nikhilesh 25, /* cq ring free */ 160485fb515bSPavan Nikhilesh 0, /* dequeue zero calls */ 160585fb515bSPavan Nikhilesh 0, 0, 0, 0, 0, /* 10 dequeue buckets */ 160685fb515bSPavan Nikhilesh 0, 0, 0, 0, 0, 160785fb515bSPavan Nikhilesh }; 160885fb515bSPavan Nikhilesh uint64_t port_expected_zero[] = { 160985fb515bSPavan Nikhilesh 0, /* rx */ 161085fb515bSPavan Nikhilesh 0, /* tx */ 161185fb515bSPavan Nikhilesh 0, /* drop */ 161285fb515bSPavan Nikhilesh NPKTS, /* inflight */ 161385fb515bSPavan Nikhilesh 0, /* avg pkt cycles */ 161485fb515bSPavan Nikhilesh 0, /* credits */ 161585fb515bSPavan Nikhilesh 0, /* rx ring used */ 161685fb515bSPavan Nikhilesh 4096, /* rx ring free */ 161785fb515bSPavan Nikhilesh NPKTS, /* cq ring used */ 161885fb515bSPavan Nikhilesh 25, /* cq ring free */ 161985fb515bSPavan Nikhilesh 0, /* dequeue zero calls */ 162085fb515bSPavan Nikhilesh 0, 0, 0, 0, 0, /* 10 dequeue buckets */ 162185fb515bSPavan Nikhilesh 0, 0, 0, 0, 0, 162285fb515bSPavan Nikhilesh }; 162385fb515bSPavan Nikhilesh if (RTE_DIM(port_expected) != NUM_PORT_STATS || 162485fb515bSPavan Nikhilesh RTE_DIM(port_names) != NUM_PORT_STATS) { 162585fb515bSPavan Nikhilesh printf("%d: port array of wrong size\n", __LINE__); 162685fb515bSPavan Nikhilesh goto fail; 162785fb515bSPavan Nikhilesh } 162885fb515bSPavan Nikhilesh 162985fb515bSPavan Nikhilesh int failed = 0; 163085fb515bSPavan Nikhilesh for (i = 0; (int)i < ret; i++) { 163185fb515bSPavan Nikhilesh unsigned int id; 163285fb515bSPavan Nikhilesh uint64_t val = rte_event_dev_xstats_by_name_get(evdev, 163385fb515bSPavan Nikhilesh port_names[i], 163485fb515bSPavan Nikhilesh &id); 163585fb515bSPavan Nikhilesh if (id != i + PORT_OFF) { 163685fb515bSPavan Nikhilesh printf("%d: %s id incorrect, expected %d got %d\n", 163785fb515bSPavan Nikhilesh __LINE__, port_names[i], i+PORT_OFF, 163885fb515bSPavan Nikhilesh id); 163985fb515bSPavan Nikhilesh failed = 1; 164085fb515bSPavan Nikhilesh } 164185fb515bSPavan Nikhilesh if (val != port_expected[i]) { 164285fb515bSPavan Nikhilesh printf("%d: %s value incorrect, expected %"PRIu64 164385fb515bSPavan Nikhilesh " got %d\n", __LINE__, port_names[i], 164485fb515bSPavan Nikhilesh port_expected[i], id); 164585fb515bSPavan Nikhilesh failed = 1; 164685fb515bSPavan Nikhilesh } 164785fb515bSPavan Nikhilesh /* reset to zero */ 164885fb515bSPavan Nikhilesh int reset_ret = rte_event_dev_xstats_reset(evdev, 164985fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_PORT, PORT, 165085fb515bSPavan Nikhilesh &id, 165185fb515bSPavan Nikhilesh 1); 165285fb515bSPavan Nikhilesh if (reset_ret) { 165385fb515bSPavan Nikhilesh printf("%d: failed to reset successfully\n", __LINE__); 165485fb515bSPavan Nikhilesh failed = 1; 165585fb515bSPavan Nikhilesh } 165685fb515bSPavan Nikhilesh /* check value again */ 165785fb515bSPavan Nikhilesh val = rte_event_dev_xstats_by_name_get(evdev, port_names[i], 0); 165885fb515bSPavan Nikhilesh if (val != port_expected_zero[i]) { 165985fb515bSPavan Nikhilesh printf("%d: %s value incorrect, expected %"PRIu64 166085fb515bSPavan Nikhilesh " got %"PRIu64"\n", __LINE__, port_names[i], 166185fb515bSPavan Nikhilesh port_expected_zero[i], val); 166285fb515bSPavan Nikhilesh failed = 1; 166385fb515bSPavan Nikhilesh } 166485fb515bSPavan Nikhilesh }; 166585fb515bSPavan Nikhilesh if (failed) 166685fb515bSPavan Nikhilesh goto fail; 166785fb515bSPavan Nikhilesh 166885fb515bSPavan Nikhilesh /* num queue stats */ 166985fb515bSPavan Nikhilesh #define NUM_Q_STATS 16 167085fb515bSPavan Nikhilesh /* queue offset from start of the devices whole xstats. 167185fb515bSPavan Nikhilesh * This will break every time we add a statistic to a device/port/queue 167285fb515bSPavan Nikhilesh */ 167385fb515bSPavan Nikhilesh #define QUEUE_OFF 90 167485fb515bSPavan Nikhilesh const uint32_t queue = 0; 167585fb515bSPavan Nikhilesh num_stats = rte_event_dev_xstats_names_get(evdev, 167685fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_QUEUE, queue, 167785fb515bSPavan Nikhilesh xstats_names, ids, XSTATS_MAX); 167885fb515bSPavan Nikhilesh if (num_stats != NUM_Q_STATS) { 167985fb515bSPavan Nikhilesh printf("%d: expected %d stats, got return %d\n", 168085fb515bSPavan Nikhilesh __LINE__, NUM_Q_STATS, num_stats); 168185fb515bSPavan Nikhilesh goto fail; 168285fb515bSPavan Nikhilesh } 168385fb515bSPavan Nikhilesh ret = rte_event_dev_xstats_get(evdev, RTE_EVENT_DEV_XSTATS_QUEUE, 168485fb515bSPavan Nikhilesh queue, ids, values, num_stats); 168585fb515bSPavan Nikhilesh if (ret != NUM_Q_STATS) { 168685fb515bSPavan Nikhilesh printf("%d: expected 21 stats, got return %d\n", __LINE__, ret); 168785fb515bSPavan Nikhilesh goto fail; 168885fb515bSPavan Nikhilesh } 168985fb515bSPavan Nikhilesh static const char * const queue_names[] = { 169085fb515bSPavan Nikhilesh "qid_0_rx", 169185fb515bSPavan Nikhilesh "qid_0_tx", 169285fb515bSPavan Nikhilesh "qid_0_drop", 169385fb515bSPavan Nikhilesh "qid_0_inflight", 169485fb515bSPavan Nikhilesh "qid_0_iq_0_used", 169585fb515bSPavan Nikhilesh "qid_0_iq_1_used", 169685fb515bSPavan Nikhilesh "qid_0_iq_2_used", 169785fb515bSPavan Nikhilesh "qid_0_iq_3_used", 169885fb515bSPavan Nikhilesh "qid_0_port_0_pinned_flows", 169985fb515bSPavan Nikhilesh "qid_0_port_0_packets", 170085fb515bSPavan Nikhilesh "qid_0_port_1_pinned_flows", 170185fb515bSPavan Nikhilesh "qid_0_port_1_packets", 170285fb515bSPavan Nikhilesh "qid_0_port_2_pinned_flows", 170385fb515bSPavan Nikhilesh "qid_0_port_2_packets", 170485fb515bSPavan Nikhilesh "qid_0_port_3_pinned_flows", 170585fb515bSPavan Nikhilesh "qid_0_port_3_packets", 170685fb515bSPavan Nikhilesh }; 170785fb515bSPavan Nikhilesh uint64_t queue_expected[] = { 170885fb515bSPavan Nikhilesh 7, /* rx */ 170985fb515bSPavan Nikhilesh 7, /* tx */ 171085fb515bSPavan Nikhilesh 0, /* drop */ 171185fb515bSPavan Nikhilesh 7, /* inflight */ 171285fb515bSPavan Nikhilesh 0, /* iq 0 used */ 171385fb515bSPavan Nikhilesh 0, /* iq 1 used */ 171485fb515bSPavan Nikhilesh 0, /* iq 2 used */ 171585fb515bSPavan Nikhilesh 0, /* iq 3 used */ 171685fb515bSPavan Nikhilesh /* QID-to-Port: pinned_flows, packets */ 171785fb515bSPavan Nikhilesh 0, 0, 171885fb515bSPavan Nikhilesh 0, 0, 171985fb515bSPavan Nikhilesh 1, 7, 172085fb515bSPavan Nikhilesh 0, 0, 172185fb515bSPavan Nikhilesh }; 172285fb515bSPavan Nikhilesh uint64_t queue_expected_zero[] = { 172385fb515bSPavan Nikhilesh 0, /* rx */ 172485fb515bSPavan Nikhilesh 0, /* tx */ 172585fb515bSPavan Nikhilesh 0, /* drop */ 172685fb515bSPavan Nikhilesh 7, /* inflight */ 172785fb515bSPavan Nikhilesh 0, /* iq 0 used */ 172885fb515bSPavan Nikhilesh 0, /* iq 1 used */ 172985fb515bSPavan Nikhilesh 0, /* iq 2 used */ 173085fb515bSPavan Nikhilesh 0, /* iq 3 used */ 173185fb515bSPavan Nikhilesh /* QID-to-Port: pinned_flows, packets */ 173285fb515bSPavan Nikhilesh 0, 0, 173385fb515bSPavan Nikhilesh 0, 0, 173485fb515bSPavan Nikhilesh 1, 0, 173585fb515bSPavan Nikhilesh 0, 0, 173685fb515bSPavan Nikhilesh }; 173785fb515bSPavan Nikhilesh if (RTE_DIM(queue_expected) != NUM_Q_STATS || 173885fb515bSPavan Nikhilesh RTE_DIM(queue_expected_zero) != NUM_Q_STATS || 173985fb515bSPavan Nikhilesh RTE_DIM(queue_names) != NUM_Q_STATS) { 174085fb515bSPavan Nikhilesh printf("%d : queue array of wrong size\n", __LINE__); 174185fb515bSPavan Nikhilesh goto fail; 174285fb515bSPavan Nikhilesh } 174385fb515bSPavan Nikhilesh 174485fb515bSPavan Nikhilesh failed = 0; 174585fb515bSPavan Nikhilesh for (i = 0; (int)i < ret; i++) { 174685fb515bSPavan Nikhilesh unsigned int id; 174785fb515bSPavan Nikhilesh uint64_t val = rte_event_dev_xstats_by_name_get(evdev, 174885fb515bSPavan Nikhilesh queue_names[i], 174985fb515bSPavan Nikhilesh &id); 175085fb515bSPavan Nikhilesh if (id != i + QUEUE_OFF) { 175185fb515bSPavan Nikhilesh printf("%d: %s id incorrect, expected %d got %d\n", 175285fb515bSPavan Nikhilesh __LINE__, queue_names[i], i+QUEUE_OFF, 175385fb515bSPavan Nikhilesh id); 175485fb515bSPavan Nikhilesh failed = 1; 175585fb515bSPavan Nikhilesh } 175685fb515bSPavan Nikhilesh if (val != queue_expected[i]) { 175785fb515bSPavan Nikhilesh printf("%d: %d: %s value , expected %"PRIu64 175885fb515bSPavan Nikhilesh " got %"PRIu64"\n", i, __LINE__, 175985fb515bSPavan Nikhilesh queue_names[i], queue_expected[i], val); 176085fb515bSPavan Nikhilesh failed = 1; 176185fb515bSPavan Nikhilesh } 176285fb515bSPavan Nikhilesh /* reset to zero */ 176385fb515bSPavan Nikhilesh int reset_ret = rte_event_dev_xstats_reset(evdev, 176485fb515bSPavan Nikhilesh RTE_EVENT_DEV_XSTATS_QUEUE, 176585fb515bSPavan Nikhilesh queue, &id, 1); 176685fb515bSPavan Nikhilesh if (reset_ret) { 176785fb515bSPavan Nikhilesh printf("%d: failed to reset successfully\n", __LINE__); 176885fb515bSPavan Nikhilesh failed = 1; 176985fb515bSPavan Nikhilesh } 177085fb515bSPavan Nikhilesh /* check value again */ 177185fb515bSPavan Nikhilesh val = rte_event_dev_xstats_by_name_get(evdev, queue_names[i], 177285fb515bSPavan Nikhilesh 0); 177385fb515bSPavan Nikhilesh if (val != queue_expected_zero[i]) { 177485fb515bSPavan Nikhilesh printf("%d: %s value incorrect, expected %"PRIu64 177585fb515bSPavan Nikhilesh " got %"PRIu64"\n", __LINE__, queue_names[i], 177685fb515bSPavan Nikhilesh queue_expected_zero[i], val); 177785fb515bSPavan Nikhilesh failed = 1; 177885fb515bSPavan Nikhilesh } 177985fb515bSPavan Nikhilesh }; 178085fb515bSPavan Nikhilesh 178185fb515bSPavan Nikhilesh if (failed) 178285fb515bSPavan Nikhilesh goto fail; 178385fb515bSPavan Nikhilesh 178485fb515bSPavan Nikhilesh cleanup(t); 178585fb515bSPavan Nikhilesh return 0; 178685fb515bSPavan Nikhilesh fail: 178785fb515bSPavan Nikhilesh cleanup(t); 178885fb515bSPavan Nikhilesh return -1; 178985fb515bSPavan Nikhilesh } 179085fb515bSPavan Nikhilesh 179185fb515bSPavan Nikhilesh static int 179285fb515bSPavan Nikhilesh ordered_reconfigure(struct test *t) 179385fb515bSPavan Nikhilesh { 179485fb515bSPavan Nikhilesh if (init(t, 1, 1) < 0 || 179585fb515bSPavan Nikhilesh create_ports(t, 1) < 0) { 179685fb515bSPavan Nikhilesh printf("%d: Error initializing device\n", __LINE__); 179785fb515bSPavan Nikhilesh return -1; 179885fb515bSPavan Nikhilesh } 179985fb515bSPavan Nikhilesh 180085fb515bSPavan Nikhilesh const struct rte_event_queue_conf conf = { 180185fb515bSPavan Nikhilesh .schedule_type = RTE_SCHED_TYPE_ORDERED, 180285fb515bSPavan Nikhilesh .priority = RTE_EVENT_DEV_PRIORITY_NORMAL, 180385fb515bSPavan Nikhilesh .nb_atomic_flows = 1024, 180485fb515bSPavan Nikhilesh .nb_atomic_order_sequences = 1024, 180585fb515bSPavan Nikhilesh }; 180685fb515bSPavan Nikhilesh 180785fb515bSPavan Nikhilesh if (rte_event_queue_setup(evdev, 0, &conf) < 0) { 180885fb515bSPavan Nikhilesh printf("%d: error creating qid\n", __LINE__); 180985fb515bSPavan Nikhilesh goto failed; 181085fb515bSPavan Nikhilesh } 181185fb515bSPavan Nikhilesh 181285fb515bSPavan Nikhilesh if (rte_event_queue_setup(evdev, 0, &conf) < 0) { 181385fb515bSPavan Nikhilesh printf("%d: error creating qid, for 2nd time\n", __LINE__); 181485fb515bSPavan Nikhilesh goto failed; 181585fb515bSPavan Nikhilesh } 181685fb515bSPavan Nikhilesh 181785fb515bSPavan Nikhilesh rte_event_port_link(evdev, t->port[0], NULL, NULL, 0); 181885fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 181985fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 182085fb515bSPavan Nikhilesh return -1; 182185fb515bSPavan Nikhilesh } 182285fb515bSPavan Nikhilesh 182385fb515bSPavan Nikhilesh cleanup(t); 182485fb515bSPavan Nikhilesh return 0; 182585fb515bSPavan Nikhilesh failed: 182685fb515bSPavan Nikhilesh cleanup(t); 182785fb515bSPavan Nikhilesh return -1; 182885fb515bSPavan Nikhilesh } 182985fb515bSPavan Nikhilesh 183085fb515bSPavan Nikhilesh static int 183185fb515bSPavan Nikhilesh qid_priorities(struct test *t) 183285fb515bSPavan Nikhilesh { 183385fb515bSPavan Nikhilesh /* Test works by having a CQ with enough empty space for all packets, 183485fb515bSPavan Nikhilesh * and enqueueing 3 packets to 3 QIDs. They must return based on the 183585fb515bSPavan Nikhilesh * priority of the QID, not the ingress order, to pass the test 183685fb515bSPavan Nikhilesh */ 183785fb515bSPavan Nikhilesh unsigned int i; 183885fb515bSPavan Nikhilesh /* Create instance with 1 ports, and 3 qids */ 183985fb515bSPavan Nikhilesh if (init(t, 3, 1) < 0 || 184085fb515bSPavan Nikhilesh create_ports(t, 1) < 0) { 184185fb515bSPavan Nikhilesh printf("%d: Error initializing device\n", __LINE__); 184285fb515bSPavan Nikhilesh return -1; 184385fb515bSPavan Nikhilesh } 184485fb515bSPavan Nikhilesh 184585fb515bSPavan Nikhilesh for (i = 0; i < 3; i++) { 184685fb515bSPavan Nikhilesh /* Create QID */ 184785fb515bSPavan Nikhilesh const struct rte_event_queue_conf conf = { 184885fb515bSPavan Nikhilesh .schedule_type = RTE_SCHED_TYPE_ATOMIC, 184985fb515bSPavan Nikhilesh /* increase priority (0 == highest), as we go */ 185085fb515bSPavan Nikhilesh .priority = RTE_EVENT_DEV_PRIORITY_NORMAL - i, 185185fb515bSPavan Nikhilesh .nb_atomic_flows = 1024, 185285fb515bSPavan Nikhilesh .nb_atomic_order_sequences = 1024, 185385fb515bSPavan Nikhilesh }; 185485fb515bSPavan Nikhilesh 185585fb515bSPavan Nikhilesh if (rte_event_queue_setup(evdev, i, &conf) < 0) { 185685fb515bSPavan Nikhilesh printf("%d: error creating qid %d\n", __LINE__, i); 185785fb515bSPavan Nikhilesh return -1; 185885fb515bSPavan Nikhilesh } 185985fb515bSPavan Nikhilesh t->qid[i] = i; 186085fb515bSPavan Nikhilesh } 186185fb515bSPavan Nikhilesh t->nb_qids = i; 186285fb515bSPavan Nikhilesh /* map all QIDs to port */ 186385fb515bSPavan Nikhilesh rte_event_port_link(evdev, t->port[0], NULL, NULL, 0); 186485fb515bSPavan Nikhilesh 186585fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 186685fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 186785fb515bSPavan Nikhilesh return -1; 186885fb515bSPavan Nikhilesh } 186985fb515bSPavan Nikhilesh 187085fb515bSPavan Nikhilesh /* enqueue 3 packets, setting seqn and QID to check priority */ 187185fb515bSPavan Nikhilesh for (i = 0; i < 3; i++) { 187285fb515bSPavan Nikhilesh struct rte_event ev; 187385fb515bSPavan Nikhilesh struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool); 187485fb515bSPavan Nikhilesh if (!arp) { 187585fb515bSPavan Nikhilesh printf("%d: gen of pkt failed\n", __LINE__); 187685fb515bSPavan Nikhilesh return -1; 187785fb515bSPavan Nikhilesh } 187885fb515bSPavan Nikhilesh ev.queue_id = t->qid[i]; 187985fb515bSPavan Nikhilesh ev.op = RTE_EVENT_OP_NEW; 188085fb515bSPavan Nikhilesh ev.mbuf = arp; 188185fb515bSPavan Nikhilesh arp->seqn = i; 188285fb515bSPavan Nikhilesh 188385fb515bSPavan Nikhilesh int err = rte_event_enqueue_burst(evdev, t->port[0], &ev, 1); 188485fb515bSPavan Nikhilesh if (err != 1) { 188585fb515bSPavan Nikhilesh printf("%d: Failed to enqueue\n", __LINE__); 188685fb515bSPavan Nikhilesh return -1; 188785fb515bSPavan Nikhilesh } 188885fb515bSPavan Nikhilesh } 188985fb515bSPavan Nikhilesh 189085fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 189185fb515bSPavan Nikhilesh 189285fb515bSPavan Nikhilesh /* dequeue packets, verify priority was upheld */ 189385fb515bSPavan Nikhilesh struct rte_event ev[32]; 189485fb515bSPavan Nikhilesh uint32_t deq_pkts = 189585fb515bSPavan Nikhilesh rte_event_dequeue_burst(evdev, t->port[0], ev, 32, 0); 189685fb515bSPavan Nikhilesh if (deq_pkts != 3) { 189785fb515bSPavan Nikhilesh printf("%d: failed to deq packets\n", __LINE__); 189885fb515bSPavan Nikhilesh rte_event_dev_dump(evdev, stdout); 189985fb515bSPavan Nikhilesh return -1; 190085fb515bSPavan Nikhilesh } 190185fb515bSPavan Nikhilesh for (i = 0; i < 3; i++) { 190285fb515bSPavan Nikhilesh if (ev[i].mbuf->seqn != 2-i) { 190385fb515bSPavan Nikhilesh printf( 190485fb515bSPavan Nikhilesh "%d: qid priority test: seqn %d incorrectly prioritized\n", 190585fb515bSPavan Nikhilesh __LINE__, i); 190685fb515bSPavan Nikhilesh } 190785fb515bSPavan Nikhilesh } 190885fb515bSPavan Nikhilesh 190985fb515bSPavan Nikhilesh cleanup(t); 191085fb515bSPavan Nikhilesh return 0; 191185fb515bSPavan Nikhilesh } 191285fb515bSPavan Nikhilesh 191385fb515bSPavan Nikhilesh static int 19141638261aSHarry van Haaren unlink_in_progress(struct test *t) 19151638261aSHarry van Haaren { 19161638261aSHarry van Haaren /* Test unlinking API, in particular that when an unlink request has 19171638261aSHarry van Haaren * not yet been seen by the scheduler thread, that the 19181638261aSHarry van Haaren * unlink_in_progress() function returns the number of unlinks. 19191638261aSHarry van Haaren */ 19201638261aSHarry van Haaren unsigned int i; 19211638261aSHarry van Haaren /* Create instance with 1 ports, and 3 qids */ 19221638261aSHarry van Haaren if (init(t, 3, 1) < 0 || 19231638261aSHarry van Haaren create_ports(t, 1) < 0) { 19241638261aSHarry van Haaren printf("%d: Error initializing device\n", __LINE__); 19251638261aSHarry van Haaren return -1; 19261638261aSHarry van Haaren } 19271638261aSHarry van Haaren 19281638261aSHarry van Haaren for (i = 0; i < 3; i++) { 19291638261aSHarry van Haaren /* Create QID */ 19301638261aSHarry van Haaren const struct rte_event_queue_conf conf = { 19311638261aSHarry van Haaren .schedule_type = RTE_SCHED_TYPE_ATOMIC, 19321638261aSHarry van Haaren /* increase priority (0 == highest), as we go */ 19331638261aSHarry van Haaren .priority = RTE_EVENT_DEV_PRIORITY_NORMAL - i, 19341638261aSHarry van Haaren .nb_atomic_flows = 1024, 19351638261aSHarry van Haaren .nb_atomic_order_sequences = 1024, 19361638261aSHarry van Haaren }; 19371638261aSHarry van Haaren 19381638261aSHarry van Haaren if (rte_event_queue_setup(evdev, i, &conf) < 0) { 19391638261aSHarry van Haaren printf("%d: error creating qid %d\n", __LINE__, i); 19401638261aSHarry van Haaren return -1; 19411638261aSHarry van Haaren } 19421638261aSHarry van Haaren t->qid[i] = i; 19431638261aSHarry van Haaren } 19441638261aSHarry van Haaren t->nb_qids = i; 19451638261aSHarry van Haaren /* map all QIDs to port */ 19461638261aSHarry van Haaren rte_event_port_link(evdev, t->port[0], NULL, NULL, 0); 19471638261aSHarry van Haaren 19481638261aSHarry van Haaren if (rte_event_dev_start(evdev) < 0) { 19491638261aSHarry van Haaren printf("%d: Error with start call\n", __LINE__); 19501638261aSHarry van Haaren return -1; 19511638261aSHarry van Haaren } 19521638261aSHarry van Haaren 19531638261aSHarry van Haaren /* unlink all ports to have outstanding unlink requests */ 19541638261aSHarry van Haaren int ret = rte_event_port_unlink(evdev, t->port[0], NULL, 0); 19551638261aSHarry van Haaren if (ret < 0) { 19561638261aSHarry van Haaren printf("%d: Failed to unlink queues\n", __LINE__); 19571638261aSHarry van Haaren return -1; 19581638261aSHarry van Haaren } 19591638261aSHarry van Haaren 19601638261aSHarry van Haaren /* get active unlinks here, expect 3 */ 19611638261aSHarry van Haaren int unlinks_in_progress = 19621638261aSHarry van Haaren rte_event_port_unlinks_in_progress(evdev, t->port[0]); 19631638261aSHarry van Haaren if (unlinks_in_progress != 3) { 19641638261aSHarry van Haaren printf("%d: Expected num unlinks in progress == 3, got %d\n", 19651638261aSHarry van Haaren __LINE__, unlinks_in_progress); 19661638261aSHarry van Haaren return -1; 19671638261aSHarry van Haaren } 19681638261aSHarry van Haaren 19691638261aSHarry van Haaren /* run scheduler service on this thread to ack the unlinks */ 19701638261aSHarry van Haaren rte_service_run_iter_on_app_lcore(t->service_id, 1); 19711638261aSHarry van Haaren 19721638261aSHarry van Haaren /* active unlinks expected as 0 as scheduler thread has acked */ 19731638261aSHarry van Haaren unlinks_in_progress = 19741638261aSHarry van Haaren rte_event_port_unlinks_in_progress(evdev, t->port[0]); 19751638261aSHarry van Haaren if (unlinks_in_progress != 0) { 19761638261aSHarry van Haaren printf("%d: Expected num unlinks in progress == 0, got %d\n", 19771638261aSHarry van Haaren __LINE__, unlinks_in_progress); 19781638261aSHarry van Haaren } 19791638261aSHarry van Haaren 19801638261aSHarry van Haaren cleanup(t); 19811638261aSHarry van Haaren return 0; 19821638261aSHarry van Haaren } 19831638261aSHarry van Haaren 19841638261aSHarry van Haaren static int 198585fb515bSPavan Nikhilesh load_balancing(struct test *t) 198685fb515bSPavan Nikhilesh { 198785fb515bSPavan Nikhilesh const int rx_enq = 0; 198885fb515bSPavan Nikhilesh int err; 198985fb515bSPavan Nikhilesh uint32_t i; 199085fb515bSPavan Nikhilesh 199185fb515bSPavan Nikhilesh if (init(t, 1, 4) < 0 || 199285fb515bSPavan Nikhilesh create_ports(t, 4) < 0 || 199385fb515bSPavan Nikhilesh create_atomic_qids(t, 1) < 0) { 199485fb515bSPavan Nikhilesh printf("%d: Error initializing device\n", __LINE__); 199585fb515bSPavan Nikhilesh return -1; 199685fb515bSPavan Nikhilesh } 199785fb515bSPavan Nikhilesh 199885fb515bSPavan Nikhilesh for (i = 0; i < 3; i++) { 199985fb515bSPavan Nikhilesh /* map port 1 - 3 inclusive */ 200085fb515bSPavan Nikhilesh if (rte_event_port_link(evdev, t->port[i+1], &t->qid[0], 200185fb515bSPavan Nikhilesh NULL, 1) != 1) { 200285fb515bSPavan Nikhilesh printf("%d: error mapping qid to port %d\n", 200385fb515bSPavan Nikhilesh __LINE__, i); 200485fb515bSPavan Nikhilesh return -1; 200585fb515bSPavan Nikhilesh } 200685fb515bSPavan Nikhilesh } 200785fb515bSPavan Nikhilesh 200885fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 200985fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 201085fb515bSPavan Nikhilesh return -1; 201185fb515bSPavan Nikhilesh } 201285fb515bSPavan Nikhilesh 201385fb515bSPavan Nikhilesh /************** FORWARD ****************/ 201485fb515bSPavan Nikhilesh /* 201585fb515bSPavan Nikhilesh * Create a set of flows that test the load-balancing operation of the 201685fb515bSPavan Nikhilesh * implementation. Fill CQ 0 and 1 with flows 0 and 1, and test 201785fb515bSPavan Nikhilesh * with a new flow, which should be sent to the 3rd mapped CQ 201885fb515bSPavan Nikhilesh */ 201985fb515bSPavan Nikhilesh static uint32_t flows[] = {0, 1, 1, 0, 0, 2, 2, 0, 2}; 202085fb515bSPavan Nikhilesh 202185fb515bSPavan Nikhilesh for (i = 0; i < RTE_DIM(flows); i++) { 202285fb515bSPavan Nikhilesh struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool); 202385fb515bSPavan Nikhilesh if (!arp) { 202485fb515bSPavan Nikhilesh printf("%d: gen of pkt failed\n", __LINE__); 202585fb515bSPavan Nikhilesh return -1; 202685fb515bSPavan Nikhilesh } 202785fb515bSPavan Nikhilesh 202885fb515bSPavan Nikhilesh struct rte_event ev = { 202985fb515bSPavan Nikhilesh .op = RTE_EVENT_OP_NEW, 203085fb515bSPavan Nikhilesh .queue_id = t->qid[0], 203185fb515bSPavan Nikhilesh .flow_id = flows[i], 203285fb515bSPavan Nikhilesh .mbuf = arp, 203385fb515bSPavan Nikhilesh }; 203485fb515bSPavan Nikhilesh /* generate pkt and enqueue */ 203585fb515bSPavan Nikhilesh err = rte_event_enqueue_burst(evdev, t->port[rx_enq], &ev, 1); 20361b03e292SHarry van Haaren if (err != 1) { 203785fb515bSPavan Nikhilesh printf("%d: Failed to enqueue\n", __LINE__); 203885fb515bSPavan Nikhilesh return -1; 203985fb515bSPavan Nikhilesh } 204085fb515bSPavan Nikhilesh } 204185fb515bSPavan Nikhilesh 204285fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 204385fb515bSPavan Nikhilesh 204485fb515bSPavan Nikhilesh struct test_event_dev_stats stats; 204585fb515bSPavan Nikhilesh err = test_event_dev_stats_get(evdev, &stats); 204685fb515bSPavan Nikhilesh if (err) { 204785fb515bSPavan Nikhilesh printf("%d: failed to get stats\n", __LINE__); 204885fb515bSPavan Nikhilesh return -1; 204985fb515bSPavan Nikhilesh } 205085fb515bSPavan Nikhilesh 205185fb515bSPavan Nikhilesh if (stats.port_inflight[1] != 4) { 205285fb515bSPavan Nikhilesh printf("%d:%s: port 1 inflight not correct\n", __LINE__, 205385fb515bSPavan Nikhilesh __func__); 205485fb515bSPavan Nikhilesh return -1; 205585fb515bSPavan Nikhilesh } 205685fb515bSPavan Nikhilesh if (stats.port_inflight[2] != 2) { 205785fb515bSPavan Nikhilesh printf("%d:%s: port 2 inflight not correct\n", __LINE__, 205885fb515bSPavan Nikhilesh __func__); 205985fb515bSPavan Nikhilesh return -1; 206085fb515bSPavan Nikhilesh } 206185fb515bSPavan Nikhilesh if (stats.port_inflight[3] != 3) { 206285fb515bSPavan Nikhilesh printf("%d:%s: port 3 inflight not correct\n", __LINE__, 206385fb515bSPavan Nikhilesh __func__); 206485fb515bSPavan Nikhilesh return -1; 206585fb515bSPavan Nikhilesh } 206685fb515bSPavan Nikhilesh 206785fb515bSPavan Nikhilesh cleanup(t); 206885fb515bSPavan Nikhilesh return 0; 206985fb515bSPavan Nikhilesh } 207085fb515bSPavan Nikhilesh 207185fb515bSPavan Nikhilesh static int 207285fb515bSPavan Nikhilesh load_balancing_history(struct test *t) 207385fb515bSPavan Nikhilesh { 207485fb515bSPavan Nikhilesh struct test_event_dev_stats stats = {0}; 207585fb515bSPavan Nikhilesh const int rx_enq = 0; 207685fb515bSPavan Nikhilesh int err; 207785fb515bSPavan Nikhilesh uint32_t i; 207885fb515bSPavan Nikhilesh 207985fb515bSPavan Nikhilesh /* Create instance with 1 atomic QID going to 3 ports + 1 prod port */ 208085fb515bSPavan Nikhilesh if (init(t, 1, 4) < 0 || 208185fb515bSPavan Nikhilesh create_ports(t, 4) < 0 || 208285fb515bSPavan Nikhilesh create_atomic_qids(t, 1) < 0) 208385fb515bSPavan Nikhilesh return -1; 208485fb515bSPavan Nikhilesh 208585fb515bSPavan Nikhilesh /* CQ mapping to QID */ 208685fb515bSPavan Nikhilesh if (rte_event_port_link(evdev, t->port[1], &t->qid[0], NULL, 1) != 1) { 208785fb515bSPavan Nikhilesh printf("%d: error mapping port 1 qid\n", __LINE__); 208885fb515bSPavan Nikhilesh return -1; 208985fb515bSPavan Nikhilesh } 209085fb515bSPavan Nikhilesh if (rte_event_port_link(evdev, t->port[2], &t->qid[0], NULL, 1) != 1) { 209185fb515bSPavan Nikhilesh printf("%d: error mapping port 2 qid\n", __LINE__); 209285fb515bSPavan Nikhilesh return -1; 209385fb515bSPavan Nikhilesh } 209485fb515bSPavan Nikhilesh if (rte_event_port_link(evdev, t->port[3], &t->qid[0], NULL, 1) != 1) { 209585fb515bSPavan Nikhilesh printf("%d: error mapping port 3 qid\n", __LINE__); 209685fb515bSPavan Nikhilesh return -1; 209785fb515bSPavan Nikhilesh } 209885fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 209985fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 210085fb515bSPavan Nikhilesh return -1; 210185fb515bSPavan Nikhilesh } 210285fb515bSPavan Nikhilesh 210385fb515bSPavan Nikhilesh /* 210485fb515bSPavan Nikhilesh * Create a set of flows that test the load-balancing operation of the 210585fb515bSPavan Nikhilesh * implementation. Fill CQ 0, 1 and 2 with flows 0, 1 and 2, drop 210685fb515bSPavan Nikhilesh * the packet from CQ 0, send in a new set of flows. Ensure that: 210785fb515bSPavan Nikhilesh * 1. The new flow 3 gets into the empty CQ0 210885fb515bSPavan Nikhilesh * 2. packets for existing flow gets added into CQ1 210985fb515bSPavan Nikhilesh * 3. Next flow 0 pkt is now onto CQ2, since CQ0 and CQ1 now contain 211085fb515bSPavan Nikhilesh * more outstanding pkts 211185fb515bSPavan Nikhilesh * 211285fb515bSPavan Nikhilesh * This test makes sure that when a flow ends (i.e. all packets 211385fb515bSPavan Nikhilesh * have been completed for that flow), that the flow can be moved 211485fb515bSPavan Nikhilesh * to a different CQ when new packets come in for that flow. 211585fb515bSPavan Nikhilesh */ 211685fb515bSPavan Nikhilesh static uint32_t flows1[] = {0, 1, 1, 2}; 211785fb515bSPavan Nikhilesh 211885fb515bSPavan Nikhilesh for (i = 0; i < RTE_DIM(flows1); i++) { 211985fb515bSPavan Nikhilesh struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool); 212085fb515bSPavan Nikhilesh struct rte_event ev = { 212185fb515bSPavan Nikhilesh .flow_id = flows1[i], 212285fb515bSPavan Nikhilesh .op = RTE_EVENT_OP_NEW, 212385fb515bSPavan Nikhilesh .queue_id = t->qid[0], 212485fb515bSPavan Nikhilesh .event_type = RTE_EVENT_TYPE_CPU, 212585fb515bSPavan Nikhilesh .priority = RTE_EVENT_DEV_PRIORITY_NORMAL, 212685fb515bSPavan Nikhilesh .mbuf = arp 212785fb515bSPavan Nikhilesh }; 212885fb515bSPavan Nikhilesh 212985fb515bSPavan Nikhilesh if (!arp) { 213085fb515bSPavan Nikhilesh printf("%d: gen of pkt failed\n", __LINE__); 213185fb515bSPavan Nikhilesh return -1; 213285fb515bSPavan Nikhilesh } 213385fb515bSPavan Nikhilesh arp->hash.rss = flows1[i]; 213485fb515bSPavan Nikhilesh err = rte_event_enqueue_burst(evdev, t->port[rx_enq], &ev, 1); 21351b03e292SHarry van Haaren if (err != 1) { 213685fb515bSPavan Nikhilesh printf("%d: Failed to enqueue\n", __LINE__); 213785fb515bSPavan Nikhilesh return -1; 213885fb515bSPavan Nikhilesh } 213985fb515bSPavan Nikhilesh } 214085fb515bSPavan Nikhilesh 214185fb515bSPavan Nikhilesh /* call the scheduler */ 214285fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 214385fb515bSPavan Nikhilesh 214485fb515bSPavan Nikhilesh /* Dequeue the flow 0 packet from port 1, so that we can then drop */ 214585fb515bSPavan Nikhilesh struct rte_event ev; 214685fb515bSPavan Nikhilesh if (!rte_event_dequeue_burst(evdev, t->port[1], &ev, 1, 0)) { 214785fb515bSPavan Nikhilesh printf("%d: failed to dequeue\n", __LINE__); 214885fb515bSPavan Nikhilesh return -1; 214985fb515bSPavan Nikhilesh } 215085fb515bSPavan Nikhilesh if (ev.mbuf->hash.rss != flows1[0]) { 215185fb515bSPavan Nikhilesh printf("%d: unexpected flow received\n", __LINE__); 215285fb515bSPavan Nikhilesh return -1; 215385fb515bSPavan Nikhilesh } 215485fb515bSPavan Nikhilesh 215585fb515bSPavan Nikhilesh /* drop the flow 0 packet from port 1 */ 215685fb515bSPavan Nikhilesh rte_event_enqueue_burst(evdev, t->port[1], &release_ev, 1); 215785fb515bSPavan Nikhilesh 215885fb515bSPavan Nikhilesh /* call the scheduler */ 215985fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 216085fb515bSPavan Nikhilesh 216185fb515bSPavan Nikhilesh /* 216285fb515bSPavan Nikhilesh * Set up the next set of flows, first a new flow to fill up 216385fb515bSPavan Nikhilesh * CQ 0, so that the next flow 0 packet should go to CQ2 216485fb515bSPavan Nikhilesh */ 216585fb515bSPavan Nikhilesh static uint32_t flows2[] = { 3, 3, 3, 1, 1, 0 }; 216685fb515bSPavan Nikhilesh 216785fb515bSPavan Nikhilesh for (i = 0; i < RTE_DIM(flows2); i++) { 216885fb515bSPavan Nikhilesh struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool); 216985fb515bSPavan Nikhilesh struct rte_event ev = { 217085fb515bSPavan Nikhilesh .flow_id = flows2[i], 217185fb515bSPavan Nikhilesh .op = RTE_EVENT_OP_NEW, 217285fb515bSPavan Nikhilesh .queue_id = t->qid[0], 217385fb515bSPavan Nikhilesh .event_type = RTE_EVENT_TYPE_CPU, 217485fb515bSPavan Nikhilesh .priority = RTE_EVENT_DEV_PRIORITY_NORMAL, 217585fb515bSPavan Nikhilesh .mbuf = arp 217685fb515bSPavan Nikhilesh }; 217785fb515bSPavan Nikhilesh 217885fb515bSPavan Nikhilesh if (!arp) { 217985fb515bSPavan Nikhilesh printf("%d: gen of pkt failed\n", __LINE__); 218085fb515bSPavan Nikhilesh return -1; 218185fb515bSPavan Nikhilesh } 218285fb515bSPavan Nikhilesh arp->hash.rss = flows2[i]; 218385fb515bSPavan Nikhilesh 218485fb515bSPavan Nikhilesh err = rte_event_enqueue_burst(evdev, t->port[rx_enq], &ev, 1); 21851b03e292SHarry van Haaren if (err != 1) { 218685fb515bSPavan Nikhilesh printf("%d: Failed to enqueue\n", __LINE__); 218785fb515bSPavan Nikhilesh return -1; 218885fb515bSPavan Nikhilesh } 218985fb515bSPavan Nikhilesh } 219085fb515bSPavan Nikhilesh 219185fb515bSPavan Nikhilesh /* schedule */ 219285fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 219385fb515bSPavan Nikhilesh 219485fb515bSPavan Nikhilesh err = test_event_dev_stats_get(evdev, &stats); 219585fb515bSPavan Nikhilesh if (err) { 219685fb515bSPavan Nikhilesh printf("%d:failed to get stats\n", __LINE__); 219785fb515bSPavan Nikhilesh return -1; 219885fb515bSPavan Nikhilesh } 219985fb515bSPavan Nikhilesh 220085fb515bSPavan Nikhilesh /* 220185fb515bSPavan Nikhilesh * Now check the resulting inflights on each port. 220285fb515bSPavan Nikhilesh */ 220385fb515bSPavan Nikhilesh if (stats.port_inflight[1] != 3) { 220485fb515bSPavan Nikhilesh printf("%d:%s: port 1 inflight not correct\n", __LINE__, 220585fb515bSPavan Nikhilesh __func__); 220685fb515bSPavan Nikhilesh printf("Inflights, ports 1, 2, 3: %u, %u, %u\n", 220785fb515bSPavan Nikhilesh (unsigned int)stats.port_inflight[1], 220885fb515bSPavan Nikhilesh (unsigned int)stats.port_inflight[2], 220985fb515bSPavan Nikhilesh (unsigned int)stats.port_inflight[3]); 221085fb515bSPavan Nikhilesh return -1; 221185fb515bSPavan Nikhilesh } 221285fb515bSPavan Nikhilesh if (stats.port_inflight[2] != 4) { 221385fb515bSPavan Nikhilesh printf("%d:%s: port 2 inflight not correct\n", __LINE__, 221485fb515bSPavan Nikhilesh __func__); 221585fb515bSPavan Nikhilesh printf("Inflights, ports 1, 2, 3: %u, %u, %u\n", 221685fb515bSPavan Nikhilesh (unsigned int)stats.port_inflight[1], 221785fb515bSPavan Nikhilesh (unsigned int)stats.port_inflight[2], 221885fb515bSPavan Nikhilesh (unsigned int)stats.port_inflight[3]); 221985fb515bSPavan Nikhilesh return -1; 222085fb515bSPavan Nikhilesh } 222185fb515bSPavan Nikhilesh if (stats.port_inflight[3] != 2) { 222285fb515bSPavan Nikhilesh printf("%d:%s: port 3 inflight not correct\n", __LINE__, 222385fb515bSPavan Nikhilesh __func__); 222485fb515bSPavan Nikhilesh printf("Inflights, ports 1, 2, 3: %u, %u, %u\n", 222585fb515bSPavan Nikhilesh (unsigned int)stats.port_inflight[1], 222685fb515bSPavan Nikhilesh (unsigned int)stats.port_inflight[2], 222785fb515bSPavan Nikhilesh (unsigned int)stats.port_inflight[3]); 222885fb515bSPavan Nikhilesh return -1; 222985fb515bSPavan Nikhilesh } 223085fb515bSPavan Nikhilesh 223185fb515bSPavan Nikhilesh for (i = 1; i <= 3; i++) { 223285fb515bSPavan Nikhilesh struct rte_event ev; 223385fb515bSPavan Nikhilesh while (rte_event_dequeue_burst(evdev, i, &ev, 1, 0)) 223485fb515bSPavan Nikhilesh rte_event_enqueue_burst(evdev, i, &release_ev, 1); 223585fb515bSPavan Nikhilesh } 223685fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 223785fb515bSPavan Nikhilesh 223885fb515bSPavan Nikhilesh cleanup(t); 223985fb515bSPavan Nikhilesh return 0; 224085fb515bSPavan Nikhilesh } 224185fb515bSPavan Nikhilesh 224285fb515bSPavan Nikhilesh static int 224385fb515bSPavan Nikhilesh invalid_qid(struct test *t) 224485fb515bSPavan Nikhilesh { 224585fb515bSPavan Nikhilesh struct test_event_dev_stats stats; 224685fb515bSPavan Nikhilesh const int rx_enq = 0; 224785fb515bSPavan Nikhilesh int err; 224885fb515bSPavan Nikhilesh uint32_t i; 224985fb515bSPavan Nikhilesh 225085fb515bSPavan Nikhilesh if (init(t, 1, 4) < 0 || 225185fb515bSPavan Nikhilesh create_ports(t, 4) < 0 || 225285fb515bSPavan Nikhilesh create_atomic_qids(t, 1) < 0) { 225385fb515bSPavan Nikhilesh printf("%d: Error initializing device\n", __LINE__); 225485fb515bSPavan Nikhilesh return -1; 225585fb515bSPavan Nikhilesh } 225685fb515bSPavan Nikhilesh 225785fb515bSPavan Nikhilesh /* CQ mapping to QID */ 225885fb515bSPavan Nikhilesh for (i = 0; i < 4; i++) { 225985fb515bSPavan Nikhilesh err = rte_event_port_link(evdev, t->port[i], &t->qid[0], 226085fb515bSPavan Nikhilesh NULL, 1); 226185fb515bSPavan Nikhilesh if (err != 1) { 226285fb515bSPavan Nikhilesh printf("%d: error mapping port 1 qid\n", __LINE__); 226385fb515bSPavan Nikhilesh return -1; 226485fb515bSPavan Nikhilesh } 226585fb515bSPavan Nikhilesh } 226685fb515bSPavan Nikhilesh 226785fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 226885fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 226985fb515bSPavan Nikhilesh return -1; 227085fb515bSPavan Nikhilesh } 227185fb515bSPavan Nikhilesh 227285fb515bSPavan Nikhilesh /* 227385fb515bSPavan Nikhilesh * Send in a packet with an invalid qid to the scheduler. 227485fb515bSPavan Nikhilesh * We should see the packed enqueued OK, but the inflights for 227585fb515bSPavan Nikhilesh * that packet should not be incremented, and the rx_dropped 227685fb515bSPavan Nikhilesh * should be incremented. 227785fb515bSPavan Nikhilesh */ 227885fb515bSPavan Nikhilesh static uint32_t flows1[] = {20}; 227985fb515bSPavan Nikhilesh 228085fb515bSPavan Nikhilesh for (i = 0; i < RTE_DIM(flows1); i++) { 228185fb515bSPavan Nikhilesh struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool); 228285fb515bSPavan Nikhilesh if (!arp) { 228385fb515bSPavan Nikhilesh printf("%d: gen of pkt failed\n", __LINE__); 228485fb515bSPavan Nikhilesh return -1; 228585fb515bSPavan Nikhilesh } 228685fb515bSPavan Nikhilesh 228785fb515bSPavan Nikhilesh struct rte_event ev = { 228885fb515bSPavan Nikhilesh .op = RTE_EVENT_OP_NEW, 228985fb515bSPavan Nikhilesh .queue_id = t->qid[0] + flows1[i], 229085fb515bSPavan Nikhilesh .flow_id = i, 229185fb515bSPavan Nikhilesh .mbuf = arp, 229285fb515bSPavan Nikhilesh }; 229385fb515bSPavan Nikhilesh /* generate pkt and enqueue */ 229485fb515bSPavan Nikhilesh err = rte_event_enqueue_burst(evdev, t->port[rx_enq], &ev, 1); 22951b03e292SHarry van Haaren if (err != 1) { 229685fb515bSPavan Nikhilesh printf("%d: Failed to enqueue\n", __LINE__); 229785fb515bSPavan Nikhilesh return -1; 229885fb515bSPavan Nikhilesh } 229985fb515bSPavan Nikhilesh } 230085fb515bSPavan Nikhilesh 230185fb515bSPavan Nikhilesh /* call the scheduler */ 230285fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 230385fb515bSPavan Nikhilesh 230485fb515bSPavan Nikhilesh err = test_event_dev_stats_get(evdev, &stats); 230585fb515bSPavan Nikhilesh if (err) { 230685fb515bSPavan Nikhilesh printf("%d: failed to get stats\n", __LINE__); 230785fb515bSPavan Nikhilesh return -1; 230885fb515bSPavan Nikhilesh } 230985fb515bSPavan Nikhilesh 231085fb515bSPavan Nikhilesh /* 231185fb515bSPavan Nikhilesh * Now check the resulting inflights on the port, and the rx_dropped. 231285fb515bSPavan Nikhilesh */ 231385fb515bSPavan Nikhilesh if (stats.port_inflight[0] != 0) { 231485fb515bSPavan Nikhilesh printf("%d:%s: port 1 inflight count not correct\n", __LINE__, 231585fb515bSPavan Nikhilesh __func__); 231685fb515bSPavan Nikhilesh rte_event_dev_dump(evdev, stdout); 231785fb515bSPavan Nikhilesh return -1; 231885fb515bSPavan Nikhilesh } 231985fb515bSPavan Nikhilesh if (stats.port_rx_dropped[0] != 1) { 232085fb515bSPavan Nikhilesh printf("%d:%s: port 1 drops\n", __LINE__, __func__); 232185fb515bSPavan Nikhilesh rte_event_dev_dump(evdev, stdout); 232285fb515bSPavan Nikhilesh return -1; 232385fb515bSPavan Nikhilesh } 232485fb515bSPavan Nikhilesh /* each packet drop should only be counted in one place - port or dev */ 232585fb515bSPavan Nikhilesh if (stats.rx_dropped != 0) { 232685fb515bSPavan Nikhilesh printf("%d:%s: port 1 dropped count not correct\n", __LINE__, 232785fb515bSPavan Nikhilesh __func__); 232885fb515bSPavan Nikhilesh rte_event_dev_dump(evdev, stdout); 232985fb515bSPavan Nikhilesh return -1; 233085fb515bSPavan Nikhilesh } 233185fb515bSPavan Nikhilesh 233285fb515bSPavan Nikhilesh cleanup(t); 233385fb515bSPavan Nikhilesh return 0; 233485fb515bSPavan Nikhilesh } 233585fb515bSPavan Nikhilesh 233685fb515bSPavan Nikhilesh static int 233785fb515bSPavan Nikhilesh single_packet(struct test *t) 233885fb515bSPavan Nikhilesh { 233985fb515bSPavan Nikhilesh const uint32_t MAGIC_SEQN = 7321; 234085fb515bSPavan Nikhilesh struct rte_event ev; 234185fb515bSPavan Nikhilesh struct test_event_dev_stats stats; 234285fb515bSPavan Nikhilesh const int rx_enq = 0; 234385fb515bSPavan Nikhilesh const int wrk_enq = 2; 234485fb515bSPavan Nikhilesh int err; 234585fb515bSPavan Nikhilesh 234685fb515bSPavan Nikhilesh /* Create instance with 4 ports */ 234785fb515bSPavan Nikhilesh if (init(t, 1, 4) < 0 || 234885fb515bSPavan Nikhilesh create_ports(t, 4) < 0 || 234985fb515bSPavan Nikhilesh create_atomic_qids(t, 1) < 0) { 235085fb515bSPavan Nikhilesh printf("%d: Error initializing device\n", __LINE__); 235185fb515bSPavan Nikhilesh return -1; 235285fb515bSPavan Nikhilesh } 235385fb515bSPavan Nikhilesh 235485fb515bSPavan Nikhilesh /* CQ mapping to QID */ 235585fb515bSPavan Nikhilesh err = rte_event_port_link(evdev, t->port[wrk_enq], NULL, NULL, 0); 235685fb515bSPavan Nikhilesh if (err != 1) { 235785fb515bSPavan Nikhilesh printf("%d: error mapping lb qid\n", __LINE__); 235885fb515bSPavan Nikhilesh cleanup(t); 235985fb515bSPavan Nikhilesh return -1; 236085fb515bSPavan Nikhilesh } 236185fb515bSPavan Nikhilesh 236285fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 236385fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 236485fb515bSPavan Nikhilesh return -1; 236585fb515bSPavan Nikhilesh } 236685fb515bSPavan Nikhilesh 236785fb515bSPavan Nikhilesh /************** Gen pkt and enqueue ****************/ 236885fb515bSPavan Nikhilesh struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool); 236985fb515bSPavan Nikhilesh if (!arp) { 237085fb515bSPavan Nikhilesh printf("%d: gen of pkt failed\n", __LINE__); 237185fb515bSPavan Nikhilesh return -1; 237285fb515bSPavan Nikhilesh } 237385fb515bSPavan Nikhilesh 237485fb515bSPavan Nikhilesh ev.op = RTE_EVENT_OP_NEW; 237585fb515bSPavan Nikhilesh ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL; 237685fb515bSPavan Nikhilesh ev.mbuf = arp; 237785fb515bSPavan Nikhilesh ev.queue_id = 0; 237885fb515bSPavan Nikhilesh ev.flow_id = 3; 237985fb515bSPavan Nikhilesh arp->seqn = MAGIC_SEQN; 238085fb515bSPavan Nikhilesh 238185fb515bSPavan Nikhilesh err = rte_event_enqueue_burst(evdev, t->port[rx_enq], &ev, 1); 23821b03e292SHarry van Haaren if (err != 1) { 238385fb515bSPavan Nikhilesh printf("%d: Failed to enqueue\n", __LINE__); 238485fb515bSPavan Nikhilesh return -1; 238585fb515bSPavan Nikhilesh } 238685fb515bSPavan Nikhilesh 238785fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 238885fb515bSPavan Nikhilesh 238985fb515bSPavan Nikhilesh err = test_event_dev_stats_get(evdev, &stats); 239085fb515bSPavan Nikhilesh if (err) { 239185fb515bSPavan Nikhilesh printf("%d: failed to get stats\n", __LINE__); 239285fb515bSPavan Nikhilesh return -1; 239385fb515bSPavan Nikhilesh } 239485fb515bSPavan Nikhilesh 239585fb515bSPavan Nikhilesh if (stats.rx_pkts != 1 || 239685fb515bSPavan Nikhilesh stats.tx_pkts != 1 || 239785fb515bSPavan Nikhilesh stats.port_inflight[wrk_enq] != 1) { 239885fb515bSPavan Nikhilesh printf("%d: Sched core didn't handle pkt as expected\n", 239985fb515bSPavan Nikhilesh __LINE__); 240085fb515bSPavan Nikhilesh rte_event_dev_dump(evdev, stdout); 240185fb515bSPavan Nikhilesh return -1; 240285fb515bSPavan Nikhilesh } 240385fb515bSPavan Nikhilesh 240485fb515bSPavan Nikhilesh uint32_t deq_pkts; 240585fb515bSPavan Nikhilesh 240685fb515bSPavan Nikhilesh deq_pkts = rte_event_dequeue_burst(evdev, t->port[wrk_enq], &ev, 1, 0); 240785fb515bSPavan Nikhilesh if (deq_pkts < 1) { 240885fb515bSPavan Nikhilesh printf("%d: Failed to deq\n", __LINE__); 240985fb515bSPavan Nikhilesh return -1; 241085fb515bSPavan Nikhilesh } 241185fb515bSPavan Nikhilesh 241285fb515bSPavan Nikhilesh err = test_event_dev_stats_get(evdev, &stats); 241385fb515bSPavan Nikhilesh if (err) { 241485fb515bSPavan Nikhilesh printf("%d: failed to get stats\n", __LINE__); 241585fb515bSPavan Nikhilesh return -1; 241685fb515bSPavan Nikhilesh } 241785fb515bSPavan Nikhilesh 241885fb515bSPavan Nikhilesh err = test_event_dev_stats_get(evdev, &stats); 241985fb515bSPavan Nikhilesh if (ev.mbuf->seqn != MAGIC_SEQN) { 242085fb515bSPavan Nikhilesh printf("%d: magic sequence number not dequeued\n", __LINE__); 242185fb515bSPavan Nikhilesh return -1; 242285fb515bSPavan Nikhilesh } 242385fb515bSPavan Nikhilesh 242485fb515bSPavan Nikhilesh rte_pktmbuf_free(ev.mbuf); 242585fb515bSPavan Nikhilesh err = rte_event_enqueue_burst(evdev, t->port[wrk_enq], &release_ev, 1); 24261b03e292SHarry van Haaren if (err != 1) { 242785fb515bSPavan Nikhilesh printf("%d: Failed to enqueue\n", __LINE__); 242885fb515bSPavan Nikhilesh return -1; 242985fb515bSPavan Nikhilesh } 243085fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 243185fb515bSPavan Nikhilesh 243285fb515bSPavan Nikhilesh err = test_event_dev_stats_get(evdev, &stats); 243385fb515bSPavan Nikhilesh if (stats.port_inflight[wrk_enq] != 0) { 243485fb515bSPavan Nikhilesh printf("%d: port inflight not correct\n", __LINE__); 243585fb515bSPavan Nikhilesh return -1; 243685fb515bSPavan Nikhilesh } 243785fb515bSPavan Nikhilesh 243885fb515bSPavan Nikhilesh cleanup(t); 243985fb515bSPavan Nikhilesh return 0; 244085fb515bSPavan Nikhilesh } 244185fb515bSPavan Nikhilesh 244285fb515bSPavan Nikhilesh static int 244385fb515bSPavan Nikhilesh inflight_counts(struct test *t) 244485fb515bSPavan Nikhilesh { 244585fb515bSPavan Nikhilesh struct rte_event ev; 244685fb515bSPavan Nikhilesh struct test_event_dev_stats stats; 244785fb515bSPavan Nikhilesh const int rx_enq = 0; 244885fb515bSPavan Nikhilesh const int p1 = 1; 244985fb515bSPavan Nikhilesh const int p2 = 2; 245085fb515bSPavan Nikhilesh int err; 245185fb515bSPavan Nikhilesh int i; 245285fb515bSPavan Nikhilesh 245385fb515bSPavan Nikhilesh /* Create instance with 4 ports */ 245485fb515bSPavan Nikhilesh if (init(t, 2, 3) < 0 || 245585fb515bSPavan Nikhilesh create_ports(t, 3) < 0 || 245685fb515bSPavan Nikhilesh create_atomic_qids(t, 2) < 0) { 245785fb515bSPavan Nikhilesh printf("%d: Error initializing device\n", __LINE__); 245885fb515bSPavan Nikhilesh return -1; 245985fb515bSPavan Nikhilesh } 246085fb515bSPavan Nikhilesh 246185fb515bSPavan Nikhilesh /* CQ mapping to QID */ 246285fb515bSPavan Nikhilesh err = rte_event_port_link(evdev, t->port[p1], &t->qid[0], NULL, 1); 246385fb515bSPavan Nikhilesh if (err != 1) { 246485fb515bSPavan Nikhilesh printf("%d: error mapping lb qid\n", __LINE__); 246585fb515bSPavan Nikhilesh cleanup(t); 246685fb515bSPavan Nikhilesh return -1; 246785fb515bSPavan Nikhilesh } 246885fb515bSPavan Nikhilesh err = rte_event_port_link(evdev, t->port[p2], &t->qid[1], NULL, 1); 246985fb515bSPavan Nikhilesh if (err != 1) { 247085fb515bSPavan Nikhilesh printf("%d: error mapping lb qid\n", __LINE__); 247185fb515bSPavan Nikhilesh cleanup(t); 247285fb515bSPavan Nikhilesh return -1; 247385fb515bSPavan Nikhilesh } 247485fb515bSPavan Nikhilesh 247585fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 247685fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 247785fb515bSPavan Nikhilesh return -1; 247885fb515bSPavan Nikhilesh } 247985fb515bSPavan Nikhilesh 248085fb515bSPavan Nikhilesh /************** FORWARD ****************/ 248185fb515bSPavan Nikhilesh #define QID1_NUM 5 248285fb515bSPavan Nikhilesh for (i = 0; i < QID1_NUM; i++) { 248385fb515bSPavan Nikhilesh struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool); 248485fb515bSPavan Nikhilesh 248585fb515bSPavan Nikhilesh if (!arp) { 248685fb515bSPavan Nikhilesh printf("%d: gen of pkt failed\n", __LINE__); 248785fb515bSPavan Nikhilesh goto err; 248885fb515bSPavan Nikhilesh } 248985fb515bSPavan Nikhilesh 249085fb515bSPavan Nikhilesh ev.queue_id = t->qid[0]; 249185fb515bSPavan Nikhilesh ev.op = RTE_EVENT_OP_NEW; 249285fb515bSPavan Nikhilesh ev.mbuf = arp; 249385fb515bSPavan Nikhilesh err = rte_event_enqueue_burst(evdev, t->port[rx_enq], &ev, 1); 249485fb515bSPavan Nikhilesh if (err != 1) { 249585fb515bSPavan Nikhilesh printf("%d: Failed to enqueue\n", __LINE__); 249685fb515bSPavan Nikhilesh goto err; 249785fb515bSPavan Nikhilesh } 249885fb515bSPavan Nikhilesh } 249985fb515bSPavan Nikhilesh #define QID2_NUM 3 250085fb515bSPavan Nikhilesh for (i = 0; i < QID2_NUM; i++) { 250185fb515bSPavan Nikhilesh struct rte_mbuf *arp = rte_gen_arp(0, t->mbuf_pool); 250285fb515bSPavan Nikhilesh 250385fb515bSPavan Nikhilesh if (!arp) { 250485fb515bSPavan Nikhilesh printf("%d: gen of pkt failed\n", __LINE__); 250585fb515bSPavan Nikhilesh goto err; 250685fb515bSPavan Nikhilesh } 250785fb515bSPavan Nikhilesh ev.queue_id = t->qid[1]; 250885fb515bSPavan Nikhilesh ev.op = RTE_EVENT_OP_NEW; 250985fb515bSPavan Nikhilesh ev.mbuf = arp; 251085fb515bSPavan Nikhilesh err = rte_event_enqueue_burst(evdev, t->port[rx_enq], &ev, 1); 251185fb515bSPavan Nikhilesh if (err != 1) { 251285fb515bSPavan Nikhilesh printf("%d: Failed to enqueue\n", __LINE__); 251385fb515bSPavan Nikhilesh goto err; 251485fb515bSPavan Nikhilesh } 251585fb515bSPavan Nikhilesh } 251685fb515bSPavan Nikhilesh 251785fb515bSPavan Nikhilesh /* schedule */ 251885fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 251985fb515bSPavan Nikhilesh 252085fb515bSPavan Nikhilesh err = test_event_dev_stats_get(evdev, &stats); 252185fb515bSPavan Nikhilesh if (err) { 252285fb515bSPavan Nikhilesh printf("%d: failed to get stats\n", __LINE__); 252385fb515bSPavan Nikhilesh goto err; 252485fb515bSPavan Nikhilesh } 252585fb515bSPavan Nikhilesh 252685fb515bSPavan Nikhilesh if (stats.rx_pkts != QID1_NUM + QID2_NUM || 252785fb515bSPavan Nikhilesh stats.tx_pkts != QID1_NUM + QID2_NUM) { 252885fb515bSPavan Nikhilesh printf("%d: Sched core didn't handle pkt as expected\n", 252985fb515bSPavan Nikhilesh __LINE__); 253085fb515bSPavan Nikhilesh goto err; 253185fb515bSPavan Nikhilesh } 253285fb515bSPavan Nikhilesh 253385fb515bSPavan Nikhilesh if (stats.port_inflight[p1] != QID1_NUM) { 253485fb515bSPavan Nikhilesh printf("%d: %s port 1 inflight not correct\n", __LINE__, 253585fb515bSPavan Nikhilesh __func__); 253685fb515bSPavan Nikhilesh goto err; 253785fb515bSPavan Nikhilesh } 253885fb515bSPavan Nikhilesh if (stats.port_inflight[p2] != QID2_NUM) { 253985fb515bSPavan Nikhilesh printf("%d: %s port 2 inflight not correct\n", __LINE__, 254085fb515bSPavan Nikhilesh __func__); 254185fb515bSPavan Nikhilesh goto err; 254285fb515bSPavan Nikhilesh } 254385fb515bSPavan Nikhilesh 254485fb515bSPavan Nikhilesh /************** DEQUEUE INFLIGHT COUNT CHECKS ****************/ 254585fb515bSPavan Nikhilesh /* port 1 */ 254685fb515bSPavan Nikhilesh struct rte_event events[QID1_NUM + QID2_NUM]; 254785fb515bSPavan Nikhilesh uint32_t deq_pkts = rte_event_dequeue_burst(evdev, t->port[p1], events, 254885fb515bSPavan Nikhilesh RTE_DIM(events), 0); 254985fb515bSPavan Nikhilesh 255085fb515bSPavan Nikhilesh if (deq_pkts != QID1_NUM) { 255185fb515bSPavan Nikhilesh printf("%d: Port 1: DEQUEUE inflight failed\n", __LINE__); 255285fb515bSPavan Nikhilesh goto err; 255385fb515bSPavan Nikhilesh } 255485fb515bSPavan Nikhilesh err = test_event_dev_stats_get(evdev, &stats); 255585fb515bSPavan Nikhilesh if (stats.port_inflight[p1] != QID1_NUM) { 255685fb515bSPavan Nikhilesh printf("%d: port 1 inflight decrement after DEQ != 0\n", 255785fb515bSPavan Nikhilesh __LINE__); 255885fb515bSPavan Nikhilesh goto err; 255985fb515bSPavan Nikhilesh } 256085fb515bSPavan Nikhilesh for (i = 0; i < QID1_NUM; i++) { 256185fb515bSPavan Nikhilesh err = rte_event_enqueue_burst(evdev, t->port[p1], &release_ev, 256285fb515bSPavan Nikhilesh 1); 256385fb515bSPavan Nikhilesh if (err != 1) { 256485fb515bSPavan Nikhilesh printf("%d: %s rte enqueue of inf release failed\n", 256585fb515bSPavan Nikhilesh __LINE__, __func__); 256685fb515bSPavan Nikhilesh goto err; 256785fb515bSPavan Nikhilesh } 256885fb515bSPavan Nikhilesh } 256985fb515bSPavan Nikhilesh 257085fb515bSPavan Nikhilesh /* 257185fb515bSPavan Nikhilesh * As the scheduler core decrements inflights, it needs to run to 257285fb515bSPavan Nikhilesh * process packets to act on the drop messages 257385fb515bSPavan Nikhilesh */ 257485fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 257585fb515bSPavan Nikhilesh 257685fb515bSPavan Nikhilesh err = test_event_dev_stats_get(evdev, &stats); 257785fb515bSPavan Nikhilesh if (stats.port_inflight[p1] != 0) { 257885fb515bSPavan Nikhilesh printf("%d: port 1 inflight NON NULL after DROP\n", __LINE__); 257985fb515bSPavan Nikhilesh goto err; 258085fb515bSPavan Nikhilesh } 258185fb515bSPavan Nikhilesh 258285fb515bSPavan Nikhilesh /* port2 */ 258385fb515bSPavan Nikhilesh deq_pkts = rte_event_dequeue_burst(evdev, t->port[p2], events, 258485fb515bSPavan Nikhilesh RTE_DIM(events), 0); 258585fb515bSPavan Nikhilesh if (deq_pkts != QID2_NUM) { 258685fb515bSPavan Nikhilesh printf("%d: Port 2: DEQUEUE inflight failed\n", __LINE__); 258785fb515bSPavan Nikhilesh goto err; 258885fb515bSPavan Nikhilesh } 258985fb515bSPavan Nikhilesh err = test_event_dev_stats_get(evdev, &stats); 259085fb515bSPavan Nikhilesh if (stats.port_inflight[p2] != QID2_NUM) { 259185fb515bSPavan Nikhilesh printf("%d: port 1 inflight decrement after DEQ != 0\n", 259285fb515bSPavan Nikhilesh __LINE__); 259385fb515bSPavan Nikhilesh goto err; 259485fb515bSPavan Nikhilesh } 259585fb515bSPavan Nikhilesh for (i = 0; i < QID2_NUM; i++) { 259685fb515bSPavan Nikhilesh err = rte_event_enqueue_burst(evdev, t->port[p2], &release_ev, 259785fb515bSPavan Nikhilesh 1); 259885fb515bSPavan Nikhilesh if (err != 1) { 259985fb515bSPavan Nikhilesh printf("%d: %s rte enqueue of inf release failed\n", 260085fb515bSPavan Nikhilesh __LINE__, __func__); 260185fb515bSPavan Nikhilesh goto err; 260285fb515bSPavan Nikhilesh } 260385fb515bSPavan Nikhilesh } 260485fb515bSPavan Nikhilesh 260585fb515bSPavan Nikhilesh /* 260685fb515bSPavan Nikhilesh * As the scheduler core decrements inflights, it needs to run to 260785fb515bSPavan Nikhilesh * process packets to act on the drop messages 260885fb515bSPavan Nikhilesh */ 260985fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 261085fb515bSPavan Nikhilesh 261185fb515bSPavan Nikhilesh err = test_event_dev_stats_get(evdev, &stats); 261285fb515bSPavan Nikhilesh if (stats.port_inflight[p2] != 0) { 261385fb515bSPavan Nikhilesh printf("%d: port 2 inflight NON NULL after DROP\n", __LINE__); 261485fb515bSPavan Nikhilesh goto err; 261585fb515bSPavan Nikhilesh } 261685fb515bSPavan Nikhilesh cleanup(t); 261785fb515bSPavan Nikhilesh return 0; 261885fb515bSPavan Nikhilesh 261985fb515bSPavan Nikhilesh err: 262085fb515bSPavan Nikhilesh rte_event_dev_dump(evdev, stdout); 262185fb515bSPavan Nikhilesh cleanup(t); 262285fb515bSPavan Nikhilesh return -1; 262385fb515bSPavan Nikhilesh } 262485fb515bSPavan Nikhilesh 262585fb515bSPavan Nikhilesh static int 262685fb515bSPavan Nikhilesh parallel_basic(struct test *t, int check_order) 262785fb515bSPavan Nikhilesh { 262885fb515bSPavan Nikhilesh const uint8_t rx_port = 0; 262985fb515bSPavan Nikhilesh const uint8_t w1_port = 1; 263085fb515bSPavan Nikhilesh const uint8_t w3_port = 3; 263185fb515bSPavan Nikhilesh const uint8_t tx_port = 4; 263285fb515bSPavan Nikhilesh int err; 263385fb515bSPavan Nikhilesh int i; 263485fb515bSPavan Nikhilesh uint32_t deq_pkts, j; 263585fb515bSPavan Nikhilesh struct rte_mbuf *mbufs[3]; 263685fb515bSPavan Nikhilesh struct rte_mbuf *mbufs_out[3] = { 0 }; 263785fb515bSPavan Nikhilesh const uint32_t MAGIC_SEQN = 1234; 263885fb515bSPavan Nikhilesh 263985fb515bSPavan Nikhilesh /* Create instance with 4 ports */ 264085fb515bSPavan Nikhilesh if (init(t, 2, tx_port + 1) < 0 || 264185fb515bSPavan Nikhilesh create_ports(t, tx_port + 1) < 0 || 264285fb515bSPavan Nikhilesh (check_order ? create_ordered_qids(t, 1) : 264385fb515bSPavan Nikhilesh create_unordered_qids(t, 1)) < 0 || 264485fb515bSPavan Nikhilesh create_directed_qids(t, 1, &tx_port)) { 264585fb515bSPavan Nikhilesh printf("%d: Error initializing device\n", __LINE__); 264685fb515bSPavan Nikhilesh return -1; 264785fb515bSPavan Nikhilesh } 264885fb515bSPavan Nikhilesh 264985fb515bSPavan Nikhilesh /* 265085fb515bSPavan Nikhilesh * CQ mapping to QID 265185fb515bSPavan Nikhilesh * We need three ports, all mapped to the same ordered qid0. Then we'll 265285fb515bSPavan Nikhilesh * take a packet out to each port, re-enqueue in reverse order, 265385fb515bSPavan Nikhilesh * then make sure the reordering has taken place properly when we 265485fb515bSPavan Nikhilesh * dequeue from the tx_port. 265585fb515bSPavan Nikhilesh * 265685fb515bSPavan Nikhilesh * Simplified test setup diagram: 265785fb515bSPavan Nikhilesh * 265885fb515bSPavan Nikhilesh * rx_port w1_port 265985fb515bSPavan Nikhilesh * \ / \ 266085fb515bSPavan Nikhilesh * qid0 - w2_port - qid1 266185fb515bSPavan Nikhilesh * \ / \ 266285fb515bSPavan Nikhilesh * w3_port tx_port 266385fb515bSPavan Nikhilesh */ 266485fb515bSPavan Nikhilesh /* CQ mapping to QID for LB ports (directed mapped on create) */ 266585fb515bSPavan Nikhilesh for (i = w1_port; i <= w3_port; i++) { 266685fb515bSPavan Nikhilesh err = rte_event_port_link(evdev, t->port[i], &t->qid[0], NULL, 266785fb515bSPavan Nikhilesh 1); 266885fb515bSPavan Nikhilesh if (err != 1) { 266985fb515bSPavan Nikhilesh printf("%d: error mapping lb qid\n", __LINE__); 267085fb515bSPavan Nikhilesh cleanup(t); 267185fb515bSPavan Nikhilesh return -1; 267285fb515bSPavan Nikhilesh } 267385fb515bSPavan Nikhilesh } 267485fb515bSPavan Nikhilesh 267585fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 267685fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 267785fb515bSPavan Nikhilesh return -1; 267885fb515bSPavan Nikhilesh } 267985fb515bSPavan Nikhilesh 268085fb515bSPavan Nikhilesh /* Enqueue 3 packets to the rx port */ 268185fb515bSPavan Nikhilesh for (i = 0; i < 3; i++) { 268285fb515bSPavan Nikhilesh struct rte_event ev; 268385fb515bSPavan Nikhilesh mbufs[i] = rte_gen_arp(0, t->mbuf_pool); 268485fb515bSPavan Nikhilesh if (!mbufs[i]) { 268585fb515bSPavan Nikhilesh printf("%d: gen of pkt failed\n", __LINE__); 268685fb515bSPavan Nikhilesh return -1; 268785fb515bSPavan Nikhilesh } 268885fb515bSPavan Nikhilesh 268985fb515bSPavan Nikhilesh ev.queue_id = t->qid[0]; 269085fb515bSPavan Nikhilesh ev.op = RTE_EVENT_OP_NEW; 269185fb515bSPavan Nikhilesh ev.mbuf = mbufs[i]; 269285fb515bSPavan Nikhilesh mbufs[i]->seqn = MAGIC_SEQN + i; 269385fb515bSPavan Nikhilesh 269485fb515bSPavan Nikhilesh /* generate pkt and enqueue */ 269585fb515bSPavan Nikhilesh err = rte_event_enqueue_burst(evdev, t->port[rx_port], &ev, 1); 269685fb515bSPavan Nikhilesh if (err != 1) { 269785fb515bSPavan Nikhilesh printf("%d: Failed to enqueue pkt %u, retval = %u\n", 269885fb515bSPavan Nikhilesh __LINE__, i, err); 269985fb515bSPavan Nikhilesh return -1; 270085fb515bSPavan Nikhilesh } 270185fb515bSPavan Nikhilesh } 270285fb515bSPavan Nikhilesh 270385fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 270485fb515bSPavan Nikhilesh 270585fb515bSPavan Nikhilesh /* use extra slot to make logic in loops easier */ 270685fb515bSPavan Nikhilesh struct rte_event deq_ev[w3_port + 1]; 270785fb515bSPavan Nikhilesh 270885fb515bSPavan Nikhilesh /* Dequeue the 3 packets, one from each worker port */ 270985fb515bSPavan Nikhilesh for (i = w1_port; i <= w3_port; i++) { 271085fb515bSPavan Nikhilesh deq_pkts = rte_event_dequeue_burst(evdev, t->port[i], 271185fb515bSPavan Nikhilesh &deq_ev[i], 1, 0); 271285fb515bSPavan Nikhilesh if (deq_pkts != 1) { 271385fb515bSPavan Nikhilesh printf("%d: Failed to deq\n", __LINE__); 271485fb515bSPavan Nikhilesh rte_event_dev_dump(evdev, stdout); 271585fb515bSPavan Nikhilesh return -1; 271685fb515bSPavan Nikhilesh } 271785fb515bSPavan Nikhilesh } 271885fb515bSPavan Nikhilesh 271985fb515bSPavan Nikhilesh /* Enqueue each packet in reverse order, flushing after each one */ 272085fb515bSPavan Nikhilesh for (i = w3_port; i >= w1_port; i--) { 272185fb515bSPavan Nikhilesh 272285fb515bSPavan Nikhilesh deq_ev[i].op = RTE_EVENT_OP_FORWARD; 272385fb515bSPavan Nikhilesh deq_ev[i].queue_id = t->qid[1]; 272485fb515bSPavan Nikhilesh err = rte_event_enqueue_burst(evdev, t->port[i], &deq_ev[i], 1); 272585fb515bSPavan Nikhilesh if (err != 1) { 272685fb515bSPavan Nikhilesh printf("%d: Failed to enqueue\n", __LINE__); 272785fb515bSPavan Nikhilesh return -1; 272885fb515bSPavan Nikhilesh } 272985fb515bSPavan Nikhilesh } 273085fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 273185fb515bSPavan Nikhilesh 273285fb515bSPavan Nikhilesh /* dequeue from the tx ports, we should get 3 packets */ 273385fb515bSPavan Nikhilesh deq_pkts = rte_event_dequeue_burst(evdev, t->port[tx_port], deq_ev, 273485fb515bSPavan Nikhilesh 3, 0); 273585fb515bSPavan Nikhilesh 273685fb515bSPavan Nikhilesh /* Check to see if we've got all 3 packets */ 273785fb515bSPavan Nikhilesh if (deq_pkts != 3) { 273885fb515bSPavan Nikhilesh printf("%d: expected 3 pkts at tx port got %d from port %d\n", 273985fb515bSPavan Nikhilesh __LINE__, deq_pkts, tx_port); 274085fb515bSPavan Nikhilesh rte_event_dev_dump(evdev, stdout); 274185fb515bSPavan Nikhilesh return 1; 274285fb515bSPavan Nikhilesh } 274385fb515bSPavan Nikhilesh 274485fb515bSPavan Nikhilesh /* Check to see if the sequence numbers are in expected order */ 274585fb515bSPavan Nikhilesh if (check_order) { 274685fb515bSPavan Nikhilesh for (j = 0 ; j < deq_pkts ; j++) { 274785fb515bSPavan Nikhilesh if (deq_ev[j].mbuf->seqn != MAGIC_SEQN + j) { 274885fb515bSPavan Nikhilesh printf( 274985fb515bSPavan Nikhilesh "%d: Incorrect sequence number(%d) from port %d\n", 275085fb515bSPavan Nikhilesh __LINE__, mbufs_out[j]->seqn, tx_port); 275185fb515bSPavan Nikhilesh return -1; 275285fb515bSPavan Nikhilesh } 275385fb515bSPavan Nikhilesh } 275485fb515bSPavan Nikhilesh } 275585fb515bSPavan Nikhilesh 275685fb515bSPavan Nikhilesh /* Destroy the instance */ 275785fb515bSPavan Nikhilesh cleanup(t); 275885fb515bSPavan Nikhilesh return 0; 275985fb515bSPavan Nikhilesh } 276085fb515bSPavan Nikhilesh 276185fb515bSPavan Nikhilesh static int 276285fb515bSPavan Nikhilesh ordered_basic(struct test *t) 276385fb515bSPavan Nikhilesh { 276485fb515bSPavan Nikhilesh return parallel_basic(t, 1); 276585fb515bSPavan Nikhilesh } 276685fb515bSPavan Nikhilesh 276785fb515bSPavan Nikhilesh static int 276885fb515bSPavan Nikhilesh unordered_basic(struct test *t) 276985fb515bSPavan Nikhilesh { 277085fb515bSPavan Nikhilesh return parallel_basic(t, 0); 277185fb515bSPavan Nikhilesh } 277285fb515bSPavan Nikhilesh 277385fb515bSPavan Nikhilesh static int 277485fb515bSPavan Nikhilesh holb(struct test *t) /* test to check we avoid basic head-of-line blocking */ 277585fb515bSPavan Nikhilesh { 277685fb515bSPavan Nikhilesh const struct rte_event new_ev = { 277785fb515bSPavan Nikhilesh .op = RTE_EVENT_OP_NEW 277885fb515bSPavan Nikhilesh /* all other fields zero */ 277985fb515bSPavan Nikhilesh }; 278085fb515bSPavan Nikhilesh struct rte_event ev = new_ev; 278185fb515bSPavan Nikhilesh unsigned int rx_port = 0; /* port we get the first flow on */ 278285fb515bSPavan Nikhilesh char rx_port_used_stat[64]; 278385fb515bSPavan Nikhilesh char rx_port_free_stat[64]; 278485fb515bSPavan Nikhilesh char other_port_used_stat[64]; 278585fb515bSPavan Nikhilesh 278685fb515bSPavan Nikhilesh if (init(t, 1, 2) < 0 || 278785fb515bSPavan Nikhilesh create_ports(t, 2) < 0 || 278885fb515bSPavan Nikhilesh create_atomic_qids(t, 1) < 0) { 278985fb515bSPavan Nikhilesh printf("%d: Error initializing device\n", __LINE__); 279085fb515bSPavan Nikhilesh return -1; 279185fb515bSPavan Nikhilesh } 279285fb515bSPavan Nikhilesh int nb_links = rte_event_port_link(evdev, t->port[1], NULL, NULL, 0); 279385fb515bSPavan Nikhilesh if (rte_event_port_link(evdev, t->port[0], NULL, NULL, 0) != 1 || 279485fb515bSPavan Nikhilesh nb_links != 1) { 279585fb515bSPavan Nikhilesh printf("%d: Error links queue to ports\n", __LINE__); 279685fb515bSPavan Nikhilesh goto err; 279785fb515bSPavan Nikhilesh } 279885fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 279985fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 280085fb515bSPavan Nikhilesh goto err; 280185fb515bSPavan Nikhilesh } 280285fb515bSPavan Nikhilesh 280385fb515bSPavan Nikhilesh /* send one packet and see where it goes, port 0 or 1 */ 280485fb515bSPavan Nikhilesh if (rte_event_enqueue_burst(evdev, t->port[0], &ev, 1) != 1) { 280585fb515bSPavan Nikhilesh printf("%d: Error doing first enqueue\n", __LINE__); 280685fb515bSPavan Nikhilesh goto err; 280785fb515bSPavan Nikhilesh } 280885fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 280985fb515bSPavan Nikhilesh 281085fb515bSPavan Nikhilesh if (rte_event_dev_xstats_by_name_get(evdev, "port_0_cq_ring_used", NULL) 281185fb515bSPavan Nikhilesh != 1) 281285fb515bSPavan Nikhilesh rx_port = 1; 281385fb515bSPavan Nikhilesh 281485fb515bSPavan Nikhilesh snprintf(rx_port_used_stat, sizeof(rx_port_used_stat), 281585fb515bSPavan Nikhilesh "port_%u_cq_ring_used", rx_port); 281685fb515bSPavan Nikhilesh snprintf(rx_port_free_stat, sizeof(rx_port_free_stat), 281785fb515bSPavan Nikhilesh "port_%u_cq_ring_free", rx_port); 281885fb515bSPavan Nikhilesh snprintf(other_port_used_stat, sizeof(other_port_used_stat), 281985fb515bSPavan Nikhilesh "port_%u_cq_ring_used", rx_port ^ 1); 282085fb515bSPavan Nikhilesh if (rte_event_dev_xstats_by_name_get(evdev, rx_port_used_stat, NULL) 282185fb515bSPavan Nikhilesh != 1) { 282285fb515bSPavan Nikhilesh printf("%d: Error, first event not scheduled\n", __LINE__); 282385fb515bSPavan Nikhilesh goto err; 282485fb515bSPavan Nikhilesh } 282585fb515bSPavan Nikhilesh 282685fb515bSPavan Nikhilesh /* now fill up the rx port's queue with one flow to cause HOLB */ 282785fb515bSPavan Nikhilesh do { 282885fb515bSPavan Nikhilesh ev = new_ev; 282985fb515bSPavan Nikhilesh if (rte_event_enqueue_burst(evdev, t->port[0], &ev, 1) != 1) { 283085fb515bSPavan Nikhilesh printf("%d: Error with enqueue\n", __LINE__); 283185fb515bSPavan Nikhilesh goto err; 283285fb515bSPavan Nikhilesh } 283385fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 283485fb515bSPavan Nikhilesh } while (rte_event_dev_xstats_by_name_get(evdev, 283585fb515bSPavan Nikhilesh rx_port_free_stat, NULL) != 0); 283685fb515bSPavan Nikhilesh 283785fb515bSPavan Nikhilesh /* one more packet, which needs to stay in IQ - i.e. HOLB */ 283885fb515bSPavan Nikhilesh ev = new_ev; 283985fb515bSPavan Nikhilesh if (rte_event_enqueue_burst(evdev, t->port[0], &ev, 1) != 1) { 284085fb515bSPavan Nikhilesh printf("%d: Error with enqueue\n", __LINE__); 284185fb515bSPavan Nikhilesh goto err; 284285fb515bSPavan Nikhilesh } 284385fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 284485fb515bSPavan Nikhilesh 284585fb515bSPavan Nikhilesh /* check that the other port still has an empty CQ */ 284685fb515bSPavan Nikhilesh if (rte_event_dev_xstats_by_name_get(evdev, other_port_used_stat, NULL) 284785fb515bSPavan Nikhilesh != 0) { 284885fb515bSPavan Nikhilesh printf("%d: Error, second port CQ is not empty\n", __LINE__); 284985fb515bSPavan Nikhilesh goto err; 285085fb515bSPavan Nikhilesh } 285185fb515bSPavan Nikhilesh /* check IQ now has one packet */ 285285fb515bSPavan Nikhilesh if (rte_event_dev_xstats_by_name_get(evdev, "qid_0_iq_0_used", NULL) 285385fb515bSPavan Nikhilesh != 1) { 285485fb515bSPavan Nikhilesh printf("%d: Error, QID does not have exactly 1 packet\n", 285585fb515bSPavan Nikhilesh __LINE__); 285685fb515bSPavan Nikhilesh goto err; 285785fb515bSPavan Nikhilesh } 285885fb515bSPavan Nikhilesh 285985fb515bSPavan Nikhilesh /* send another flow, which should pass the other IQ entry */ 286085fb515bSPavan Nikhilesh ev = new_ev; 286185fb515bSPavan Nikhilesh ev.flow_id = 1; 286285fb515bSPavan Nikhilesh if (rte_event_enqueue_burst(evdev, t->port[0], &ev, 1) != 1) { 286385fb515bSPavan Nikhilesh printf("%d: Error with enqueue\n", __LINE__); 286485fb515bSPavan Nikhilesh goto err; 286585fb515bSPavan Nikhilesh } 286685fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 286785fb515bSPavan Nikhilesh 286885fb515bSPavan Nikhilesh if (rte_event_dev_xstats_by_name_get(evdev, other_port_used_stat, NULL) 286985fb515bSPavan Nikhilesh != 1) { 287085fb515bSPavan Nikhilesh printf("%d: Error, second flow did not pass out first\n", 287185fb515bSPavan Nikhilesh __LINE__); 287285fb515bSPavan Nikhilesh goto err; 287385fb515bSPavan Nikhilesh } 287485fb515bSPavan Nikhilesh 287585fb515bSPavan Nikhilesh if (rte_event_dev_xstats_by_name_get(evdev, "qid_0_iq_0_used", NULL) 287685fb515bSPavan Nikhilesh != 1) { 287785fb515bSPavan Nikhilesh printf("%d: Error, QID does not have exactly 1 packet\n", 287885fb515bSPavan Nikhilesh __LINE__); 287985fb515bSPavan Nikhilesh goto err; 288085fb515bSPavan Nikhilesh } 288185fb515bSPavan Nikhilesh cleanup(t); 288285fb515bSPavan Nikhilesh return 0; 288385fb515bSPavan Nikhilesh err: 288485fb515bSPavan Nikhilesh rte_event_dev_dump(evdev, stdout); 288585fb515bSPavan Nikhilesh cleanup(t); 288685fb515bSPavan Nikhilesh return -1; 288785fb515bSPavan Nikhilesh } 288885fb515bSPavan Nikhilesh 28898490488aSGage Eads static void 28908490488aSGage Eads flush(uint8_t dev_id __rte_unused, struct rte_event event, void *arg) 28918490488aSGage Eads { 28928490488aSGage Eads *((uint8_t *) arg) += (event.u64 == 0xCA11BACC) ? 1 : 0; 28938490488aSGage Eads } 28948490488aSGage Eads 28958490488aSGage Eads static int 28968490488aSGage Eads dev_stop_flush(struct test *t) /* test to check we can properly flush events */ 28978490488aSGage Eads { 28988490488aSGage Eads const struct rte_event new_ev = { 28998490488aSGage Eads .op = RTE_EVENT_OP_NEW, 29008490488aSGage Eads .u64 = 0xCA11BACC, 29018490488aSGage Eads .queue_id = 0 29028490488aSGage Eads }; 29038490488aSGage Eads struct rte_event ev = new_ev; 29048490488aSGage Eads uint8_t count = 0; 29058490488aSGage Eads int i; 29068490488aSGage Eads 29078490488aSGage Eads if (init(t, 1, 1) < 0 || 29088490488aSGage Eads create_ports(t, 1) < 0 || 29098490488aSGage Eads create_atomic_qids(t, 1) < 0) { 29108490488aSGage Eads printf("%d: Error initializing device\n", __LINE__); 29118490488aSGage Eads return -1; 29128490488aSGage Eads } 29138490488aSGage Eads 29148490488aSGage Eads /* Link the queue so *_start() doesn't error out */ 29158490488aSGage Eads if (rte_event_port_link(evdev, t->port[0], NULL, NULL, 0) != 1) { 29168490488aSGage Eads printf("%d: Error linking queue to port\n", __LINE__); 29178490488aSGage Eads goto err; 29188490488aSGage Eads } 29198490488aSGage Eads 29208490488aSGage Eads if (rte_event_dev_start(evdev) < 0) { 29218490488aSGage Eads printf("%d: Error with start call\n", __LINE__); 29228490488aSGage Eads goto err; 29238490488aSGage Eads } 29248490488aSGage Eads 29258490488aSGage Eads for (i = 0; i < DEQUEUE_DEPTH + 1; i++) { 29268490488aSGage Eads if (rte_event_enqueue_burst(evdev, t->port[0], &ev, 1) != 1) { 29278490488aSGage Eads printf("%d: Error enqueuing events\n", __LINE__); 29288490488aSGage Eads goto err; 29298490488aSGage Eads } 29308490488aSGage Eads } 29318490488aSGage Eads 29328490488aSGage Eads /* Schedule the events from the port to the IQ. At least one event 29338490488aSGage Eads * should be remaining in the queue. 29348490488aSGage Eads */ 29358490488aSGage Eads rte_service_run_iter_on_app_lcore(t->service_id, 1); 29368490488aSGage Eads 29378490488aSGage Eads if (rte_event_dev_stop_flush_callback_register(evdev, flush, &count)) { 29388490488aSGage Eads printf("%d: Error installing the flush callback\n", __LINE__); 29398490488aSGage Eads goto err; 29408490488aSGage Eads } 29418490488aSGage Eads 29428490488aSGage Eads cleanup(t); 29438490488aSGage Eads 29448490488aSGage Eads if (count == 0) { 29458490488aSGage Eads printf("%d: Error executing the flush callback\n", __LINE__); 29468490488aSGage Eads goto err; 29478490488aSGage Eads } 29488490488aSGage Eads 29498490488aSGage Eads if (rte_event_dev_stop_flush_callback_register(evdev, NULL, NULL)) { 29508490488aSGage Eads printf("%d: Error uninstalling the flush callback\n", __LINE__); 29518490488aSGage Eads goto err; 29528490488aSGage Eads } 29538490488aSGage Eads 29548490488aSGage Eads return 0; 29558490488aSGage Eads err: 29568490488aSGage Eads rte_event_dev_dump(evdev, stdout); 29578490488aSGage Eads cleanup(t); 29588490488aSGage Eads return -1; 29598490488aSGage Eads } 29608490488aSGage Eads 296185fb515bSPavan Nikhilesh static int 296285fb515bSPavan Nikhilesh worker_loopback_worker_fn(void *arg) 296385fb515bSPavan Nikhilesh { 296485fb515bSPavan Nikhilesh struct test *t = arg; 296585fb515bSPavan Nikhilesh uint8_t port = t->port[1]; 296685fb515bSPavan Nikhilesh int count = 0; 296785fb515bSPavan Nikhilesh int enqd; 296885fb515bSPavan Nikhilesh 296985fb515bSPavan Nikhilesh /* 297085fb515bSPavan Nikhilesh * Takes packets from the input port and then loops them back through 297185fb515bSPavan Nikhilesh * the Eventdev. Each packet gets looped through QIDs 0-8, 16 times 297285fb515bSPavan Nikhilesh * so each packet goes through 8*16 = 128 times. 297385fb515bSPavan Nikhilesh */ 297485fb515bSPavan Nikhilesh printf("%d: \tWorker function started\n", __LINE__); 297585fb515bSPavan Nikhilesh while (count < NUM_PACKETS) { 297685fb515bSPavan Nikhilesh #define BURST_SIZE 32 297785fb515bSPavan Nikhilesh struct rte_event ev[BURST_SIZE]; 297885fb515bSPavan Nikhilesh uint16_t i, nb_rx = rte_event_dequeue_burst(evdev, port, ev, 297985fb515bSPavan Nikhilesh BURST_SIZE, 0); 298085fb515bSPavan Nikhilesh if (nb_rx == 0) { 298185fb515bSPavan Nikhilesh rte_pause(); 298285fb515bSPavan Nikhilesh continue; 298385fb515bSPavan Nikhilesh } 298485fb515bSPavan Nikhilesh 298585fb515bSPavan Nikhilesh for (i = 0; i < nb_rx; i++) { 298685fb515bSPavan Nikhilesh ev[i].queue_id++; 298785fb515bSPavan Nikhilesh if (ev[i].queue_id != 8) { 298885fb515bSPavan Nikhilesh ev[i].op = RTE_EVENT_OP_FORWARD; 298985fb515bSPavan Nikhilesh enqd = rte_event_enqueue_burst(evdev, port, 299085fb515bSPavan Nikhilesh &ev[i], 1); 299185fb515bSPavan Nikhilesh if (enqd != 1) { 299285fb515bSPavan Nikhilesh printf("%d: Can't enqueue FWD!!\n", 299385fb515bSPavan Nikhilesh __LINE__); 299485fb515bSPavan Nikhilesh return -1; 299585fb515bSPavan Nikhilesh } 299685fb515bSPavan Nikhilesh continue; 299785fb515bSPavan Nikhilesh } 299885fb515bSPavan Nikhilesh 299985fb515bSPavan Nikhilesh ev[i].queue_id = 0; 3000*70418e32SThomas Monjalon (*counter_field(ev[i].mbuf))++; 3001*70418e32SThomas Monjalon if (*counter_field(ev[i].mbuf) != 16) { 300285fb515bSPavan Nikhilesh ev[i].op = RTE_EVENT_OP_FORWARD; 300385fb515bSPavan Nikhilesh enqd = rte_event_enqueue_burst(evdev, port, 300485fb515bSPavan Nikhilesh &ev[i], 1); 300585fb515bSPavan Nikhilesh if (enqd != 1) { 300685fb515bSPavan Nikhilesh printf("%d: Can't enqueue FWD!!\n", 300785fb515bSPavan Nikhilesh __LINE__); 300885fb515bSPavan Nikhilesh return -1; 300985fb515bSPavan Nikhilesh } 301085fb515bSPavan Nikhilesh continue; 301185fb515bSPavan Nikhilesh } 301285fb515bSPavan Nikhilesh /* we have hit 16 iterations through system - drop */ 301385fb515bSPavan Nikhilesh rte_pktmbuf_free(ev[i].mbuf); 301485fb515bSPavan Nikhilesh count++; 301585fb515bSPavan Nikhilesh ev[i].op = RTE_EVENT_OP_RELEASE; 301685fb515bSPavan Nikhilesh enqd = rte_event_enqueue_burst(evdev, port, &ev[i], 1); 301785fb515bSPavan Nikhilesh if (enqd != 1) { 301885fb515bSPavan Nikhilesh printf("%d drop enqueue failed\n", __LINE__); 301985fb515bSPavan Nikhilesh return -1; 302085fb515bSPavan Nikhilesh } 302185fb515bSPavan Nikhilesh } 302285fb515bSPavan Nikhilesh } 302385fb515bSPavan Nikhilesh 302485fb515bSPavan Nikhilesh return 0; 302585fb515bSPavan Nikhilesh } 302685fb515bSPavan Nikhilesh 302785fb515bSPavan Nikhilesh static int 302885fb515bSPavan Nikhilesh worker_loopback_producer_fn(void *arg) 302985fb515bSPavan Nikhilesh { 303085fb515bSPavan Nikhilesh struct test *t = arg; 303185fb515bSPavan Nikhilesh uint8_t port = t->port[0]; 303285fb515bSPavan Nikhilesh uint64_t count = 0; 303385fb515bSPavan Nikhilesh 303485fb515bSPavan Nikhilesh printf("%d: \tProducer function started\n", __LINE__); 303585fb515bSPavan Nikhilesh while (count < NUM_PACKETS) { 303685fb515bSPavan Nikhilesh struct rte_mbuf *m = 0; 303785fb515bSPavan Nikhilesh do { 303885fb515bSPavan Nikhilesh m = rte_pktmbuf_alloc(t->mbuf_pool); 303985fb515bSPavan Nikhilesh } while (m == NULL); 304085fb515bSPavan Nikhilesh 3041*70418e32SThomas Monjalon *counter_field(m) = 0; 304285fb515bSPavan Nikhilesh 304385fb515bSPavan Nikhilesh struct rte_event ev = { 304485fb515bSPavan Nikhilesh .op = RTE_EVENT_OP_NEW, 304585fb515bSPavan Nikhilesh .queue_id = t->qid[0], 304685fb515bSPavan Nikhilesh .flow_id = (uintptr_t)m & 0xFFFF, 304785fb515bSPavan Nikhilesh .mbuf = m, 304885fb515bSPavan Nikhilesh }; 304985fb515bSPavan Nikhilesh 305085fb515bSPavan Nikhilesh if (rte_event_enqueue_burst(evdev, port, &ev, 1) != 1) { 305185fb515bSPavan Nikhilesh while (rte_event_enqueue_burst(evdev, port, &ev, 1) != 305285fb515bSPavan Nikhilesh 1) 305385fb515bSPavan Nikhilesh rte_pause(); 305485fb515bSPavan Nikhilesh } 305585fb515bSPavan Nikhilesh 305685fb515bSPavan Nikhilesh count++; 305785fb515bSPavan Nikhilesh } 305885fb515bSPavan Nikhilesh 305985fb515bSPavan Nikhilesh return 0; 306085fb515bSPavan Nikhilesh } 306185fb515bSPavan Nikhilesh 306285fb515bSPavan Nikhilesh static int 306385fb515bSPavan Nikhilesh worker_loopback(struct test *t, uint8_t disable_implicit_release) 306485fb515bSPavan Nikhilesh { 306585fb515bSPavan Nikhilesh /* use a single producer core, and a worker core to see what happens 306685fb515bSPavan Nikhilesh * if the worker loops packets back multiple times 306785fb515bSPavan Nikhilesh */ 306885fb515bSPavan Nikhilesh struct test_event_dev_stats stats; 306985fb515bSPavan Nikhilesh uint64_t print_cycles = 0, cycles = 0; 307085fb515bSPavan Nikhilesh uint64_t tx_pkts = 0; 307185fb515bSPavan Nikhilesh int err; 307285fb515bSPavan Nikhilesh int w_lcore, p_lcore; 307385fb515bSPavan Nikhilesh 3074*70418e32SThomas Monjalon static const struct rte_mbuf_dynfield counter_dynfield_desc = { 3075*70418e32SThomas Monjalon .name = "rte_event_sw_dynfield_selftest_counter", 3076*70418e32SThomas Monjalon .size = sizeof(counter_dynfield_t), 3077*70418e32SThomas Monjalon .align = __alignof__(counter_dynfield_t), 3078*70418e32SThomas Monjalon }; 3079*70418e32SThomas Monjalon counter_dynfield_offset = 3080*70418e32SThomas Monjalon rte_mbuf_dynfield_register(&counter_dynfield_desc); 3081*70418e32SThomas Monjalon if (counter_dynfield_offset < 0) { 3082*70418e32SThomas Monjalon printf("Error registering mbuf field\n"); 3083*70418e32SThomas Monjalon return -rte_errno; 3084*70418e32SThomas Monjalon } 3085*70418e32SThomas Monjalon 308685fb515bSPavan Nikhilesh if (init(t, 8, 2) < 0 || 308785fb515bSPavan Nikhilesh create_atomic_qids(t, 8) < 0) { 308885fb515bSPavan Nikhilesh printf("%d: Error initializing device\n", __LINE__); 308985fb515bSPavan Nikhilesh return -1; 309085fb515bSPavan Nikhilesh } 309185fb515bSPavan Nikhilesh 309285fb515bSPavan Nikhilesh /* RX with low max events */ 309385fb515bSPavan Nikhilesh static struct rte_event_port_conf conf = { 309485fb515bSPavan Nikhilesh .dequeue_depth = 32, 309585fb515bSPavan Nikhilesh .enqueue_depth = 64, 309685fb515bSPavan Nikhilesh }; 309785fb515bSPavan Nikhilesh /* beware: this cannot be initialized in the static above as it would 309885fb515bSPavan Nikhilesh * only be initialized once - and this needs to be set for multiple runs 309985fb515bSPavan Nikhilesh */ 310085fb515bSPavan Nikhilesh conf.new_event_threshold = 512; 310175d11313STimothy McDaniel conf.event_port_cfg = disable_implicit_release ? 310275d11313STimothy McDaniel RTE_EVENT_PORT_CFG_DISABLE_IMPL_REL : 0; 310385fb515bSPavan Nikhilesh 310485fb515bSPavan Nikhilesh if (rte_event_port_setup(evdev, 0, &conf) < 0) { 310585fb515bSPavan Nikhilesh printf("Error setting up RX port\n"); 310685fb515bSPavan Nikhilesh return -1; 310785fb515bSPavan Nikhilesh } 310885fb515bSPavan Nikhilesh t->port[0] = 0; 310985fb515bSPavan Nikhilesh /* TX with higher max events */ 311085fb515bSPavan Nikhilesh conf.new_event_threshold = 4096; 311185fb515bSPavan Nikhilesh if (rte_event_port_setup(evdev, 1, &conf) < 0) { 311285fb515bSPavan Nikhilesh printf("Error setting up TX port\n"); 311385fb515bSPavan Nikhilesh return -1; 311485fb515bSPavan Nikhilesh } 311585fb515bSPavan Nikhilesh t->port[1] = 1; 311685fb515bSPavan Nikhilesh 311785fb515bSPavan Nikhilesh /* CQ mapping to QID */ 311885fb515bSPavan Nikhilesh err = rte_event_port_link(evdev, t->port[1], NULL, NULL, 0); 311985fb515bSPavan Nikhilesh if (err != 8) { /* should have mapped all queues*/ 312085fb515bSPavan Nikhilesh printf("%d: error mapping port 2 to all qids\n", __LINE__); 312185fb515bSPavan Nikhilesh return -1; 312285fb515bSPavan Nikhilesh } 312385fb515bSPavan Nikhilesh 312485fb515bSPavan Nikhilesh if (rte_event_dev_start(evdev) < 0) { 312585fb515bSPavan Nikhilesh printf("%d: Error with start call\n", __LINE__); 312685fb515bSPavan Nikhilesh return -1; 312785fb515bSPavan Nikhilesh } 312885fb515bSPavan Nikhilesh 312985fb515bSPavan Nikhilesh p_lcore = rte_get_next_lcore( 313085fb515bSPavan Nikhilesh /* start core */ -1, 3131cb056611SStephen Hemminger /* skip main */ 1, 313285fb515bSPavan Nikhilesh /* wrap */ 0); 313385fb515bSPavan Nikhilesh w_lcore = rte_get_next_lcore(p_lcore, 1, 0); 313485fb515bSPavan Nikhilesh 313585fb515bSPavan Nikhilesh rte_eal_remote_launch(worker_loopback_producer_fn, t, p_lcore); 313685fb515bSPavan Nikhilesh rte_eal_remote_launch(worker_loopback_worker_fn, t, w_lcore); 313785fb515bSPavan Nikhilesh 313885fb515bSPavan Nikhilesh print_cycles = cycles = rte_get_timer_cycles(); 313985fb515bSPavan Nikhilesh while (rte_eal_get_lcore_state(p_lcore) != FINISHED || 314085fb515bSPavan Nikhilesh rte_eal_get_lcore_state(w_lcore) != FINISHED) { 314185fb515bSPavan Nikhilesh 314285fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 314385fb515bSPavan Nikhilesh 314485fb515bSPavan Nikhilesh uint64_t new_cycles = rte_get_timer_cycles(); 314585fb515bSPavan Nikhilesh 314685fb515bSPavan Nikhilesh if (new_cycles - print_cycles > rte_get_timer_hz()) { 314785fb515bSPavan Nikhilesh test_event_dev_stats_get(evdev, &stats); 314885fb515bSPavan Nikhilesh printf( 314985fb515bSPavan Nikhilesh "%d: \tSched Rx = %"PRIu64", Tx = %"PRIu64"\n", 315085fb515bSPavan Nikhilesh __LINE__, stats.rx_pkts, stats.tx_pkts); 315185fb515bSPavan Nikhilesh 315285fb515bSPavan Nikhilesh print_cycles = new_cycles; 315385fb515bSPavan Nikhilesh } 315485fb515bSPavan Nikhilesh if (new_cycles - cycles > rte_get_timer_hz() * 3) { 315585fb515bSPavan Nikhilesh test_event_dev_stats_get(evdev, &stats); 315685fb515bSPavan Nikhilesh if (stats.tx_pkts == tx_pkts) { 315785fb515bSPavan Nikhilesh rte_event_dev_dump(evdev, stdout); 315885fb515bSPavan Nikhilesh printf("Dumping xstats:\n"); 315985fb515bSPavan Nikhilesh xstats_print(); 316085fb515bSPavan Nikhilesh printf( 316185fb515bSPavan Nikhilesh "%d: No schedules for seconds, deadlock\n", 316285fb515bSPavan Nikhilesh __LINE__); 316385fb515bSPavan Nikhilesh return -1; 316485fb515bSPavan Nikhilesh } 316585fb515bSPavan Nikhilesh tx_pkts = stats.tx_pkts; 316685fb515bSPavan Nikhilesh cycles = new_cycles; 316785fb515bSPavan Nikhilesh } 316885fb515bSPavan Nikhilesh } 316985fb515bSPavan Nikhilesh rte_service_run_iter_on_app_lcore(t->service_id, 1); 317085fb515bSPavan Nikhilesh /* ensure all completions are flushed */ 317185fb515bSPavan Nikhilesh 317285fb515bSPavan Nikhilesh rte_eal_mp_wait_lcore(); 317385fb515bSPavan Nikhilesh 317485fb515bSPavan Nikhilesh cleanup(t); 317585fb515bSPavan Nikhilesh return 0; 317685fb515bSPavan Nikhilesh } 317785fb515bSPavan Nikhilesh 317885fb515bSPavan Nikhilesh static struct rte_mempool *eventdev_func_mempool; 317985fb515bSPavan Nikhilesh 31805e6eb5ccSPavan Nikhilesh int 318185fb515bSPavan Nikhilesh test_sw_eventdev(void) 318285fb515bSPavan Nikhilesh { 3183e865cb4dSPavan Nikhilesh struct test *t; 318485fb515bSPavan Nikhilesh int ret; 318585fb515bSPavan Nikhilesh 3186e865cb4dSPavan Nikhilesh t = malloc(sizeof(struct test)); 3187e865cb4dSPavan Nikhilesh if (t == NULL) 3188e865cb4dSPavan Nikhilesh return -1; 318985fb515bSPavan Nikhilesh /* manually initialize the op, older gcc's complain on static 319085fb515bSPavan Nikhilesh * initialization of struct elements that are a bitfield. 319185fb515bSPavan Nikhilesh */ 319285fb515bSPavan Nikhilesh release_ev.op = RTE_EVENT_OP_RELEASE; 319385fb515bSPavan Nikhilesh 31945e6eb5ccSPavan Nikhilesh const char *eventdev_name = "event_sw"; 319585fb515bSPavan Nikhilesh evdev = rte_event_dev_get_dev_id(eventdev_name); 319685fb515bSPavan Nikhilesh if (evdev < 0) { 319785fb515bSPavan Nikhilesh printf("%d: Eventdev %s not found - creating.\n", 319885fb515bSPavan Nikhilesh __LINE__, eventdev_name); 319985fb515bSPavan Nikhilesh if (rte_vdev_init(eventdev_name, NULL) < 0) { 320085fb515bSPavan Nikhilesh printf("Error creating eventdev\n"); 32015e6eb5ccSPavan Nikhilesh goto test_fail; 320285fb515bSPavan Nikhilesh } 320385fb515bSPavan Nikhilesh evdev = rte_event_dev_get_dev_id(eventdev_name); 320485fb515bSPavan Nikhilesh if (evdev < 0) { 320585fb515bSPavan Nikhilesh printf("Error finding newly created eventdev\n"); 32065e6eb5ccSPavan Nikhilesh goto test_fail; 320785fb515bSPavan Nikhilesh } 320885fb515bSPavan Nikhilesh } 320985fb515bSPavan Nikhilesh 321085fb515bSPavan Nikhilesh if (rte_event_dev_service_id_get(evdev, &t->service_id) < 0) { 321185fb515bSPavan Nikhilesh printf("Failed to get service ID for software event dev\n"); 32125e6eb5ccSPavan Nikhilesh goto test_fail; 321385fb515bSPavan Nikhilesh } 321485fb515bSPavan Nikhilesh 321585fb515bSPavan Nikhilesh rte_service_runstate_set(t->service_id, 1); 321685fb515bSPavan Nikhilesh rte_service_set_runstate_mapped_check(t->service_id, 0); 321785fb515bSPavan Nikhilesh 321885fb515bSPavan Nikhilesh /* Only create mbuf pool once, reuse for each test run */ 321985fb515bSPavan Nikhilesh if (!eventdev_func_mempool) { 322085fb515bSPavan Nikhilesh eventdev_func_mempool = rte_pktmbuf_pool_create( 322185fb515bSPavan Nikhilesh "EVENTDEV_SW_SA_MBUF_POOL", 322285fb515bSPavan Nikhilesh (1<<12), /* 4k buffers */ 322385fb515bSPavan Nikhilesh 32 /*MBUF_CACHE_SIZE*/, 322485fb515bSPavan Nikhilesh 0, 322585fb515bSPavan Nikhilesh 512, /* use very small mbufs */ 322685fb515bSPavan Nikhilesh rte_socket_id()); 322785fb515bSPavan Nikhilesh if (!eventdev_func_mempool) { 322885fb515bSPavan Nikhilesh printf("ERROR creating mempool\n"); 32295e6eb5ccSPavan Nikhilesh goto test_fail; 323085fb515bSPavan Nikhilesh } 323185fb515bSPavan Nikhilesh } 323285fb515bSPavan Nikhilesh t->mbuf_pool = eventdev_func_mempool; 323385fb515bSPavan Nikhilesh printf("*** Running Single Directed Packet test...\n"); 323485fb515bSPavan Nikhilesh ret = test_single_directed_packet(t); 323585fb515bSPavan Nikhilesh if (ret != 0) { 323685fb515bSPavan Nikhilesh printf("ERROR - Single Directed Packet test FAILED.\n"); 32375e6eb5ccSPavan Nikhilesh goto test_fail; 323885fb515bSPavan Nikhilesh } 323985fb515bSPavan Nikhilesh printf("*** Running Directed Forward Credit test...\n"); 324085fb515bSPavan Nikhilesh ret = test_directed_forward_credits(t); 324185fb515bSPavan Nikhilesh if (ret != 0) { 324285fb515bSPavan Nikhilesh printf("ERROR - Directed Forward Credit test FAILED.\n"); 32435e6eb5ccSPavan Nikhilesh goto test_fail; 324485fb515bSPavan Nikhilesh } 324585fb515bSPavan Nikhilesh printf("*** Running Single Load Balanced Packet test...\n"); 324685fb515bSPavan Nikhilesh ret = single_packet(t); 324785fb515bSPavan Nikhilesh if (ret != 0) { 324885fb515bSPavan Nikhilesh printf("ERROR - Single Packet test FAILED.\n"); 32495e6eb5ccSPavan Nikhilesh goto test_fail; 325085fb515bSPavan Nikhilesh } 325185fb515bSPavan Nikhilesh printf("*** Running Unordered Basic test...\n"); 325285fb515bSPavan Nikhilesh ret = unordered_basic(t); 325385fb515bSPavan Nikhilesh if (ret != 0) { 325485fb515bSPavan Nikhilesh printf("ERROR - Unordered Basic test FAILED.\n"); 32555e6eb5ccSPavan Nikhilesh goto test_fail; 325685fb515bSPavan Nikhilesh } 325785fb515bSPavan Nikhilesh printf("*** Running Ordered Basic test...\n"); 325885fb515bSPavan Nikhilesh ret = ordered_basic(t); 325985fb515bSPavan Nikhilesh if (ret != 0) { 326085fb515bSPavan Nikhilesh printf("ERROR - Ordered Basic test FAILED.\n"); 32615e6eb5ccSPavan Nikhilesh goto test_fail; 326285fb515bSPavan Nikhilesh } 326385fb515bSPavan Nikhilesh printf("*** Running Burst Packets test...\n"); 326485fb515bSPavan Nikhilesh ret = burst_packets(t); 326585fb515bSPavan Nikhilesh if (ret != 0) { 326685fb515bSPavan Nikhilesh printf("ERROR - Burst Packets test FAILED.\n"); 32675e6eb5ccSPavan Nikhilesh goto test_fail; 326885fb515bSPavan Nikhilesh } 326985fb515bSPavan Nikhilesh printf("*** Running Load Balancing test...\n"); 327085fb515bSPavan Nikhilesh ret = load_balancing(t); 327185fb515bSPavan Nikhilesh if (ret != 0) { 327285fb515bSPavan Nikhilesh printf("ERROR - Load Balancing test FAILED.\n"); 32735e6eb5ccSPavan Nikhilesh goto test_fail; 327485fb515bSPavan Nikhilesh } 327585fb515bSPavan Nikhilesh printf("*** Running Prioritized Directed test...\n"); 327685fb515bSPavan Nikhilesh ret = test_priority_directed(t); 327785fb515bSPavan Nikhilesh if (ret != 0) { 327885fb515bSPavan Nikhilesh printf("ERROR - Prioritized Directed test FAILED.\n"); 32795e6eb5ccSPavan Nikhilesh goto test_fail; 328085fb515bSPavan Nikhilesh } 328185fb515bSPavan Nikhilesh printf("*** Running Prioritized Atomic test...\n"); 328285fb515bSPavan Nikhilesh ret = test_priority_atomic(t); 328385fb515bSPavan Nikhilesh if (ret != 0) { 328485fb515bSPavan Nikhilesh printf("ERROR - Prioritized Atomic test FAILED.\n"); 32855e6eb5ccSPavan Nikhilesh goto test_fail; 328685fb515bSPavan Nikhilesh } 328785fb515bSPavan Nikhilesh 328885fb515bSPavan Nikhilesh printf("*** Running Prioritized Ordered test...\n"); 328985fb515bSPavan Nikhilesh ret = test_priority_ordered(t); 329085fb515bSPavan Nikhilesh if (ret != 0) { 329185fb515bSPavan Nikhilesh printf("ERROR - Prioritized Ordered test FAILED.\n"); 32925e6eb5ccSPavan Nikhilesh goto test_fail; 329385fb515bSPavan Nikhilesh } 329485fb515bSPavan Nikhilesh printf("*** Running Prioritized Unordered test...\n"); 329585fb515bSPavan Nikhilesh ret = test_priority_unordered(t); 329685fb515bSPavan Nikhilesh if (ret != 0) { 329785fb515bSPavan Nikhilesh printf("ERROR - Prioritized Unordered test FAILED.\n"); 32985e6eb5ccSPavan Nikhilesh goto test_fail; 329985fb515bSPavan Nikhilesh } 330085fb515bSPavan Nikhilesh printf("*** Running Invalid QID test...\n"); 330185fb515bSPavan Nikhilesh ret = invalid_qid(t); 330285fb515bSPavan Nikhilesh if (ret != 0) { 330385fb515bSPavan Nikhilesh printf("ERROR - Invalid QID test FAILED.\n"); 33045e6eb5ccSPavan Nikhilesh goto test_fail; 330585fb515bSPavan Nikhilesh } 330685fb515bSPavan Nikhilesh printf("*** Running Load Balancing History test...\n"); 330785fb515bSPavan Nikhilesh ret = load_balancing_history(t); 330885fb515bSPavan Nikhilesh if (ret != 0) { 330985fb515bSPavan Nikhilesh printf("ERROR - Load Balancing History test FAILED.\n"); 33105e6eb5ccSPavan Nikhilesh goto test_fail; 331185fb515bSPavan Nikhilesh } 331285fb515bSPavan Nikhilesh printf("*** Running Inflight Count test...\n"); 331385fb515bSPavan Nikhilesh ret = inflight_counts(t); 331485fb515bSPavan Nikhilesh if (ret != 0) { 331585fb515bSPavan Nikhilesh printf("ERROR - Inflight Count test FAILED.\n"); 33165e6eb5ccSPavan Nikhilesh goto test_fail; 331785fb515bSPavan Nikhilesh } 331885fb515bSPavan Nikhilesh printf("*** Running Abuse Inflights test...\n"); 331985fb515bSPavan Nikhilesh ret = abuse_inflights(t); 332085fb515bSPavan Nikhilesh if (ret != 0) { 332185fb515bSPavan Nikhilesh printf("ERROR - Abuse Inflights test FAILED.\n"); 33225e6eb5ccSPavan Nikhilesh goto test_fail; 332385fb515bSPavan Nikhilesh } 332485fb515bSPavan Nikhilesh printf("*** Running XStats test...\n"); 332585fb515bSPavan Nikhilesh ret = xstats_tests(t); 332685fb515bSPavan Nikhilesh if (ret != 0) { 332785fb515bSPavan Nikhilesh printf("ERROR - XStats test FAILED.\n"); 33285e6eb5ccSPavan Nikhilesh goto test_fail; 332985fb515bSPavan Nikhilesh } 333085fb515bSPavan Nikhilesh printf("*** Running XStats ID Reset test...\n"); 333185fb515bSPavan Nikhilesh ret = xstats_id_reset_tests(t); 333285fb515bSPavan Nikhilesh if (ret != 0) { 333385fb515bSPavan Nikhilesh printf("ERROR - XStats ID Reset test FAILED.\n"); 33345e6eb5ccSPavan Nikhilesh goto test_fail; 333585fb515bSPavan Nikhilesh } 333685fb515bSPavan Nikhilesh printf("*** Running XStats Brute Force test...\n"); 333785fb515bSPavan Nikhilesh ret = xstats_brute_force(t); 333885fb515bSPavan Nikhilesh if (ret != 0) { 333985fb515bSPavan Nikhilesh printf("ERROR - XStats Brute Force test FAILED.\n"); 33405e6eb5ccSPavan Nikhilesh goto test_fail; 334185fb515bSPavan Nikhilesh } 334285fb515bSPavan Nikhilesh printf("*** Running XStats ID Abuse test...\n"); 334385fb515bSPavan Nikhilesh ret = xstats_id_abuse_tests(t); 334485fb515bSPavan Nikhilesh if (ret != 0) { 334585fb515bSPavan Nikhilesh printf("ERROR - XStats ID Abuse test FAILED.\n"); 33465e6eb5ccSPavan Nikhilesh goto test_fail; 334785fb515bSPavan Nikhilesh } 334885fb515bSPavan Nikhilesh printf("*** Running QID Priority test...\n"); 334985fb515bSPavan Nikhilesh ret = qid_priorities(t); 335085fb515bSPavan Nikhilesh if (ret != 0) { 335185fb515bSPavan Nikhilesh printf("ERROR - QID Priority test FAILED.\n"); 33525e6eb5ccSPavan Nikhilesh goto test_fail; 335385fb515bSPavan Nikhilesh } 33541638261aSHarry van Haaren printf("*** Running Unlink-in-progress test...\n"); 33551638261aSHarry van Haaren ret = unlink_in_progress(t); 33561638261aSHarry van Haaren if (ret != 0) { 33571638261aSHarry van Haaren printf("ERROR - Unlink in progress test FAILED.\n"); 33581638261aSHarry van Haaren goto test_fail; 33591638261aSHarry van Haaren } 336085fb515bSPavan Nikhilesh printf("*** Running Ordered Reconfigure test...\n"); 336185fb515bSPavan Nikhilesh ret = ordered_reconfigure(t); 336285fb515bSPavan Nikhilesh if (ret != 0) { 336385fb515bSPavan Nikhilesh printf("ERROR - Ordered Reconfigure test FAILED.\n"); 33645e6eb5ccSPavan Nikhilesh goto test_fail; 336585fb515bSPavan Nikhilesh } 336685fb515bSPavan Nikhilesh printf("*** Running Port LB Single Reconfig test...\n"); 336785fb515bSPavan Nikhilesh ret = port_single_lb_reconfig(t); 336885fb515bSPavan Nikhilesh if (ret != 0) { 336985fb515bSPavan Nikhilesh printf("ERROR - Port LB Single Reconfig test FAILED.\n"); 33705e6eb5ccSPavan Nikhilesh goto test_fail; 337185fb515bSPavan Nikhilesh } 337285fb515bSPavan Nikhilesh printf("*** Running Port Reconfig Credits test...\n"); 337385fb515bSPavan Nikhilesh ret = port_reconfig_credits(t); 337485fb515bSPavan Nikhilesh if (ret != 0) { 337585fb515bSPavan Nikhilesh printf("ERROR - Port Reconfig Credits Reset test FAILED.\n"); 33765e6eb5ccSPavan Nikhilesh goto test_fail; 337785fb515bSPavan Nikhilesh } 337885fb515bSPavan Nikhilesh printf("*** Running Head-of-line-blocking test...\n"); 337985fb515bSPavan Nikhilesh ret = holb(t); 338085fb515bSPavan Nikhilesh if (ret != 0) { 338185fb515bSPavan Nikhilesh printf("ERROR - Head-of-line-blocking test FAILED.\n"); 33825e6eb5ccSPavan Nikhilesh goto test_fail; 338385fb515bSPavan Nikhilesh } 33848490488aSGage Eads printf("*** Running Stop Flush test...\n"); 33858490488aSGage Eads ret = dev_stop_flush(t); 33868490488aSGage Eads if (ret != 0) { 33878490488aSGage Eads printf("ERROR - Stop Flush test FAILED.\n"); 33888490488aSGage Eads goto test_fail; 33898490488aSGage Eads } 339085fb515bSPavan Nikhilesh if (rte_lcore_count() >= 3) { 339185fb515bSPavan Nikhilesh printf("*** Running Worker loopback test...\n"); 339285fb515bSPavan Nikhilesh ret = worker_loopback(t, 0); 339385fb515bSPavan Nikhilesh if (ret != 0) { 339485fb515bSPavan Nikhilesh printf("ERROR - Worker loopback test FAILED.\n"); 339585fb515bSPavan Nikhilesh return ret; 339685fb515bSPavan Nikhilesh } 339785fb515bSPavan Nikhilesh 339885fb515bSPavan Nikhilesh printf("*** Running Worker loopback test (implicit release disabled)...\n"); 339985fb515bSPavan Nikhilesh ret = worker_loopback(t, 1); 340085fb515bSPavan Nikhilesh if (ret != 0) { 340185fb515bSPavan Nikhilesh printf("ERROR - Worker loopback test FAILED.\n"); 34025e6eb5ccSPavan Nikhilesh goto test_fail; 340385fb515bSPavan Nikhilesh } 340485fb515bSPavan Nikhilesh } else { 340585fb515bSPavan Nikhilesh printf("### Not enough cores for worker loopback tests.\n"); 340685fb515bSPavan Nikhilesh printf("### Need at least 3 cores for the tests.\n"); 340785fb515bSPavan Nikhilesh } 340885fb515bSPavan Nikhilesh 340985fb515bSPavan Nikhilesh /* 341085fb515bSPavan Nikhilesh * Free test instance, leaving mempool initialized, and a pointer to it 341185fb515bSPavan Nikhilesh * in static eventdev_func_mempool, as it is re-used on re-runs 341285fb515bSPavan Nikhilesh */ 341385fb515bSPavan Nikhilesh free(t); 341485fb515bSPavan Nikhilesh 34155e6eb5ccSPavan Nikhilesh printf("SW Eventdev Selftest Successful.\n"); 341685fb515bSPavan Nikhilesh return 0; 34175e6eb5ccSPavan Nikhilesh test_fail: 3418e865cb4dSPavan Nikhilesh free(t); 34195e6eb5ccSPavan Nikhilesh printf("SW Eventdev Selftest Failed.\n"); 34205e6eb5ccSPavan Nikhilesh return -1; 342185fb515bSPavan Nikhilesh } 3422