Signed-off-by: Nicolas Morey-Chaisemartin <nmo...@kalray.eu> --- v3: * Fix help for rxbatch option
test/performance/odp_pktio_perf.c | 77 ++++++++++++++++++++++++++++++--------- 1 file changed, 59 insertions(+), 18 deletions(-) diff --git a/test/performance/odp_pktio_perf.c b/test/performance/odp_pktio_perf.c index fbe27a0..17975bf 100644 --- a/test/performance/odp_pktio_perf.c +++ b/test/performance/odp_pktio_perf.c @@ -75,6 +75,8 @@ typedef struct { batch */ int schedule; /* 1: receive packets via scheduler 0: receive packets via direct deq */ + uint32_t rx_batch_len; /* Number of packets to receive in a single + batch */ uint64_t pps; /* Attempted packet rate */ int verbose; /* Print verbose information, such as per thread statistics */ @@ -358,12 +360,46 @@ static void *run_thread_tx(void *arg) return NULL; } -static void *run_thread_rx(void *arg TEST_UNUSED) +static int receive_packets(odp_queue_t pollq, + odp_event_t *event_tbl, unsigned num_pkts) +{ + int n_ev = 0; + + if (num_pkts == 0) + return 0; + + if (pollq != ODP_QUEUE_INVALID) { + if (num_pkts == 1) { + event_tbl[0] = odp_queue_deq(pollq); + n_ev = event_tbl[0] != ODP_EVENT_INVALID; + } else { + n_ev = odp_queue_deq_multi(pollq, event_tbl, num_pkts); + } + } else { + if (num_pkts == 1) { + event_tbl[0] = odp_schedule(NULL, ODP_SCHED_NO_WAIT); + n_ev = event_tbl[0] != ODP_EVENT_INVALID; + } else { + n_ev = odp_schedule_multi(NULL, ODP_SCHED_NO_WAIT, + event_tbl, num_pkts); + } + } + return n_ev; +} + +static void *run_thread_rx(void *arg) { test_globals_t *globals; - int thr_id; + int thr_id, batch_len; odp_queue_t pollq = ODP_QUEUE_INVALID; + thread_args_t *targs = arg; + + batch_len = targs->batch_len; + + if (batch_len > BATCH_LEN_MAX) + batch_len = BATCH_LEN_MAX; + thr_id = odp_thread_id(); globals = odp_shm_addr(odp_shm_lookup("test_globals")); @@ -377,28 +413,24 @@ static void *run_thread_rx(void *arg TEST_UNUSED) } odp_barrier_wait(&globals->rx_barrier); - while (1) { - odp_event_t ev; + odp_event_t ev[BATCH_LEN_MAX]; + int i, n_ev; - if (pollq != ODP_QUEUE_INVALID) - ev = odp_queue_deq(pollq); - else - ev = odp_schedule(NULL, ODP_SCHED_NO_WAIT); + n_ev = receive_packets(pollq, ev, batch_len); - if (ev != ODP_EVENT_INVALID) { - if (odp_event_type(ev) == ODP_EVENT_PACKET) { - odp_packet_t pkt = odp_packet_from_event(ev); + for (i = 0; i < n_ev; ++i) { + if (odp_event_type(ev[i]) == ODP_EVENT_PACKET) { + odp_packet_t pkt = odp_packet_from_event(ev[i]); if (pktio_pkt_has_magic(pkt)) stats->s.rx_cnt++; else stats->s.rx_ignore++; } - - odp_buffer_free(odp_buffer_from_event(ev)); - } else if (odp_atomic_load_u32(&shutdown)) { - break; + odp_buffer_free(odp_buffer_from_event(ev[i])); } + if (n_ev == 0 && odp_atomic_load_u32(&shutdown)) + break; } return NULL; @@ -556,7 +588,7 @@ static int run_test_single(odp_cpumask_t *thd_mask_tx, test_status_t *status) { odph_linux_pthread_t thd_tbl[MAX_WORKERS]; - thread_args_t args_tx; + thread_args_t args_tx, args_rx; uint64_t expected_tx_cnt; int num_tx_workers, num_rx_workers; @@ -569,8 +601,9 @@ static int run_test_single(odp_cpumask_t *thd_mask_tx, expected_tx_cnt = status->pps_curr * gbl_args->args.duration; /* start receiver threads first */ + args_rx.batch_len = gbl_args->args.rx_batch_len; odph_linux_pthread_create(&thd_tbl[0], thd_mask_rx, - run_thread_rx, NULL); + run_thread_rx, &args_rx); odp_barrier_wait(&gbl_args->rx_barrier); /* then start transmitters */ @@ -618,6 +651,7 @@ static int run_test(void) printf("\tReceive workers: \t%d\n", odp_cpumask_count(&rxmask)); printf("\tDuration (seconds): \t%d\n", gbl_args->args.duration); printf("\tTransmit batch length:\t%d\n", gbl_args->args.tx_batch_len); + printf("\tReceive batch length: \t%d\n", gbl_args->args.rx_batch_len); printf("\tPacket receive method:\t%s\n", gbl_args->args.schedule ? "schedule" : "poll"); printf("\tInterface(s): \t"); @@ -800,6 +834,8 @@ static void usage(void) printf(" default: %d\n", BATCH_LEN_MAX); printf(" -p, --poll Poll input queue for packet RX\n"); printf(" default: disabled (use scheduler)\n"); + printf(" -R, --rxbatch <length> Number of packets per RX batch\n"); + printf(" default: %d\n", BATCH_LEN_MAX); printf(" -l, --length <length> Additional payload length in bytes\n"); printf(" default: 0\n"); printf(" -r, --rate <number> Attempted packet rate in PPS\n"); @@ -820,6 +856,7 @@ static void parse_args(int argc, char *argv[], test_args_t *args) {"txcount", required_argument, NULL, 't'}, {"txbatch", required_argument, NULL, 'b'}, {"poll", no_argument, NULL, 'p'}, + {"rxbatch", required_argument, NULL, 'R'}, {"length", required_argument, NULL, 'l'}, {"rate", required_argument, NULL, 'r'}, {"interface", required_argument, NULL, 'i'}, @@ -832,6 +869,7 @@ static void parse_args(int argc, char *argv[], test_args_t *args) args->cpu_count = 0; /* all CPUs */ args->num_tx_workers = 0; /* defaults to cpu_count+1/2 */ args->tx_batch_len = BATCH_LEN_MAX; + args->rx_batch_len = BATCH_LEN_MAX; args->duration = 1; args->pps = RATE_SEARCH_INITIAL_PPS; args->search = 1; @@ -839,7 +877,7 @@ static void parse_args(int argc, char *argv[], test_args_t *args) args->verbose = 0; while (1) { - opt = getopt_long(argc, argv, "+c:t:b:pl:r:i:d:vh", + opt = getopt_long(argc, argv, "+c:t:b:pR:l:r:i:d:vh", longopts, &long_index); if (opt == -1) @@ -886,6 +924,9 @@ static void parse_args(int argc, char *argv[], test_args_t *args) case 'b': args->tx_batch_len = atoi(optarg); break; + case 'R': + args->rx_batch_len = atoi(optarg); + break; case 'v': args->verbose = 1; break; _______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp