On 09/18/2018 10:35 AM, Jens Freimann wrote:
> This adds a new forwarding mode to testpmd to simulate
> more realistic behavior of a guest machine engaged in receiving
> and sending packets performing Virtual Network Function (VNF).
> 
> The goal is to enable a simple way of measuring performance impact on
> cache and memory footprint utilization from various VNF co-located on
> the same host machine. For this it does:
> 
> * Buffer packets in a FIFO:
> 
> Create a fifo to buffer received packets. Once it flows over put
> those packets into the actual tx queue. The fifo is created per tx
> queue and its size can be set with the --noisy-tx-sw-buffer-flushtime
> commandline parameter.
> 
> A second commandline parameter is used to set a timeout in
> milliseconds after which the fifo is flushed.
> 
> --noisy-tx-sw-buffer-size [packet numbers]
> Keep the mbuf in a FIFO and forward the over flooding packets from the
> FIFO. This queue is per TX-queue (after all other packet processing).
> 
> --noisy-tx-sw-buffer-flushtime [delay]
> Flush the packet queue if no packets have been seen during
> [delay]. As long as packets are seen, the timer is reset.
> 
> Add several options to simulate route lookups (memory reads) in tables
> that can be quite large, as well as route hit statistics update.
> These options simulates the while stack traversal and
> will trash the cache. Memory access is random.
> 
> * simulate route lookups:
> 
> Allocate a buffer and perform reads and writes on it as specified by
> commandline options:
> 
> --noisy-lkup-memory [size]
> Size of the VNF internal memory (MB), in which the random
> read/write will be done, allocated by rte_malloc (hugepages).
> 
> --noisy-lkup-num-writes [num]
> Number of random writes in memory per packet should be
> performed, simulating hit-flags update. 64 bits per write,
> all write in different cache lines.
> 
> --noisy-lkup-num-reads [num]
> Number of random reads in memory per packet should be
> performed, simulating FIB/table lookups. 64 bits per read,
> all write in different cache lines.
> 
> --noisy-lkup-num-reads-writes [num]
> Number of random reads and writes in memory per packet should
> be performed, simulating stats update. 64 bits per read-write, all
> reads and writes in different cache lines.
> 
> Signed-off-by: Jens Freimann <jfreim...@redhat.com>
> ---

Hi Jens, thanks for the new version. A small few remaining comments below,

Kevin.

<snip>

> +
> +static void
> +noisy_fwd_begin(portid_t pi)
> +{
> +     struct noisy_config *n;
> +     char name[NOISY_STRSIZE];
> +
> +     noisy_cfg[pi] = rte_zmalloc("testpmd noisy fifo and timers",
> +                             sizeof(struct noisy_config),
> +                             RTE_CACHE_LINE_SIZE);
> +     if (noisy_cfg == NULL) {

Looks like it should be 'if (noisy_cfg[pi] == NULL)'

> +             rte_exit(EXIT_FAILURE,
> +                      "rte_zmalloc(%d) struct noisy_config) \
> +                      failed\n", (int) pi);
> +     }
> +     n = noisy_cfg[pi];
> +     n->do_buffering = noisy_tx_sw_bufsz > 0;
> +     n->do_sim = noisy_lkup_num_writes + noisy_lkup_num_reads +
> +                 noisy_lkup_num_reads_writes;
> +     n->do_flush = noisy_tx_sw_buf_flush_time > 0;
> +
> +     if (n->do_buffering) {
> +             snprintf(name, NOISY_STRSIZE, NOISY_RING, pi);
> +             n->f = rte_ring_create(name, noisy_tx_sw_bufsz,
> +                             rte_socket_id(), 0);
> +             if (!n->f)
> +                     rte_exit(EXIT_FAILURE,
> +                              "rte_ring_create(%d), size %d) \
> +                              failed\n", (int) pi,
> +                              noisy_tx_sw_bufsz);
> +     }
> +     if (noisy_lkup_mem_sz > 0) {
> +             n->vnf_mem = (char *) rte_zmalloc("vnf sim memory",
> +                              noisy_lkup_mem_sz * 1024 * 1024,
> +                              RTE_CACHE_LINE_SIZE);
> +             if (!n->vnf_mem)
> +                     rte_exit(EXIT_FAILURE,
> +                              "rte_zmalloc(%" PRIu64 ") for vnf \
> +                              memory) failed\n", noisy_lkup_mem_sz);
> +     } else if (n->do_sim) {
> +             rte_exit(EXIT_FAILURE, "--noisy-lkup-memory-size \
> +                      must be > 0\n");
> +     }
> +}
> +
> +struct fwd_engine noisy_vnf_engine = {
> +     .fwd_mode_name  = "noisy",
> +     .port_fwd_begin = noisy_fwd_begin,
> +     .port_fwd_end   = noisy_fwd_end,
> +     .packet_fwd     = pkt_burst_noisy_vnf,
> +};
> +

new blank line at EOF.
+
warning: 1 line adds whitespace errors.

> diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
> index 9220e1c1b..3231b0c51 100644
> --- a/app/test-pmd/parameters.c
> +++ b/app/test-pmd/parameters.c
> @@ -625,6 +625,12 @@ launch_args_parse(int argc, char** argv)
>               { "vxlan-gpe-port",             1, 0, 0 },
>               { "mlockall",                   0, 0, 0 },
>               { "no-mlockall",                0, 0, 0 },
> +             { "noisy-tx-sw-buffer-size",    1, 0, 0 },
> +             { "noisy-tx-sw-buffer-flushtime",1, 0, 0 },
> +             { "noisy-lkup-memory",          1, 0, 0 },
> +             { "noisy-lkup-num-writes",      1, 0, 0 },
> +             { "noisy-lkup-num-reads",       1, 0, 0 },
> +             { "noisy-lkup-num-reads-writes",1, 0, 0 },
>               { 0, 0, 0, 0 },
>       };
>  
> @@ -1145,6 +1151,60 @@ launch_args_parse(int argc, char** argv)
>                               do_mlockall = 1;
>                       if (!strcmp(lgopts[opt_idx].name, "no-mlockall"))
>                               do_mlockall = 0;
> +                     if (!strcmp(lgopts[opt_idx].name,
> +                                 "noisy-tx-sw-buffer-size")) {
> +                             n = atoi(optarg);
> +                             if (n >= 0)
> +                                     noisy_tx_sw_bufsz = n;
> +                             else
> +                                     rte_exit(EXIT_FAILURE,
> +                                             "noisy-tx-sw-buffer-size must 
> be >= 0\n");
> +                     }
> +                     if (!strcmp(lgopts[opt_idx].name,
> +                                 "noisy-tx-sw-buffer-flushtime")) {
> +                             n = atoi(optarg);
> +                             if (n >= 0)
> +                                     noisy_tx_sw_buf_flush_time = n;
> +                             else
> +                                     rte_exit(EXIT_FAILURE,
> +                                              "noisy-tx-sw-buffer-flushtime 
> must be >= 0\n");
> +                     }
> +                     if (!strcmp(lgopts[opt_idx].name,
> +                                 "noisy-lkup-memory")) {
> +                             n = atoi(optarg);
> +                             if (n > 0)

I thought this and below ones would also be '>=' also?

> +                                     noisy_lkup_mem_sz = n;
> +                             else
> +                                     rte_exit(EXIT_FAILURE,
> +                                              "noisy-lkup-memory must be > 
> 0\n");
> +                     }
> +                     if (!strcmp(lgopts[opt_idx].name,
> +                                 "noisy-lkup-num-writes")) {
> +                             n = atoi(optarg);
> +                             if (n > 0)
> +                                     noisy_lkup_num_writes = n;
> +                             else
> +                                     rte_exit(EXIT_FAILURE,
> +                                              "noisy-lkup-num-writes must be 
> > 0\n");
> +                     }
> +                     if (!strcmp(lgopts[opt_idx].name,
> +                                 "noisy-lkup-num-reads")) {
> +                             n = atoi(optarg);
> +                             if (n > 0)
> +                                     noisy_lkup_num_reads = n;
> +                             else
> +                                     rte_exit(EXIT_FAILURE,
> +                                              "noisy-lkup-num-reads must be 
> > 0\n");
> +                     }
> +                     if (!strcmp(lgopts[opt_idx].name,
> +                                 "noisy-lkup-num-reads-writes")) {
> +                             n = atoi(optarg);
> +                             if (n > 0)
> +                                     noisy_lkup_num_reads_writes = n;
> +                             else
> +                                     rte_exit(EXIT_FAILURE,
> +                                              "noisy-lkup-num-reads-writes 
> must be > 0\n");
> +                     }
>                       break;
>               case 'h':
>                       usage(argv[0]);

Reply via email to