Message ID | 1500627885-503-4-git-send-email-ktraynor@redhat.com |
---|---|
State | Superseded |
Headers | show |
> Add two counters to dp_netdev_rxq which will be used for storing the > processing cycles of an rxq. Processing cycles will be stored in reference > to a defined interval. One counter is used for storing cycles during the > current in progress interval, while the other is used to store the cycles > of the last fully complete interval. > > cycles_count_intermediate was used to count cycles for a pmd. With some > small additions we can also use it to count the cycles used for processing > an rxq. > > Signed-off-by: Kevin Traynor <ktraynor@redhat.com> Think I flagged this before but OVS doesn't compile cleanly after applying this patch. lib/dpif-netdev.c:3117:1: error: 'dp_netdev_rxq_get_cycles' defined but not used [-Werror=unused-function] dp_netdev_rxq_get_cycles(struct dp_netdev_rxq *rx, ^~~~~~~~~~~~~~~~~~~~~~~~ lib/dpif-netdev.c:3109:1: error: 'dp_netdev_rxq_set_cycles' defined but not used [-Werror=unused-function] dp_netdev_rxq_set_cycles(struct dp_netdev_rxq *rx, Consider rolling it into patch 4 of the series to avoid the issue. > --- > lib/dpif-netdev.c | 42 +++++++++++++++++++++++++++++++++++++++--- > 1 file changed, 39 insertions(+), 3 deletions(-) > > diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 0b8a0c8..273db38 > 100644 > --- a/lib/dpif-netdev.c > +++ b/lib/dpif-netdev.c > @@ -336,4 +336,11 @@ enum pmd_cycles_counter_type { }; > > +enum rxq_cycles_counter_type { > + RXQ_CYCLES_PROC_CURR, /* Cycles spent successfully polling and > + processing polled packets */ > + RXQ_CYCLES_PROC_LAST, > + RXQ_N_CYCLES > +}; > + > #define XPS_TIMEOUT_MS 500LL > > @@ -347,4 +354,5 @@ struct dp_netdev_rxq { > particular core. */ > struct dp_netdev_pmd_thread *pmd; /* pmd thread that polls this > queue. */ > + atomic_ullong cycles[RXQ_N_CYCLES]; /* Processing cycles. */ > }; Very minor nit but not crazy about the alignment of the comments within the struct above. > > @@ -671,5 +679,11 @@ static void pmd_load_cached_ports(struct > dp_netdev_pmd_thread *pmd) static inline void > dp_netdev_pmd_try_optimize(struct dp_netdev_pmd_thread *pmd); > - > +static void > +dp_netdev_rxq_set_cycles(struct dp_netdev_rxq *rx, > + enum rxq_cycles_counter_type type, > + unsigned long long cycles); static uint64_t > +dp_netdev_rxq_get_cycles(struct dp_netdev_rxq *rx, > + enum rxq_cycles_counter_type type); > static void > dpif_netdev_xps_revalidate_pmd(const struct dp_netdev_pmd_thread *pmd, @@ > -3077,4 +3091,5 @@ cycles_count_end(struct dp_netdev_pmd_thread *pmd, > static inline void cycles_count_intermediate(struct dp_netdev_pmd_thread > *pmd, > + struct dp_netdev_rxq *rxq, > enum pmd_cycles_counter_type type) > OVS_NO_THREAD_SAFETY_ANALYSIS > @@ -3085,4 +3100,25 @@ cycles_count_intermediate(struct > dp_netdev_pmd_thread *pmd, > > non_atomic_ullong_add(&pmd->cycles.n[type], interval); > + if (rxq && (type == PMD_CYCLES_PROCESSING)) { > + /* Add to the amount of current processing cycles. */ > + non_atomic_ullong_add(&rxq->cycles[RXQ_CYCLES_PROC_CURR], > interval); > + } > +} > + > +static void > +dp_netdev_rxq_set_cycles(struct dp_netdev_rxq *rx, > + enum rxq_cycles_counter_type type, > + unsigned long long cycles) { > + atomic_store_relaxed(&rx->cycles[type], cycles); } > + > +static uint64_t > +dp_netdev_rxq_get_cycles(struct dp_netdev_rxq *rx, > + enum rxq_cycles_counter_type type) { > + unsigned long long tmp; > + atomic_read_relaxed(&rx->cycles[type], &tmp); > + return tmp; > } > > @@ -3589,5 +3625,5 @@ dpif_netdev_run(struct dpif *dpif) > port->rxqs[i].rx, > port->port_no); > - cycles_count_intermediate(non_pmd, process_packets ? > + cycles_count_intermediate(non_pmd, NULL, > process_packets ? > > PMD_CYCLES_PROCESSING > : PMD_CYCLES_IDLE); > @@ -3753,5 +3789,5 @@ reload: > dp_netdev_process_rxq_port(pmd, poll_list[i].rxq->rx, > poll_list[i].port_no); > - cycles_count_intermediate(pmd, > + cycles_count_intermediate(pmd, NULL, > process_packets ? > PMD_CYCLES_PROCESSING > : PMD_CYCLES_IDLE); > -- > 1.8.3.1
On 07/22/2017 03:51 PM, Stokes, Ian wrote: >> Add two counters to dp_netdev_rxq which will be used for storing the >> processing cycles of an rxq. Processing cycles will be stored in reference >> to a defined interval. One counter is used for storing cycles during the >> current in progress interval, while the other is used to store the cycles >> of the last fully complete interval. >> >> cycles_count_intermediate was used to count cycles for a pmd. With some >> small additions we can also use it to count the cycles used for processing >> an rxq. >> >> Signed-off-by: Kevin Traynor <ktraynor@redhat.com> > > Think I flagged this before but OVS doesn't compile cleanly after applying this patch. > > lib/dpif-netdev.c:3117:1: error: 'dp_netdev_rxq_get_cycles' defined but not used [-Werror=unused-function] > dp_netdev_rxq_get_cycles(struct dp_netdev_rxq *rx, > ^~~~~~~~~~~~~~~~~~~~~~~~ > lib/dpif-netdev.c:3109:1: error: 'dp_netdev_rxq_set_cycles' defined but not used [-Werror=unused-function] > dp_netdev_rxq_set_cycles(struct dp_netdev_rxq *rx, > > Consider rolling it into patch 4 of the series to avoid the issue. Hmm, I thought I had fixed this but obviously not :( As you suggested, I moved them to the next patch where they are first used. >> --- >> lib/dpif-netdev.c | 42 +++++++++++++++++++++++++++++++++++++++--- >> 1 file changed, 39 insertions(+), 3 deletions(-) >> >> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 0b8a0c8..273db38 >> 100644 >> --- a/lib/dpif-netdev.c >> +++ b/lib/dpif-netdev.c >> @@ -336,4 +336,11 @@ enum pmd_cycles_counter_type { }; >> >> +enum rxq_cycles_counter_type { >> + RXQ_CYCLES_PROC_CURR, /* Cycles spent successfully polling and >> + processing polled packets */ >> + RXQ_CYCLES_PROC_LAST, >> + RXQ_N_CYCLES >> +}; >> + >> #define XPS_TIMEOUT_MS 500LL >> >> @@ -347,4 +354,5 @@ struct dp_netdev_rxq { >> particular core. */ >> struct dp_netdev_pmd_thread *pmd; /* pmd thread that polls this >> queue. */ >> + atomic_ullong cycles[RXQ_N_CYCLES]; /* Processing cycles. */ >> }; > Very minor nit but not crazy about the alignment of the comments within the struct above. > I just deleted the comment as it's not really necessary and it won't line up with the rest correctly. >> >> @@ -671,5 +679,11 @@ static void pmd_load_cached_ports(struct >> dp_netdev_pmd_thread *pmd) static inline void >> dp_netdev_pmd_try_optimize(struct dp_netdev_pmd_thread *pmd); >> - >> +static void >> +dp_netdev_rxq_set_cycles(struct dp_netdev_rxq *rx, >> + enum rxq_cycles_counter_type type, >> + unsigned long long cycles); static uint64_t >> +dp_netdev_rxq_get_cycles(struct dp_netdev_rxq *rx, >> + enum rxq_cycles_counter_type type); >> static void >> dpif_netdev_xps_revalidate_pmd(const struct dp_netdev_pmd_thread *pmd, @@ >> -3077,4 +3091,5 @@ cycles_count_end(struct dp_netdev_pmd_thread *pmd, >> static inline void cycles_count_intermediate(struct dp_netdev_pmd_thread >> *pmd, >> + struct dp_netdev_rxq *rxq, >> enum pmd_cycles_counter_type type) >> OVS_NO_THREAD_SAFETY_ANALYSIS >> @@ -3085,4 +3100,25 @@ cycles_count_intermediate(struct >> dp_netdev_pmd_thread *pmd, >> >> non_atomic_ullong_add(&pmd->cycles.n[type], interval); >> + if (rxq && (type == PMD_CYCLES_PROCESSING)) { >> + /* Add to the amount of current processing cycles. */ >> + non_atomic_ullong_add(&rxq->cycles[RXQ_CYCLES_PROC_CURR], >> interval); >> + } >> +} >> + >> +static void >> +dp_netdev_rxq_set_cycles(struct dp_netdev_rxq *rx, >> + enum rxq_cycles_counter_type type, >> + unsigned long long cycles) { >> + atomic_store_relaxed(&rx->cycles[type], cycles); } >> + >> +static uint64_t >> +dp_netdev_rxq_get_cycles(struct dp_netdev_rxq *rx, >> + enum rxq_cycles_counter_type type) { >> + unsigned long long tmp; >> + atomic_read_relaxed(&rx->cycles[type], &tmp); >> + return tmp; >> } >> >> @@ -3589,5 +3625,5 @@ dpif_netdev_run(struct dpif *dpif) >> port->rxqs[i].rx, >> port->port_no); >> - cycles_count_intermediate(non_pmd, process_packets ? >> + cycles_count_intermediate(non_pmd, NULL, >> process_packets ? >> >> PMD_CYCLES_PROCESSING >> : PMD_CYCLES_IDLE); >> @@ -3753,5 +3789,5 @@ reload: >> dp_netdev_process_rxq_port(pmd, poll_list[i].rxq->rx, >> poll_list[i].port_no); >> - cycles_count_intermediate(pmd, >> + cycles_count_intermediate(pmd, NULL, >> process_packets ? >> PMD_CYCLES_PROCESSING >> : PMD_CYCLES_IDLE); >> -- >> 1.8.3.1 >
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 0b8a0c8..273db38 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -336,4 +336,11 @@ enum pmd_cycles_counter_type { }; +enum rxq_cycles_counter_type { + RXQ_CYCLES_PROC_CURR, /* Cycles spent successfully polling and + processing polled packets */ + RXQ_CYCLES_PROC_LAST, + RXQ_N_CYCLES +}; + #define XPS_TIMEOUT_MS 500LL @@ -347,4 +354,5 @@ struct dp_netdev_rxq { particular core. */ struct dp_netdev_pmd_thread *pmd; /* pmd thread that polls this queue. */ + atomic_ullong cycles[RXQ_N_CYCLES]; /* Processing cycles. */ }; @@ -671,5 +679,11 @@ static void pmd_load_cached_ports(struct dp_netdev_pmd_thread *pmd) static inline void dp_netdev_pmd_try_optimize(struct dp_netdev_pmd_thread *pmd); - +static void +dp_netdev_rxq_set_cycles(struct dp_netdev_rxq *rx, + enum rxq_cycles_counter_type type, + unsigned long long cycles); +static uint64_t +dp_netdev_rxq_get_cycles(struct dp_netdev_rxq *rx, + enum rxq_cycles_counter_type type); static void dpif_netdev_xps_revalidate_pmd(const struct dp_netdev_pmd_thread *pmd, @@ -3077,4 +3091,5 @@ cycles_count_end(struct dp_netdev_pmd_thread *pmd, static inline void cycles_count_intermediate(struct dp_netdev_pmd_thread *pmd, + struct dp_netdev_rxq *rxq, enum pmd_cycles_counter_type type) OVS_NO_THREAD_SAFETY_ANALYSIS @@ -3085,4 +3100,25 @@ cycles_count_intermediate(struct dp_netdev_pmd_thread *pmd, non_atomic_ullong_add(&pmd->cycles.n[type], interval); + if (rxq && (type == PMD_CYCLES_PROCESSING)) { + /* Add to the amount of current processing cycles. */ + non_atomic_ullong_add(&rxq->cycles[RXQ_CYCLES_PROC_CURR], interval); + } +} + +static void +dp_netdev_rxq_set_cycles(struct dp_netdev_rxq *rx, + enum rxq_cycles_counter_type type, + unsigned long long cycles) +{ + atomic_store_relaxed(&rx->cycles[type], cycles); +} + +static uint64_t +dp_netdev_rxq_get_cycles(struct dp_netdev_rxq *rx, + enum rxq_cycles_counter_type type) +{ + unsigned long long tmp; + atomic_read_relaxed(&rx->cycles[type], &tmp); + return tmp; } @@ -3589,5 +3625,5 @@ dpif_netdev_run(struct dpif *dpif) port->rxqs[i].rx, port->port_no); - cycles_count_intermediate(non_pmd, process_packets ? + cycles_count_intermediate(non_pmd, NULL, process_packets ? PMD_CYCLES_PROCESSING : PMD_CYCLES_IDLE); @@ -3753,5 +3789,5 @@ reload: dp_netdev_process_rxq_port(pmd, poll_list[i].rxq->rx, poll_list[i].port_no); - cycles_count_intermediate(pmd, + cycles_count_intermediate(pmd, NULL, process_packets ? PMD_CYCLES_PROCESSING : PMD_CYCLES_IDLE);
Add two counters to dp_netdev_rxq which will be used for storing the processing cycles of an rxq. Processing cycles will be stored in reference to a defined interval. One counter is used for storing cycles during the current in progress interval, while the other is used to store the cycles of the last fully complete interval. cycles_count_intermediate was used to count cycles for a pmd. With some small additions we can also use it to count the cycles used for processing an rxq. Signed-off-by: Kevin Traynor <ktraynor@redhat.com> --- lib/dpif-netdev.c | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-)