24/04/2020 09:24, Phil Yang: > Volatile has no ordering semantics. The rte_timer structure defines > timer status as a volatile variable and uses the rte_r/wmb barrier > to guarantee inter-thread visibility. > > This patch optimized the volatile operation with c11 atomic operations > and one-way barrier to save the performance penalty. According to the > timer_perf_autotest benchmarking results, this patch can uplift 10%~16% > timer appending performance, 3%~20% timer resetting performance and 45% > timer callbacks scheduling performance on aarch64 and no loss in > performance for x86. > > Suggested-by: Honnappa Nagarahalli <honnappa.nagaraha...@arm.com> > Signed-off-by: Phil Yang <phil.y...@arm.com> > Reviewed-by: Gavin Hu <gavin...@arm.com> > Acked-by: Erik Gabriel Carrillo <erik.g.carri...@intel.com> [...] > --- a/lib/librte_timer/rte_timer.h > +++ b/lib/librte_timer/rte_timer.h > @@ -101,7 +101,7 @@ struct rte_timer > - volatile union rte_timer_status status; /**< Status of timer. */ > + union rte_timer_status status; /**< Status of timer. */
Unfortunately, I cannot merge this patch because it breaks the ABI: [C]'function void rte_timer_init(rte_timer*)' at rte_timer.c:214:1 has some indirect sub-type changes: parameter 1 of type 'rte_timer*' has sub-type changes: in pointed to type 'struct rte_timer' at rte_timer.h:100:1: type size hasn't changed 1 data member changes (2 filtered): type of 'volatile rte_timer_status rte_timer::status' changed: entity changed from 'volatile rte_timer_status' to 'union rte_timer_status' at rte_timer.h:67:1 type size hasn't changed