summaryrefslogtreecommitdiff
path: root/lib/ovs-thread.h
Commit message (Collapse)AuthorAgeFilesLines
* ovs-thread: Fix thread id for threads not started with ovs_thread_create()Eelco Chaudron2018-06-081-1/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When ping-pong'in a live VM migration between two machines running OVS-DPDK every now and then the ping misses would increase dramatically. For example: Acked-by: Ilya Maximets <i.maximets@samsung.com> ===========Stream Rate: 3Mpps=========== No Stream_Rate Downtime Totaltime Ping_Loss Moongen_Loss 0 3Mpps 128 13974 115 7168374 1 3Mpps 145 13620 17 1169770 2 3Mpps 140 14499 116 7141175 3 3Mpps 142 13358 16 1150606 4 3Mpps 136 14004 16 1124020 5 3Mpps 139 15494 214 13170452 6 3Mpps 136 15610 217 13282413 7 3Mpps 146 13194 17 1167512 8 3Mpps 148 12871 16 1162655 9 3Mpps 137 15615 214 13170656 I identified this issue being introduced in OVS commit, f3e7ec254738 ("Update relevant artifacts to add support for DPDK 17.05.1.") and more specific due to DPDK commit, af1475918124 ("vhost: introduce API to start a specific driver"). The combined changes no longer have OVS start the vhost socket polling thread at startup, but DPDK will do it on its own when the first vhost client is started. Figuring out the reason why this happens kept me puzzled for quite some time... What happens is that the callbacks called from the vhost thread are calling ovsrcu_synchronize() as part of destroy_device(). This will end-up calling seq_wait__(). By default, all created threads outside of OVS will get thread id 0, which is equal to the main ovs thread. So for example in the seq_wait__() function above if the main thread is waiting already we won't add ourselves as a waiter. The fix below assigns OVSTHREAD_ID_UNSET to none OVS created threads, which will get updated to a valid ID on the first call to ovsthread_id_self(). Signed-off-by: Eelco Chaudron <echaudro@redhat.com> Fixes: f3e7ec254738 ("Update relevant artifacts to add support for DPDK 17.05.1.") Acked-by: Ilya Maximets <i.maximets@samsung.com> Signed-off-by: Ian Stokes <ian.stokes@intel.com>
* lib: Adding explicit typecasts to fix C++ compilation issuesShireesh Singh2017-12-191-2/+2
| | | | | | | | | | | C++ does not allow implicit conversion from void pointer to a specific pointer type. This change adds explicit typecasts to appropriate types wherever needed. Signed-off-by: Shireesh Kumar Singh <shireeshkum@vmware.com> Signed-off-by: Sairam Venugopal <vsairam@vmware.com> Co-authored-by: Sairam Venugopal <vsairam@vmware.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* poll: Suppress logging for pmd threads.Ilya Maximets2016-01-111-0/+1
| | | | | | | | 'Unreasonably long poll interval's are reasonable for PMD threads. Also reporting of high CPU usage is not necessary. Signed-off-by: Ilya Maximets <i.maximets@samsung.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* lib: Expose ovs_mutex and ovsthread_once in <openvswitch/thread.h>Thomas Graf2014-12-151-111/+1
| | | | | | | | This picks the ovs_mutex and ovsthread_once API from lib/ovs-thread.h and exposes it in <openvswitch/thread.h>. Signed-off-by: Thomas Graf <tgraf@noironetworks.com> Acked-by: Ben Pfaff <blp@nicira.com>
* lib: Expose SOURCE_LOCATOR as OVS_SOURCE_LOACATORThomas Graf2014-12-151-8/+8
| | | | | | | Required to expose headers which depend on SOURCE_LOCATOR Signed-off-by: Thomas Graf <tgraf@noironetworks.com> Acked-by: Ben Pfaff <blp@nicira.com>
* lib/ovs-thread: Avoid atomic read in ovsthread_once_start().Jarno Rajahalme2014-08-291-14/+8
| | | | | | | | | | | We can use a normal bool and rely on the mutex_lock/unlock and an atomic_thread_fence for synchronization. Also flip the return value of ovsthread_once_start__() to match the one of ovsthread_once_start(). Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* lib/ovs-thread: Use atomic_count.Jarno Rajahalme2014-08-291-1/+1
| | | | | | | | | | | barrier->count is used as a simple counter and is not expected the synchronize the state of any other variable, so we can use atomic_count, which uses relaxed atomics. Ditto for the 'next_id' within ovsthread_wrapper(). Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* lib: Use shorter form of relaxed atomic access.Jarno Rajahalme2014-08-291-1/+1
| | | | | Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* ovs-thread: Implement OVS specific barrier.Alex Wang2014-06-131-6/+13
| | | | | | | | | | | | | | | | | Non-leader revalidator thread uses pthread_barrier_* functions in their main loop to synchronize with leader thread. However, since those threads only call poll_block() intermittently, the poll interval check in poll_block() can wrongly take the time since last call as poll interval and issue the following warnings: "Unreasonably long XXXXms poll interval". To prevent it, this commit implements the barrier struct and operations for OVS which allow thread to block on barrier via poll_block(). Signed-off-by: Alex Wang <alexw@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* process: block signals while spawning child processesAnsis Atteka2014-05-301-0/+4
| | | | | | | | | | | | | | | | | | | | | | | | | Between fork() and execvp() calls in the process_start() function both child and parent processes share the same file descriptors. This means that, if a child process received a signal during this time interval, then it could potentially write data to a shared file descriptor. One such example is fatal signal handler, where, if child process received SIGTERM signal, then it would write data into pipe. Then a read event would occur on the other end of the pipe where parent process is listening and this would make parent process to incorrectly believe that it was the one who received SIGTERM. Also, since parent process never reads data from this pipe, then this bug would make parent process to consume 100% CPU by immediately waking up from the event loop. This patch will help to avoid this problem by blocking signals until child closes all its file descriptors. Signed-off-by: Ansis Atteka <aatteka@nicira.com> Reported-by: Suganya Ramachandran <suganyar@vmware.com> Issue: 1255110
* ovs-thread: Fix OVS_ADAPTIVE_MUTEX_INITIALIZER.Ben Pfaff2014-05-011-1/+1
| | | | | | | | | | | | | Commit 05bf6d3c62e1d (ovs-thread: Add checking for mutex and rwlock initialization.) updated mutex and rwlock initializers to set the "where" member to a nonnull value, but missed this one. This commit fixes the problem. This does not cause real problems in practice because OVS_ADAPTIVE_MUTEX_INITIALIZER has no existing users. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
* ovs-thread: Add checking for mutex and rwlock initialization.Ben Pfaff2014-04-281-6/+7
| | | | | | | | | | | | | With glibc, a mutex or rwlock filled with all-zero-bytes is properly initialized for use, but this is not true for any other libc that OVS supports. However, OVS gets a lot more testing with glibc than any other libc. This means that developers keep introducing bugs that do not manifest on the main development platform. This commit should help avoid the problem, by reusing the existing 'where' members to indicate whether a mutex or rwlock has been initialized. Signed-off-by: Ben Pfaff <blp@nicira.com>
* ovs-thread: Make caller provide thread name when creating a thread.Ben Pfaff2014-04-281-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | Thread names are occasionally very useful for debugging, but from time to time we've forgotten to set one. This commit adds the new thread's name as a parameter to the function to start a thread, to make that mistake impossible. This also simplifies code, since two function calls become only one. This makes a few other changes to the thread creation function: * Since it is no longer a direct wrapper around a pthread function, rename it to avoid giving that impression. * Remove 'pthread_attr_t *' param that every caller supplied as NULL. * Change 'pthread *' parameter into a return value, for convenience. The system-stats code hadn't set a thread name, so this fixes that issue. This patch is a prerequisite for making RCU report the name of a thread that is blocking RCU synchronization, because the easiest way to do that is for ovsrcu_quiesce_end() to record the current thread's name. ovsrcu_quiesce_end() is called before the thread function is called, so it won't get a name set within the thread function itself. Setting the thread name earlier, as in this patch, avoids the problem. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Alex Wang <alexw@nicira.com>
* ovs-thread: Replace ovsthread_counter by more general ovsthread_stats.Ben Pfaff2014-03-191-5/+18
| | | | | | | | This allows clients to do more than just increment a counter. The following commit will make the first use of that feature. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Andy Zhou <azhou@nicira.com>
* ovs-rcu: New library.Ben Pfaff2014-03-181-0/+2
| | | | | | | | RCU allows multiple threads to read objects in parallel without any performance penalty. The following commit will introduce the first use. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Andy Zhou <azhou@nicira.com>
* ovs-thread: We don't use fork in Windows.Gurucharan Shetty2014-03-131-0/+2
| | | | | Signed-off-by: Gurucharan Shetty <gshetty@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* ovs-thread: Add xpthread_barrier_*() wrappers.Joe Stringer2014-03-041-0/+6
| | | | | Signed-off-by: Joe Stringer <joestringer@nicira.com> Signed-off-by: Ben Pfaff <blp@nicira.com>
* ovs-thread: Use fair (but nonrecursive) rwlocks on glibc.Ben Pfaff2014-02-211-1/+24
| | | | | | | | | | | | | | | | | | | | | | | glibc supports two kinds of rwlocks: - The default kind of rwlock always allows recursive read-locks to succeed, but threads blocked on acquiring the write-lock are treated unfairly, causing them to be delayed indefinitely as long as new readers continue to come along. - An alternative "writer nonrecursive" rwlock allows recursive read-locks to succeed only if there are no threads waiting for the write-lock. Otherwise, recursive read-lock attempts deadlock in the presence of blocking write-lock attempts. However, this kind of rwlock is fair to writer. POSIX allows the latter behavior, which essentially means that any portable pthread program cannot try to take read-locks recursively. Since that's true, we might as well use the latter kind of rwlock with glibc and get the benefit of fairness of writers. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Joe Stringer <joestringer@nicira.com>
* ovs-thread: Get rid of obsolete sparse wrappers.Ben Pfaff2014-02-211-11/+0
| | | | | | | | | | These were useful back when we were trying to use the sparse lock balance annotations, but we removed those in commit 47b52c71232c0 (sparse: Remove support for thread-safety annotations.) and so they serve no purpose any longer. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Joe Stringer <joestringer@nicira.com>
* ovs-thread: Add support for pthread adaptive mutexJarno Rajahalme2014-02-131-0/+8
| | | | Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Signed-off-by: Ben Pfaff <blp@nicira.com>
* ovs-thread: Add a comment.Ben Pfaff2014-02-071-1/+7
| | | | | Reported-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp> Signed-off-by: Ben Pfaff <blp@nicira.com>
* ovs-thread: Add new support for thread-specific data.Ben Pfaff2014-01-141-5/+58
| | | | | | | | | | | A couple of times I've wanted to create a dynamic data structure that has thread-specific data, but I've not been able to do that because PTHREAD_KEYS_MAX is so low (POSIX says at least 128, glibc is only a little bigger at 1024). This commit introduces a new form of thread-specific data that supports a large number of items. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>
* dpif-netdev: Use new "ovsthread_counter" to track dp statistics.Ben Pfaff2014-01-081-0/+19
| | | | | | | | ovsthread_counter is an abstract interface that could be implemented different ways. The initial implementation is simple but less than optimally efficient. Signed-off-by: Ben Pfaff <blp@nicira.com>
* ovs-thread: Fix crash by making count_cpu_count() return type a signed int.Ben Pfaff2013-12-131-1/+1
| | | | | | | | | | | | ofproto_set_threads() uses the calculation MAX(count_cpu_cores() - 2, 1) to decide on the default thread count. However, count_cpu_cores() returns 0 if it can't count the number of cores, or 1 if there's only one core, and that causes the calculation to come out as UINT_MAX-2 or UINT_MAX-1, respectively, which causes a memory allocation failure later. There are other ways to fix this problem, too, of course. Signed-off-by: Ben Pfaff <blp@nicira.com>
* ovs-thread: Break recursion for coverage counters.Gurucharan Shetty2013-12-131-2/+8
| | | | | | | | | | | | | For systems that do not have either HAVE_THREAD_LOCAL or HAVE___THREAD (ex: windows using MSVC), a COVERAGE_INC() calls xmalloc which inturn calls COVERAGE_INC() creating a recursion that causes a stack overflow. This commit breaks the recursion by calling malloc() instead of xmalloc(). Signed-off-by: Gurucharan Shetty <gshetty@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* lib: Refactor gathering CPU core countJoe Stringer2013-12-091-0/+4
| | | | | | Signed-off-by: Joe Stringer <joestringer@nicira.com> Signed-off-by: Ethan Jackson <ethan@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>
* ovs-atomic: atomic_load() must take a non-const argument.Ben Pfaff2013-08-201-1/+1
| | | | | | | | | | C11 says that atomic_load() requires a non-const argument, and Clang enforces that. This fixes warnings with FreeBSD <stdatomic.h> that uses the Clang extensions. Reported-by: Ed Maste <emaste@freebsd.org> Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Ed Maste <emaste@freebsd.org>
* Use "error-checking" mutexes in place of other kinds wherever possible.Ben Pfaff2013-08-201-32/+6
| | | | | | | | | | | | | | | | | | | | | | | | | We've seen a number of deadlocks in the tree since thread safety was introduced. So far, all of these are self-deadlocks, that is, a single thread acquiring a lock and then attempting to re-acquire the same lock recursively. When this has happened, the process simply hung, and it was somewhat difficult to find the cause. POSIX "error-checking" mutexes check for this specific problem (and others). This commit switches from other types of mutexes to error-checking mutexes everywhere that we can, that is, everywhere that we're not using recursive mutexes. This ought to help find problems more quickly in the future. There might be performance advantages to other kinds of mutexes in some cases. However, the existing mutex type choices were just guesses, so I'd rather go for easy detection of errors until we know that other mutex types actually perform better in specific cases. Also, I did a quick microbenchmark of glibc mutex types on my host and found that the error checking mutexes weren't any slower than the other types, at least when the mutex is uncontended. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>
* ovs-thread: Use mutex instead of its address in thread-safety annotation.Ben Pfaff2013-08-131-3/+3
| | | | | | | CodingStyle says that this is preferred. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>
* sparse: Remove support for thread-safety annotations.Ben Pfaff2013-08-131-5/+0
| | | | | | | | | The Clang support for thread-safety annotations is much more effective than "sparse" support. I found that I was unable to make the annotations warning-free under sparse. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>
* ovs-thread: Remove superfluous semicolons in macro definitions.Ben Pfaff2013-08-081-2/+2
| | | | | Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>
* ovs-thread: New function xpthread_join().Ethan Jackson2013-08-081-0/+1
| | | | | Signed-off-by: Ethan Jackson <ethan@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* ovs-thread: New function ovsthread_id_self().Ben Pfaff2013-08-081-0/+17
| | | | | | | | | | | | | I foresee a need for possibly large numbers of instances of "struct seq" (which is introduced in an upcoming patch). Each struct seq needs some per-thread data. POSIX has pthread_key_t for this, but the number of keys can be fairly limited, to as few as 128. It is reasonable to work around this by using a hash table indexed on the current thread. That only works if one can get a thread identifier that is hashable (pthread_t is not). This patch introduces a hashable thread identifier. Signed-off-by: Ben Pfaff <blp@nicira.com>
* ovs-thread: Add support for globally visible per-thread data.Ben Pfaff2013-08-081-16/+78
| | | | | | | | | DEFINE_PER_THREAD_DATA always declared its data item as "static", meaning that it was only directly visible within a single translation unit. This commit adds additional forms of per-thread data that allow the data to be accessible from multiple translation units. Signed-off-by: Ben Pfaff <blp@nicira.com>
* ovs-thread: New function xpthread_setspecific().Ben Pfaff2013-08-081-2/+3
| | | | Signed-off-by: Ben Pfaff <blp@nicira.com>
* ovs-atomic-pthreads: Fix "has incomplete type" error.Alex Wang2013-07-311-0/+5
| | | | | | | | | | | | | | | Commit 97be153858b4cd175cbe7862b8e1624bf22ab98a (clang: Add annotations for thread safety check.) defined 'struct ovs_mutex' variable in 'atomic_flag' in 'ovs-atomic-pthreads.h'. This casued "mutex: has incomplete type" error in compilation when 'ovs-atomic-pthreads.h' is included. This commit goes back to use 'pthread_mutex_t' for that variable and adds test for the 'atomic_flag' related functions. Reported-by: Gurucharan Shetty <gshetty@nicira.com> Signed-off-by: Alex Wang <alexw@nicira.com> Signed-off-by: Ben Pfaff <blp@nicira.com>
* clang: Add annotations for thread safety check.Ethan Jackson2013-07-301-43/+99
| | | | | | | | | | This commit adds annotations for thread safety check. And the check can be conducted by using -Wthread-safety flag in clang. Co-authored-by: Alex Wang <alexw@nicira.com> Signed-off-by: Alex Wang <alexw@nicira.com> Signed-off-by: Ethan Jackson <ethan@nicira.com> Signed-off-by: Ben Pfaff <blp@nicira.com>
* Avoid C preprocessor trick where macro has the same name as a function.Ben Pfaff2013-07-291-4/+4
| | | | | | | | | | | | | | | | | | | In C, one can do preprocessor tricks by making a macro expansion include the macro's own name. We actually used this in the tree to automatically provide function arguments, e.g.: int f(int x, const char *file, int line); #define f(x) f(x, __FILE__, __LINE__) ... f(1); /* Expands to a call like f(1, __FILE__, __LINE__); */ However it's somewhat confusing, so this commit stops using that trick. Reported-by: Ed Maste <emaste@freebsd.org> Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Ed Maste <emaste@freebsd.org>
* ovs-thread: Add wrappers for "destroy" functions too.Ben Pfaff2013-07-251-0/+3
| | | | | Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>
* fatal-signal: Make thread-safe.Ben Pfaff2013-07-231-0/+6
| | | | Signed-off-by: Ben Pfaff <blp@nicira.com>
* ovs-thread: Add support for various thread-related assertions.Ben Pfaff2013-06-281-0/+11
| | | | | Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>
* ovs-thread: Add support for convenient once-only initializers.Ben Pfaff2013-06-281-0/+76
| | | | | | | | | | pthread_once() is portable but it does not allow passing any parameters to the initialization function, which is often inconvenient, because it means that the function can only access data declared at file scope. This commit introduces an alternative with a more convenient interface. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>
* ovs-thread: Add per-thread data support.Ben Pfaff2013-06-251-0/+204
| | | | | | | | | | | | | | | | | POSIX defines a portable pthread_key_t API for per-thread data. GCC and C11 have two different forms of per-thread data that are generally faster than the POSIX API, where they are available. This commit adds a macro-based wrapper, DEFINE_PER_THREAD_DATA, that takes advantage of these features where they are available and falls back to the POSIX API otherwise. The Clang compiler implements C11 thread_local in its <threads.h>. This commit also adds a convenience wrapper for the POSIX API, via the DEFINE_PER_THREAD_MALLOCED_DATA macro. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>
* ovs-thread: New module, initially just with pthreads wrapper functions.Ben Pfaff2013-06-251-0/+89
The only tricky part here is that I'm throwing in annotations to allow "sparse" to report unbalanced locking. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>