On Sep 20, 2014, at 12:12 PM, Daniele Di Proietto <ddiproie...@vmware.com> wrote:
> Sometimes we need to read and write 64-bit values (statistics) from multiple > threads. On 64-bit architectures it si possible to read 64-bit data while it > is > being written without worrying about consistency. > On 32-bit architectures have to use some form of synchronization to make sure > that we are reading a consistent 64-bit value. > > Therefore, 'u64_stats_lock' is introduced, which maps to a noop for 64-bits > architecture and to a mutex for other architectures. Did you consider using atomic variable instead? In some 32-bit systems aligned 64-bit accesses can be also consistent without locking, and there may be other, more efficient mechanisms for ensuring atomicity of single variable access than a mutex. In a single-writer scenario you would not use atomic_add, but a combination of an atomic_read, non-atomic addition, and atomic_store. Optimizer might even combine these to a single instruction? Jarno > > Signed-off-by: Daniele Di Proietto <ddiproie...@vmware.com> > --- > lib/automake.mk | 1 + > lib/u64-stats-lock.h | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 66 insertions(+) > create mode 100644 lib/u64-stats-lock.h > > diff --git a/lib/automake.mk b/lib/automake.mk > index b83cceb..7f265ef 100644 > --- a/lib/automake.mk > +++ b/lib/automake.mk > @@ -234,6 +234,7 @@ lib_libopenvswitch_la_SOURCES = \ > lib/token-bucket.c \ > lib/token-bucket.h \ > lib/type-props.h \ > + lib/u64-stats-lock.h \ > lib/unaligned.h \ > lib/unicode.c \ > lib/unicode.h \ > diff --git a/lib/u64-stats-lock.h b/lib/u64-stats-lock.h > new file mode 100644 > index 0000000..0db40a5 > --- /dev/null > +++ b/lib/u64-stats-lock.h > @@ -0,0 +1,65 @@ > +/* > + * Copyright (c) 2014 Nicira, Inc. > + * > + * Licensed under the Apache License, Version 2.0 (the "License"); > + * you may not use this file except in compliance with the License. > + * You may obtain a copy of the License at: > + * > + * http://www.apache.org/licenses/LICENSE-2.0 > + * > + * Unless required by applicable law or agreed to in writing, software > + * distributed under the License is distributed on an "AS IS" BASIS, > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. > + * See the License for the specific language governing permissions and > + * limitations under the License. > + */ > + > +#ifndef U64_STATS_LOCK_H > +#define U64_STATS_LOCK_H 1 > + > +#include "ovs-thread.h" > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +/* This type of lock should be used for accessing atomically 64-bit values > from > + * multiples threads. It maps to noop when compiling for 64-bit > architectures, > + * otherwise it is a mutex. The basic idea is similar to > linux/u64_stats_sync.h > + */ > + > +#if !__GNUC__ || !defined(__x86_64__) > +#define U64_STATS_LOCK_NEEDS_MUTEX > +#endif > + > +struct OVS_LOCKABLE u64_stats_lock { > +#ifdef U64_STATS_LOCK_NEEDS_MUTEX > + struct ovs_mutex mutex; > +#endif > +}; > + > +static inline void > +u64_stats_lock_acquire(struct u64_stats_lock *l OVS_UNUSED) > + OVS_ACQUIRES(l) > + OVS_NO_THREAD_SAFETY_ANALYSIS > +{ > +#ifdef U64_STATS_LOCK_NEEDS_MUTEX > + ovs_mutex_lock(&l->mutex); > +#endif > +} > + > +static inline void > +u64_stats_lock_release(struct u64_stats_lock *l OVS_UNUSED) > + OVS_RELEASES(l) > + OVS_NO_THREAD_SAFETY_ANALYSIS > +{ > +#ifdef U64_STATS_LOCK_NEEDS_MUTEX > + ovs_mutex_unlock(&l->mutex); > +#endif > +} > + > +#ifdef __cplusplus > +} > +#endif > + > +#endif /* u64-stats-lock.h */ > -- > 2.1.0.rc1 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev