snipped
>               "  --xstats-ids IDLIST: to display xstat values by id. "
>                       "The argument is comma-separated list of xstat ids to
> print out.\n"
> +             "  --apistats: to display api statistics, disabled by default\n"
As per the code base the logic ` rte_apicounts->rx_burst_counts[lcore_id]++; 
and rte_apicounts->tx_burst_counts[lcore_id]++;`. This expect `apistats_init` 
isn primary before `proc-info`. So I have 2 quereies

1. with this logic does all dpdk-examples will be updated to invoke 
`apistats_init`?
2. what is mechanism in place to inform all dpdk user that `just like 
rte_eal_init one has to explicitly invoke apistats_init too`?

since I am not clear with the code flow, please feel free to explain the logic 
or expectation.

snipped
> 
> +static void
> +display_apistats(void)
> +{
> +     static const char *api_stats_border = "########################";
> +     uint16_t i;
> +     struct rte_apistats t0_count, t1_count;
> +     memcpy(&t0_count, rte_apicounts, sizeof(struct rte_apistats));
Any specific reason not to use `rte_memcpy` and invoke system library call 
`memcpy`

> +     sleep(1);
> +     memcpy(&t1_count, rte_apicounts, sizeof(struct rte_apistats));
> +     for (i = 0; i < RTE_MAX_LCORE; i++) {
I am against the idea of iterating RTE_MAX_LCORE, as for any valid DPDK primary 
application the actual core count may vary between `1 to RTE_MAX_LCORE`

> +             if (t1_count.lcoreid_list[i] != 0) {
> +                     uint64_t rx_count_delta = t1_count.rx_burst_counts[i]
> +                             - t0_count.rx_burst_counts[i];
> +                     uint64_t tx_count_delta = t1_count.tx_burst_counts[i]
> +                             - t0_count.tx_burst_counts[i];
> +                     printf("\n  %s api statistics for lcoreid: %d %s\n",
> +                             api_stats_border, i, api_stats_border);
Suggestion: Since most of DPDK application uses dedicated core to RX and TX, 
would not it easier only display the lcores which does the operation. That is 
skip lcores where `count_delta` are 0?

> +                     printf("  rx_burst_count: %13"PRIu64""
> +                             " rx_burst_count_delta: %13"PRIu64"\n",
> +                             t1_count.rx_burst_counts[i],
> +                             rx_count_delta);
> +                     printf("  tx_burst_count: %13"PRIu64""
> +                             " tx_burst_count_delta: %13"PRIu64"\n",
> +                             t1_count.tx_burst_counts[i],
> +                             tx_count_delta);
> +                     printf("  tx/rx_rate: %3.2f\n",
> +                             (rx_count_delta) ? (double)tx_count_delta
> +                             / rx_count_delta : 0.0);

snipped

>       if (enable_iter_mempool)
>               iter_mempool(mempool_iter_name);
> +     if (enable_apistats)
> +             display_apistats();
> 
>       RTE_ETH_FOREACH_DEV(i)
>               rte_eth_dev_close(i);
> --
> 2.18.0

Reply via email to