[ovs-dev] [PATCH v6 4/6] dpif-netdev: Add simple per pmd-thread cycles counters.
Ethan Jackson
ethan at nicira.com
Thu Apr 9 23:20:18 UTC 2015
Acked-by: Ethan Jackson <ethan at nicira.com>
On Tue, Apr 7, 2015 at 12:02 PM, Daniele Di Proietto
<diproiettod at vmware.com> wrote:
> The counters use x86 TSC if available (currently only with DPDK). They
> will be exposed by subsequents commits
>
> Signed-off-by: Daniele Di Proietto <diproiettod at vmware.com>
> ---
> lib/dpif-netdev.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 55 insertions(+)
>
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index 61d9211..5ac98e8 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -227,6 +227,12 @@ enum dp_stat_type {
> DP_N_STATS
> };
>
> +enum pmd_cycles_counter_type {
> + PMD_CYCLES_POLLING, /* Cycles spent polling NICs. */
> + PMD_CYCLES_PROCESSING, /* Cycles spent processing packets */
> + PMD_N_CYCLES
> +};
> +
> /* A port in a netdev-based datapath. */
> struct dp_netdev_port {
> struct cmap_node node; /* Node in dp_netdev's 'ports'. */
> @@ -342,6 +348,12 @@ struct dp_netdev_pmd_stats {
> atomic_ullong n[DP_N_STATS];
> };
>
> +/* Contained by struct dp_netdev_pmd_thread's 'cycle' member. */
> +struct dp_netdev_pmd_cycles {
> + /* Indexed by PMD_CYCLES_*. */
> + atomic_ullong n[PMD_N_CYCLES];
> +};
> +
> /* PMD: Poll modes drivers. PMD accesses devices via polling to eliminate
> * the performance overhead of interrupt processing. Therefore netdev can
> * not implement rx-wait for these devices. dpif-netdev needs to poll
> @@ -384,6 +396,12 @@ struct dp_netdev_pmd_thread {
> /* Statistics. */
> struct dp_netdev_pmd_stats stats;
>
> + /* Cycles counters */
> + struct dp_netdev_pmd_cycles cycles;
> +
> + /* Used to count cicles. See 'cycles_counter_end()' */
> + unsigned long long last_cycles;
> +
> struct latch exit_latch; /* For terminating the pmd thread. */
> atomic_uint change_seq; /* For reloading pmd ports. */
> pthread_t thread;
> @@ -2259,6 +2277,39 @@ dp_netdev_actions_free(struct dp_netdev_actions *actions)
> free(actions);
> }
>
> +static inline unsigned long long
> +cycles_counter(void)
> +{
> +#ifdef DPDK_NETDEV
> + return rte_get_tsc_cycles();
> +#else
> + return 0;
> +#endif
> +}
> +
> +/* Fake mutex to make sure that the calls to cycles_count_* are balanced */
> +extern struct ovs_mutex cycles_counter_fake_mutex;
> +
> +/* Start counting cycles. Must be followed by 'cycles_count_end()' */
> +static inline void
> +cycles_count_start(struct dp_netdev_pmd_thread *pmd)
> + OVS_ACQUIRES(&cycles_counter_fake_mutex)
> + OVS_NO_THREAD_SAFETY_ANALYSIS
> +{
> + pmd->last_cycles = cycles_counter();
> +}
> +
> +/* Stop counting cycles and add them to the counter 'type' */
> +static inline void
> +cycles_count_end(struct dp_netdev_pmd_thread *pmd,
> + enum pmd_cycles_counter_type type)
> + OVS_RELEASES(&cycles_counter_fake_mutex)
> + OVS_NO_THREAD_SAFETY_ANALYSIS
> +{
> + unsigned long long interval = cycles_counter() - pmd->last_cycles;
> +
> + non_atomic_ullong_add(&pmd->cycles.n[type], interval);
> +}
>
> static void
> dp_netdev_process_rxq_port(struct dp_netdev_pmd_thread *pmd,
> @@ -2268,7 +2319,9 @@ dp_netdev_process_rxq_port(struct dp_netdev_pmd_thread *pmd,
> struct dp_packet *packets[NETDEV_MAX_RX_BATCH];
> int error, cnt;
>
> + cycles_count_start(pmd);
> error = netdev_rxq_recv(rxq, packets, &cnt);
> + cycles_count_end(pmd, PMD_CYCLES_POLLING);
> if (!error) {
> int i;
>
> @@ -2278,7 +2331,9 @@ dp_netdev_process_rxq_port(struct dp_netdev_pmd_thread *pmd,
> for (i = 0; i < cnt; i++) {
> packets[i]->md = PKT_METADATA_INITIALIZER(port->port_no);
> }
> + cycles_count_start(pmd);
> dp_netdev_input(pmd, packets, cnt);
> + cycles_count_end(pmd, PMD_CYCLES_PROCESSING);
> } else if (error != EAGAIN && error != EOPNOTSUPP) {
> static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
>
> --
> 2.1.4
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
More information about the dev
mailing list