On Fri, Dec 18, 2015 at 12:07:57PM +0000, Stuart Haslam wrote:
> Modify the tests that currently transmit packets in batches to also
> receive packets in batches. This adds coverage of odp_queue_deq_multi()
> and odp_schedule_multi() specifically against a packet input queue,
> as this doesn't get tested anywhere else in the validation suite.
> 
> Signed-off-by: Stuart Haslam <[email protected]>

Ping - needs review..

> ---
> Changes in v3 - test odp_queue_[enq|deq]_multi() and odp_schedule_multi()
>                 APIs with batch length of 1.
> 
> Changes in v2 - rebased and picked up new time API
> 
>  test/validation/pktio/pktio.c | 185 
> ++++++++++++++++++++++--------------------
>  1 file changed, 97 insertions(+), 88 deletions(-)
> 
> diff --git a/test/validation/pktio/pktio.c b/test/validation/pktio/pktio.c
> index 28bfd30..05ddd68 100644
> --- a/test/validation/pktio/pktio.c
> +++ b/test/validation/pktio/pktio.c
> @@ -58,8 +58,13 @@ typedef struct ODP_PACKED {
>  typedef enum {
>       PKT_POOL_UNSEGMENTED,
>       PKT_POOL_SEGMENTED,
> -} pkt_segmented_e
> -;
> +} pkt_segmented_e;
> +
> +typedef enum {
> +     TXRX_MODE_SINGLE,
> +     TXRX_MODE_MULTI
> +} txrx_mode_e;
> +
>  /** size of transmitted packets */
>  static uint32_t packet_len = PKT_LEN_NORMAL;
>  
> @@ -142,7 +147,7 @@ static uint32_t pktio_pkt_seq(odp_packet_t pkt)
>       pkt_tail_t tail;
>  
>       if (pkt == ODP_PACKET_INVALID)
> -             return -1;
> +             return TEST_SEQ_INVALID;
>  
>       off = odp_packet_l4_offset(pkt);
>       if (off ==  ODP_PACKET_OFFSET_INVALID)
> @@ -351,78 +356,86 @@ static int destroy_inq(odp_pktio_t pktio)
>       return odp_queue_destroy(inq);
>  }
>  
> -static odp_event_t queue_deq_wait_time(odp_queue_t queue, uint64_t ns)
> +static int get_packets(pktio_info_t *pktio_rx, odp_packet_t pkt_tbl[],
> +                    int num, txrx_mode_e mode)
>  {
> -     odp_time_t start, now, diff;
> -     odp_event_t ev;
> +     odp_event_t evt_tbl[num];
> +     int num_evts = 0;
> +     int num_pkts = 0;
> +     int i;
>  
> -     start = odp_time_local();
> +     if (pktio_rx->in_mode == ODP_PKTIN_MODE_RECV)
> +             return odp_pktio_recv(pktio_rx->id, pkt_tbl, num);
>  
> -     do {
> -             ev = odp_queue_deq(queue);
> -             if (ev != ODP_EVENT_INVALID)
> -                     return ev;
> -             now = odp_time_local();
> -             diff = odp_time_diff(now, start);
> -     } while (odp_time_to_ns(diff) < ns);
> +     if (mode == TXRX_MODE_MULTI) {
> +             if (pktio_rx->in_mode == ODP_PKTIN_MODE_POLL)
> +                     num_evts = odp_queue_deq_multi(pktio_rx->inq, evt_tbl,
> +                                                    num);
> +             else
> +                     num_evts = odp_schedule_multi(NULL, ODP_SCHED_NO_WAIT,
> +                                                   evt_tbl, num);
> +     } else {
> +             odp_event_t evt_tmp;
> +
> +             if (pktio_rx->in_mode == ODP_PKTIN_MODE_POLL)
> +                     evt_tmp = odp_queue_deq(pktio_rx->inq);
> +             else
> +                     evt_tmp = odp_schedule(NULL, ODP_SCHED_NO_WAIT);
>  
> -     return ODP_EVENT_INVALID;
> +             if (evt_tmp != ODP_EVENT_INVALID)
> +                     evt_tbl[num_evts++] = evt_tmp;
> +     }
> +
> +     /* convert events to packets, discarding any non-packet events */
> +     for (i = 0; i < num_evts; ++i) {
> +             if (odp_event_type(evt_tbl[i]) == ODP_EVENT_PACKET)
> +                     pkt_tbl[num_pkts++] = odp_packet_from_event(evt_tbl[i]);
> +             else
> +                     odp_event_free(evt_tbl[i]);
> +     }
> +
> +     return num_pkts;
>  }
>  
> -static odp_packet_t wait_for_packet(pktio_info_t *pktio_rx,
> -                                 uint32_t seq, uint64_t ns)
> +static int wait_for_packets(pktio_info_t *pktio_rx, odp_packet_t pkt_tbl[],
> +                         uint32_t seq_tbl[], int num, txrx_mode_e mode,
> +                         uint64_t ns)
>  {
>       odp_time_t start, now, diff;
> -     odp_event_t ev;
> -     odp_packet_t pkt;
> -     uint64_t wait;
> +     int num_rx = 0;
> +     int i;
> +     odp_packet_t pkt_tmp[num];
>  
>       start = odp_time_local();
> -     wait = odp_schedule_wait_time(ns);
>  
>       do {
> -             pkt = ODP_PACKET_INVALID;
> -
> -             if (pktio_rx->in_mode == ODP_PKTIN_MODE_RECV) {
> -                     odp_pktio_recv(pktio_rx->id, &pkt, 1);
> -             } else {
> -                     if (pktio_rx->in_mode == ODP_PKTIN_MODE_POLL)
> -                             ev = queue_deq_wait_time(pktio_rx->inq, ns);
> -                     else
> -                             ev = odp_schedule(NULL, wait);
> +             int n = get_packets(pktio_rx, pkt_tmp, num - num_rx, mode);
>  
> -                     if (ev != ODP_EVENT_INVALID) {
> -                             if (odp_event_type(ev) == ODP_EVENT_PACKET)
> -                                     pkt = odp_packet_from_event(ev);
> -                             else
> -                                     odp_event_free(ev);
> -                     }
> -             }
> -
> -             if (pkt != ODP_PACKET_INVALID) {
> -                     if (pktio_pkt_seq(pkt) == seq)
> -                             return pkt;
> +             if (n < 0)
> +                     break;
>  
> -                     odp_packet_free(pkt);
> +             for (i = 0; i < n; ++i) {
> +                     if (pktio_pkt_seq(pkt_tmp[i]) == seq_tbl[num_rx])
> +                             pkt_tbl[num_rx++] = pkt_tmp[i];
> +                     else
> +                             odp_packet_free(pkt_tmp[i]);
>               }
>  
>               now = odp_time_local();
>               diff = odp_time_diff(now, start);
> -     } while (odp_time_to_ns(diff) < ns);
> +     } while (num_rx < num && odp_time_to_ns(diff) < ns);
>  
> -     CU_FAIL("failed to receive transmitted packet");
> -
> -     return ODP_PACKET_INVALID;
> +     return num_rx;
>  }
>  
>  static void pktio_txrx_multi(pktio_info_t *pktio_a, pktio_info_t *pktio_b,
> -                          int num_pkts)
> +                          int num_pkts, txrx_mode_e mode)
>  {
>       odp_packet_t tx_pkt[num_pkts];
>       odp_event_t tx_ev[num_pkts];
> -     odp_packet_t rx_pkt;
> +     odp_packet_t rx_pkt[num_pkts];
>       uint32_t tx_seq[num_pkts];
> -     int i, ret;
> +     int i, ret, num_rx;
>  
>       /* generate test packets to send */
>       for (i = 0; i < num_pkts; ++i) {
> @@ -451,12 +464,14 @@ static void pktio_txrx_multi(pktio_info_t *pktio_a, 
> pktio_info_t *pktio_b,
>       }
>  
>       /* send packet(s) out */
> -     if (num_pkts == 1) {
> -             ret = odp_queue_enq(pktio_a->outq, tx_ev[0]);
> -             if (ret != 0) {
> -                     CU_FAIL("failed to enqueue test packet");
> -                     odp_packet_free(tx_pkt[0]);
> -                     return;
> +     if (mode == TXRX_MODE_SINGLE) {
> +             for (i = 0; i < num_pkts; ++i) {
> +                     ret = odp_queue_enq(pktio_a->outq, tx_ev[i]);
> +                     if (ret != 0) {
> +                             CU_FAIL("failed to enqueue test packet");
> +                             odp_packet_free(tx_pkt[i]);
> +                             return;
> +                     }
>               }
>       } else {
>               ret = odp_queue_enq_multi(pktio_a->outq, tx_ev, num_pkts);
> @@ -470,21 +485,20 @@ static void pktio_txrx_multi(pktio_info_t *pktio_a, 
> pktio_info_t *pktio_b,
>       }
>  
>       /* and wait for them to arrive back */
> -     for (i = 0; i < num_pkts; ++i) {
> -             rx_pkt = wait_for_packet(pktio_b, tx_seq[i],
> -                                      ODP_TIME_SEC_IN_NS);
> -
> -             if (rx_pkt == ODP_PACKET_INVALID)
> -                     break;
> -             CU_ASSERT(odp_packet_input(rx_pkt) == pktio_b->id);
> -             CU_ASSERT(odp_packet_has_error(rx_pkt) == 0);
> -             odp_packet_free(rx_pkt);
> +     num_rx = wait_for_packets(pktio_b, rx_pkt, tx_seq,
> +                               num_pkts, mode, ODP_TIME_SEC_IN_NS);
> +     CU_ASSERT(num_rx == num_pkts);
> +
> +     for (i = 0; i < num_rx; ++i) {
> +             CU_ASSERT_FATAL(rx_pkt[i] != ODP_PACKET_INVALID);
> +             CU_ASSERT(odp_packet_input(rx_pkt[i]) == pktio_b->id);
> +             CU_ASSERT(odp_packet_has_error(rx_pkt[i]) == 0);
> +             odp_packet_free(rx_pkt[i]);
>       }
> -
> -     CU_ASSERT(i == num_pkts);
>  }
>  
> -static void test_txrx(odp_pktio_input_mode_t in_mode, int num_pkts)
> +static void test_txrx(odp_pktio_input_mode_t in_mode, int num_pkts,
> +                   txrx_mode_e mode)
>  {
>       int ret, i, if_b;
>       pktio_info_t pktios[MAX_NUM_IFACES];
> @@ -518,7 +532,7 @@ static void test_txrx(odp_pktio_input_mode_t in_mode, int 
> num_pkts)
>       /* if we have two interfaces then send through one and receive on
>        * another but if there's only one assume it's a loopback */
>       if_b = (num_ifaces == 1) ? 0 : 1;
> -     pktio_txrx_multi(&pktios[0], &pktios[if_b], num_pkts);
> +     pktio_txrx_multi(&pktios[0], &pktios[if_b], num_pkts, mode);
>  
>       for (i = 0; i < num_ifaces; ++i) {
>               ret = odp_pktio_stop(pktios[i].id);
> @@ -532,32 +546,36 @@ static void test_txrx(odp_pktio_input_mode_t in_mode, 
> int num_pkts)
>  
>  void pktio_test_poll_queue(void)
>  {
> -     test_txrx(ODP_PKTIN_MODE_POLL, 1);
> +     test_txrx(ODP_PKTIN_MODE_POLL, 1, TXRX_MODE_SINGLE);
> +     test_txrx(ODP_PKTIN_MODE_POLL, TX_BATCH_LEN, TXRX_MODE_SINGLE);
>  }
>  
>  void pktio_test_poll_multi(void)
>  {
> -     test_txrx(ODP_PKTIN_MODE_POLL, TX_BATCH_LEN);
> +     test_txrx(ODP_PKTIN_MODE_POLL, TX_BATCH_LEN, TXRX_MODE_MULTI);
> +     test_txrx(ODP_PKTIN_MODE_POLL, 1, TXRX_MODE_MULTI);
>  }
>  
>  void pktio_test_sched_queue(void)
>  {
> -     test_txrx(ODP_PKTIN_MODE_SCHED, 1);
> +     test_txrx(ODP_PKTIN_MODE_SCHED, 1, TXRX_MODE_SINGLE);
> +     test_txrx(ODP_PKTIN_MODE_SCHED, TX_BATCH_LEN, TXRX_MODE_SINGLE);
>  }
>  
>  void pktio_test_sched_multi(void)
>  {
> -     test_txrx(ODP_PKTIN_MODE_SCHED, TX_BATCH_LEN);
> +     test_txrx(ODP_PKTIN_MODE_SCHED, TX_BATCH_LEN, TXRX_MODE_MULTI);
> +     test_txrx(ODP_PKTIN_MODE_SCHED, 1, TXRX_MODE_MULTI);
>  }
>  
>  void pktio_test_recv(void)
>  {
> -     test_txrx(ODP_PKTIN_MODE_RECV, 1);
> +     test_txrx(ODP_PKTIN_MODE_RECV, 1, TXRX_MODE_SINGLE);
>  }
>  
>  void pktio_test_recv_multi(void)
>  {
> -     test_txrx(ODP_PKTIN_MODE_RECV, TX_BATCH_LEN);
> +     test_txrx(ODP_PKTIN_MODE_RECV, TX_BATCH_LEN, TXRX_MODE_MULTI);
>  }
>  
>  void pktio_test_jumbo(void)
> @@ -975,12 +993,8 @@ static void pktio_test_send_failure(void)
>               info_rx.inq  = ODP_QUEUE_INVALID;
>               info_rx.in_mode = ODP_PKTIN_MODE_RECV;
>  
> -             for (i = 0; i < ret; ++i) {
> -                     pkt_tbl[i] = wait_for_packet(&info_rx, pkt_seq[i],
> -                                                  ODP_TIME_SEC_IN_NS);
> -                     if (pkt_tbl[i] == ODP_PACKET_INVALID)
> -                             break;
> -             }
> +             i = wait_for_packets(&info_rx, pkt_tbl, pkt_seq, ret,
> +                                  TXRX_MODE_MULTI, ODP_TIME_SEC_IN_NS);
>  
>               if (i == ret) {
>                       /* now try to send starting with the too-long packet
> @@ -1011,14 +1025,9 @@ static void pktio_test_send_failure(void)
>               ret = odp_pktio_send(pktio_tx, &pkt_tbl[i], TX_BATCH_LEN - i);
>               CU_ASSERT_FATAL(ret == (TX_BATCH_LEN - i));
>  
> -             for (; i < TX_BATCH_LEN; ++i) {
> -                     pkt_tbl[i] = wait_for_packet(&info_rx,
> -                                                  pkt_seq[i],
> -                                                  ODP_TIME_SEC_IN_NS);
> -                     if (pkt_tbl[i] == ODP_PACKET_INVALID)
> -                             break;
> -             }
> -             CU_ASSERT(i == TX_BATCH_LEN);
> +             i = wait_for_packets(&info_rx, &pkt_tbl[i], &pkt_seq[i], ret,
> +                                  TXRX_MODE_MULTI, ODP_TIME_SEC_IN_NS);
> +             CU_ASSERT(i == ret);
>       } else {
>               CU_FAIL("failed to generate test packets\n");
>       }
> -- 
> 2.1.1
> 
_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to