On 10/30/2015 10:24 AM, Petri Savolainen wrote:
> Added command line option to disable packet error check. Error
> check requires full packet parse. Max packet rate measurements
> should be done with minimal feature set.
>
> This change gives +10% packet rate increase in direct recv mode
> with netmap.
>
> Signed-off-by: Petri Savolainen <petri.savolai...@nokia.com>
> ---
>  test/performance/odp_l2fwd.c | 89 
> +++++++++++++++++++++++++++-----------------
>  1 file changed, 54 insertions(+), 35 deletions(-)
>
> diff --git a/test/performance/odp_l2fwd.c b/test/performance/odp_l2fwd.c
> index 0844f00..69b67a0 100644
> --- a/test/performance/odp_l2fwd.c
> +++ b/test/performance/odp_l2fwd.c
> @@ -69,8 +69,9 @@ typedef struct {
>       int time;               /**< Time in seconds to run. */
>       int accuracy;           /**< Number of seconds to get and print 
> statistics */
>       char *if_str;           /**< Storage for interface names */
> -     int dst_change;         /**< Change destination eth addresses > */
> -     int src_change;         /**< Change source eth addresses > */
> +     int dst_change;         /**< Change destination eth addresses */
> +     int src_change;         /**< Change source eth addresses */
> +     int error_check;        /**< Check packet errors */
>  } appl_args_t;
>  
>  static int exit_threads;     /**< Break workers loop if set to 1 */
> @@ -119,7 +120,7 @@ static odp_barrier_t barrier;
>  /* helper funcs */
>  static inline int lookup_dest_port(odp_packet_t pkt);
>  static inline int find_dest_port(int port);
> -static int drop_err_pkts(odp_packet_t pkt_tbl[], unsigned len);
> +static inline int drop_err_pkts(odp_packet_t pkt_tbl[], unsigned num);
>  static void fill_eth_addrs(odp_packet_t pkt_tbl[], unsigned num,
>                          int dst_port);
>  static void parse_args(int argc, char *argv[], appl_args_t *appl_args);
> @@ -158,10 +159,12 @@ static void *pktio_queue_thread(void *arg)
>                       continue;
>               pkt = odp_packet_from_event(ev);
>  
> -             /* Drop packets with errors */
> -             if (odp_unlikely(drop_err_pkts(&pkt, 1) == 0)) {
> -                     stats->drops += 1;
> -                     continue;
> +             if (gbl_args->appl.error_check) {
> +                     /* Drop packets with errors */
> +                     if (odp_unlikely(drop_err_pkts(&pkt, 1))) {
> +                             stats->drops += 1;
> +                             continue;
> +                     }
>               }
>  
>               dst_port = lookup_dest_port(pkt);
> @@ -232,7 +235,7 @@ static void *pktio_direct_recv_thread(void *arg)
>  {
>       int thr;
>       thread_args_t *thr_args;
> -     int pkts, pkts_ok;
> +     int pkts;
>       odp_packet_t pkt_tbl[MAX_PKT_BURST];
>       int src_idx, dst_idx;
>       odp_pktio_t pktio_src, pktio_dst;
> @@ -258,33 +261,42 @@ static void *pktio_direct_recv_thread(void *arg)
>  
>       /* Loop packets */
>       while (!exit_threads) {
> +             int sent, i;
> +             unsigned tx_drops;
> +             int rx_drops = 0;
> +
>               pkts = odp_pktio_recv(pktio_src, pkt_tbl, MAX_PKT_BURST);
> -             if (pkts <= 0)
> +             if (odp_unlikely(pkts <= 0))
>                       continue;
>  
> -             /* Drop packets with errors */
> -             pkts_ok = drop_err_pkts(pkt_tbl, pkts);
> -             if (pkts_ok > 0) {
> -                     fill_eth_addrs(pkt_tbl, pkts_ok, dst_idx);
> +             if (gbl_args->appl.error_check) {
> +                     /* Drop packets with errors */
> +                     rx_drops = drop_err_pkts(pkt_tbl, pkts);
>  
> -                     int sent = odp_pktio_send(pktio_dst, pkt_tbl, pkts_ok);
> -
> -                     sent = sent > 0 ? sent : 0;
> -                     if (odp_unlikely(sent < pkts_ok)) {
> -                             stats->drops += pkts_ok - sent;
> -                             do
> -                                     odp_packet_free(pkt_tbl[sent]);
> -                             while (++sent < pkts_ok);
> +                     if (odp_unlikely(rx_drops)) {
> +                             if (pkts == rx_drops) {
> +                                     stats->drops += rx_drops;
Stats update should be done out of the if(pkts == rx_dropts).
it works here because pkts = 1.
Patch 3 breaks this. But patch 6 fixes it again by moving it out.
It works for the overall series so I don't know if this needs to be fixed here.

> +                                     continue;
> +                             }
> +                             pkts -= rx_drops;
>                       }
>               }
>  
> -             if (odp_unlikely(pkts_ok != pkts))
> -                     stats->drops += pkts - pkts_ok;
> +             fill_eth_addrs(pkt_tbl, pkts, dst_idx);
>  
> -             if (pkts_ok == 0)
> -                     continue;
> +             sent = odp_pktio_send(pktio_dst, pkt_tbl, pkts);
>  
> -             stats->packets += pkts_ok;
> +             sent     = odp_unlikely(sent < 0) ? 0 : sent;
> +             tx_drops = pkts - sent;
> +
> +             if (odp_unlikely(tx_drops)) {
> +                     /* Drop rejected packets */
> +                     for (i = sent; i < pkts; i++)
> +                             odp_packet_free(pkt_tbl[i]);
> +             }
> +
> +             stats->drops   += rx_drops + tx_drops;
> +             stats->packets += pkts;
>       }
>  
>       free(stats);
> @@ -589,29 +601,29 @@ int main(int argc, char *argv[])
>   * Frees packets with error and modifies pkt_tbl[] to only contain packets 
> with
>   * no detected errors.
>   *
> - * @param pkt_tbl  Array of packet
> - * @param len      Length of pkt_tbl[]
> + * @param pkt_tbl  Array of packets
> + * @param num      Number of packets in pkt_tbl[]
>   *
> - * @return Number of packets with no detected error
> + * @return Number of packets dropped
>   */
> -static int drop_err_pkts(odp_packet_t pkt_tbl[], unsigned len)
> +static int drop_err_pkts(odp_packet_t pkt_tbl[], unsigned num)
>  {
>       odp_packet_t pkt;
> -     unsigned pkt_cnt = len;
> +     unsigned dropped = 0;
>       unsigned i, j;
>  
> -     for (i = 0, j = 0; i < len; ++i) {
> +     for (i = 0, j = 0; i < num; ++i) {
>               pkt = pkt_tbl[i];
>  
>               if (odp_unlikely(odp_packet_has_error(pkt))) {
>                       odp_packet_free(pkt); /* Drop */
> -                     pkt_cnt--;
> +                     dropped++;
>               } else if (odp_unlikely(i != j++)) {
>                       pkt_tbl[j-1] = pkt;
>               }
>       }
>  
> -     return pkt_cnt;
> +     return dropped;
>  }
>  
>  /**
> @@ -666,6 +678,7 @@ static void parse_args(int argc, char *argv[], 
> appl_args_t *appl_args)
>               {"mode", required_argument, NULL, 'm'},
>               {"dst_change", required_argument, NULL, 'd'},
>               {"src_change", required_argument, NULL, 's'},
> +             {"error_check", required_argument, NULL, 'e'},
>               {"help", no_argument, NULL, 'h'},
>               {NULL, 0, NULL, 0}
>       };
> @@ -673,9 +686,10 @@ static void parse_args(int argc, char *argv[], 
> appl_args_t *appl_args)
>       appl_args->time = 0; /* loop forever if time to run is 0 */
>       appl_args->accuracy = 1; /* get and print pps stats second */
>       appl_args->src_change = 1; /* change eth src address by default */
> +     appl_args->error_check = 0; /* don't check packet errors by default */
>  
>       while (1) {
> -             opt = getopt_long(argc, argv, "+c:+t:+a:i:m:d:s:h",
> +             opt = getopt_long(argc, argv, "+c:+t:+a:i:m:d:s:e:h",
>                                 longopts, &long_index);
>  
>               if (opt == -1)
> @@ -748,6 +762,9 @@ static void parse_args(int argc, char *argv[], 
> appl_args_t *appl_args)
>               case 's':
>                       appl_args->src_change = atoi(optarg);
>                       break;
> +             case 'e':
> +                     appl_args->error_check = atoi(optarg);
> +                     break;
>               case 'h':
>                       usage(argv[0]);
>                       exit(EXIT_SUCCESS);
> @@ -835,6 +852,8 @@ static void usage(char *progname)
>              "                    1: Change packets' dst eth addresses\n"
>              "  -s, --src_change  0: Don't change packets' src eth 
> addresses\n"
>              "                    1: Change packets' src eth addresses 
> (default)\n"
> +            "  -e, --error_check 0: Don't check packet errors (default)\n"
> +            "                    1: Check packet errors\n"
>              "  -h, --help           Display help and exit.\n\n"
>              " environment variables: ODP_PKTIO_DISABLE_NETMAP\n"
>              "                        ODP_PKTIO_DISABLE_SOCKET_MMAP\n"

_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to