summaryrefslogtreecommitdiff
path: root/tests/library.at
Commit message (Collapse)AuthorAgeFilesLines
* tests: Add unit tests to rculist.Adrian Moreno2023-01-111-0/+5
| | | | | | | | Low test coverage on this area caused some errors to remain unnoticed. Add basic functional test of rculist. Signed-off-by: Adrian Moreno <amorenoz@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* lib: Add support for sets of UUIDs.Dumitru Ceara2022-09-271-0/+4
| | | | | | | | | | | | | | | | | | Part of the uuidset implementation is taken from the OVN codebase where it was added via commit 0e77b3bcbfe2 ("ovn-northd-ddlog: New implementation of ovn-northd based on ddlog."). We now extend that, adding a few helpers and tests. Co-authored-by: Leonid Ryzhyk <lryzhyk@vmware.com> Signed-off-by: Leonid Ryzhyk <lryzhyk@vmware.com> Co-authored-by: Justin Pettit <jpettit@ovn.org> Signed-off-by: Justin Pettit <jpettit@ovn.org> Co-authored-by: Ben Pfaff <blp@ovn.org> Signed-off-by: Ben Pfaff <blp@ovn.org> Signed-off-by: Dumitru Ceara <dceara@redhat.com> Reviewed-by: Ales Musil <amusil@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* ovs-rcu: Add ovsrcu_barrier.Peng He2022-05-301-1/+1
| | | | | | | | | | | | | | ovsrcu_barrier will block the current thread until all the postponed rcu job has been finished. it's like a OVS version of the Linux kernel rcu_barrier(). Signed-off-by: Peng He <hepeng.0320@bytedance.com> Co-authored-by: Eelco Chaudron <echaudro@redhat.com> Signed-off-by: Eelco Chaudron <echaudro@redhat.com> Reviewed-by: David Marchand <david.marchand@redhat.com> Acked-by: Eelco Chaudron <echaudro@redhat.com> Acked-by: Aaron Conole <aconole@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* sha1: Use implementation from openssl if available.Ilya Maximets2022-05-261-1/+1
| | | | | | | | | | | | | | | | | | | | | | | Implementation of SHA1 in OpenSSL library is much faster and optimized for all available CPU architectures and instruction sets. OVS should use it instead of internal implementation if possible. Depending on compiler options OpenSSL's version finishes our sha1 unit tests from 3 to 12 times faster. Performance of OpenSSL's version is constant, but OVS's implementation highly depends on compiler. Interestingly, default build with '-g -O2' works faster than optimized '-march=native -Ofast'. Tests with ovsdb-server on big databases shows ~5-10% improvement of the time needed for database compaction (sha1 is only a part of this operation), depending on compiler options. We still need internal implementation, because OpenSSL can be not available on some platforms. Tests enhanced to check both versions of API. Reviewed-by: Dumitru Ceara <dceara@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* id-fpool: Module for fast ID generation.Gaetan Rivet2022-01-181-0/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The current id-pool module is slow to allocate the next valid ID, and can be optimized when restricting some properties of the pool. Those restrictions are: * No ability to add a random ID to the pool. * A new ID is no more the smallest possible ID. It is however guaranteed to be in the range of [floor, last_alloc + nb_user * cache_size + 1]. where 'cache_size' is the number of ID in each per-user cache. It is defined as 'ID_FPOOL_CACHE_SIZE' to 64. * A user should never free an ID that is not allocated. No checks are done and doing so will duplicate the spurious ID. Refcounting or other memory management scheme should be used to ensure an object and its ID are only freed once. This allocator is designed to scale reasonably well in multithread setup. As it is aimed at being a faster replacement to the current id-pool, a benchmark has been implemented alongside unit tests. The benchmark is composed of 4 rounds: 'new', 'del', 'mix', and 'rnd'. Respectively + 'new': only allocate IDs + 'del': only free IDs + 'mix': allocate, sequential free, then allocate ID. + 'rnd': allocate, random free, allocate ID. Randomized freeing is done by swapping the latest allocated ID with any from the range of currently allocated ID, which is reminiscent of the Fisher-Yates shuffle. This evaluates freeing non-sequential IDs, which is the more natural use-case. For this specific round, the id-pool performance is such that a timeout of 10 seconds is added to the benchmark: $ ./tests/ovstest test-id-fpool benchmark 10000 1 Benchmarking n=10000 on 1 thread. type\thread: 1 Avg id-fpool new: 1 1 ms id-fpool del: 1 1 ms id-fpool mix: 2 2 ms id-fpool rnd: 2 2 ms id-pool new: 4 4 ms id-pool del: 2 2 ms id-pool mix: 6 6 ms id-pool rnd: 431 431 ms $ ./tests/ovstest test-id-fpool benchmark 100000 1 Benchmarking n=100000 on 1 thread. type\thread: 1 Avg id-fpool new: 2 2 ms id-fpool del: 2 2 ms id-fpool mix: 3 3 ms id-fpool rnd: 4 4 ms id-pool new: 12 12 ms id-pool del: 5 5 ms id-pool mix: 16 16 ms id-pool rnd: 10000+ -1 ms $ ./tests/ovstest test-id-fpool benchmark 1000000 1 Benchmarking n=1000000 on 1 thread. type\thread: 1 Avg id-fpool new: 15 15 ms id-fpool del: 12 12 ms id-fpool mix: 34 34 ms id-fpool rnd: 48 48 ms id-pool new: 276 276 ms id-pool del: 286 286 ms id-pool mix: 448 448 ms id-pool rnd: 10000+ -1 ms Running only a performance test on the fast pool: $ ./tests/ovstest test-id-fpool perf 1000000 1 Benchmarking n=1000000 on 1 thread. type\thread: 1 Avg id-fpool new: 15 15 ms id-fpool del: 12 12 ms id-fpool mix: 34 34 ms id-fpool rnd: 47 47 ms $ ./tests/ovstest test-id-fpool perf 1000000 2 Benchmarking n=1000000 on 2 threads. type\thread: 1 2 Avg id-fpool new: 11 11 11 ms id-fpool del: 10 10 10 ms id-fpool mix: 24 24 24 ms id-fpool rnd: 30 30 30 ms $ ./tests/ovstest test-id-fpool perf 1000000 4 Benchmarking n=1000000 on 4 threads. type\thread: 1 2 3 4 Avg id-fpool new: 9 11 11 10 10 ms id-fpool del: 5 6 6 5 5 ms id-fpool mix: 16 16 16 16 16 ms id-fpool rnd: 20 20 20 20 20 ms Signed-off-by: Gaetan Rivet <grive@u256.net> Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* mpsc-queue: Module for lock-free message passing.Gaetan Rivet2022-01-181-0/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add a lockless multi-producer/single-consumer (MPSC), linked-list based, intrusive, unbounded queue that does not require deferred memory management. The queue is designed to improve the specific MPSC setup. A benchmark accompanies the unit tests to measure the difference in this configuration. A single reader thread polls the queue while N writers enqueue elements as fast as possible. The mpsc-queue is compared against the regular ovs-list as well as the guarded list. The latter usually offers a slight improvement by batching the element removal, however the mpsc-queue is faster. The average is of each producer threads time: $ ./tests/ovstest test-mpsc-queue benchmark 3000000 1 Benchmarking n=3000000 on 1 + 1 threads. type\thread: Reader 1 Avg mpsc-queue: 167 167 167 ms list(spin): 89 80 80 ms list(mutex): 745 745 745 ms guarded list: 788 788 788 ms $ ./tests/ovstest test-mpsc-queue benchmark 3000000 2 Benchmarking n=3000000 on 1 + 2 threads. type\thread: Reader 1 2 Avg mpsc-queue: 98 97 94 95 ms list(spin): 185 171 173 172 ms list(mutex): 203 199 203 201 ms guarded list: 269 269 188 228 ms $ ./tests/ovstest test-mpsc-queue benchmark 3000000 3 Benchmarking n=3000000 on 1 + 3 threads. type\thread: Reader 1 2 3 Avg mpsc-queue: 76 76 65 76 72 ms list(spin): 246 110 240 238 196 ms list(mutex): 542 541 541 539 540 ms guarded list: 535 535 507 511 517 ms $ ./tests/ovstest test-mpsc-queue benchmark 3000000 4 Benchmarking n=3000000 on 1 + 4 threads. type\thread: Reader 1 2 3 4 Avg mpsc-queue: 73 68 68 68 68 68 ms list(spin): 294 275 279 277 282 278 ms list(mutex): 346 309 287 345 302 310 ms guarded list: 378 319 334 378 351 345 ms Signed-off-by: Gaetan Rivet <grive@u256.net> Reviewed-by: Eli Britstein <elibr@nvidia.com> Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* tests: Add ovs-barrier unit test.Gaetan Rivet2022-01-181-0/+5
| | | | | | | | | | | | | No unit test exist currently for the ovs-barrier type. It is however crucial as a building block and should be verified to work as expected. Create a simple test verifying the basic function of ovs-barrier. Integrate the test as part of the test suite. Signed-off-by: Gaetan Rivet <grive@u256.net> Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* tests: Skip netlink policy test on non-Linux platforms.Ilya Maximets2021-08-281-0/+2
| | | | | | | | | | | | | | | | | | | | FreeBSD tests in Cirrus CI are broken and, I guess, windows tests too: 89. library.at:258: testing netlink policy ... ./library.at:259: ovstest test-netlink-policy ll_addr --- /dev/null 2021-08-20 19:02:41.907547000 +0000 +++ /tmp/cirrus-ci-build/tests/testsuite.dir/at-groups/89/stderr @@ -0,0 +1 @@ +ovstest: unknown command 'test-netlink-policy'; use --help for help ./library.at:259: exit code was 1, expected 0 89. library.at:258: 89. netlink policy (library.at:258): FAILED 'tests/test-netlink-policy.c' is built only on Linux, test must be skipped on all other platforms to unblock CI. Fixes: bfee9f6c0115 ("netlink: Add support for parsing link layer address.") Signed-off-by: Ilya Maximets <i.maximets@ovn.org> Acked-by: Frode Nordahl <frode.nordahl@canonical.com>
* netlink: Add support for parsing link layer address.Frode Nordahl2021-08-201-0/+4
| | | | | | | | | | | | | | Data retrieved from netlink and friends may include link layer address. Add type to nl_attr_type and min/max functions to allow use of nl_policy_parse with this type of data. While this will not be used by Open vSwitch itself at this time, sibling and derived projects want to use the great netlink library that OVS provides, and it is not possible to safely override the global nl_attr_type symbol at link time. Signed-off-by: Frode Nordahl <frode.nordahl@canonical.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* tests: Add overflow test for the sha1 library.Ilya Maximets2020-11-271-1/+2
| | | | | | | | | This is a unit test for the overflow detection issue fixed by commit a1d2c5f5d9ed ("sha1: Fix algorithm for data bigger than 512 megabytes.") Signed-off-by: Ilya Maximets <i.maximets@ovn.org> Acked-by: Paolo Valerio <pvalerio@redhat.com> Tested-by: Paolo Valerio <pvalerio@redhat.com>
* Require Python 3 and remove support for Python 2.Ben Pfaff2019-09-271-25/+17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Python 2 reaches end-of-life on January 1, 2020, which is only a few months away. This means that OVS needs to stop depending on in the next release that should occur roughly that same time. Therefore, this commit removes all support for Python 2. It also makes Python 3 a mandatory build dependency. Some of the interesting consequences: - HAVE_PYTHON, HAVE_PYTHON2, and HAVE_PYTHON3 conditionals have been removed, since we now know that Python3 is available. - $PYTHON and $PYTHON2 are removed, and $PYTHON3 is always available. - Many tests for Python 2 support have been removed, and the ones that depended on Python 3 now run unconditionally. This allowed several macros in the testsuite to be removed, making the code clearer. This does make some of the changes to the testsuite files large due to indentation level changes. - #! lines for Python now use /usr/bin/python3 instead of /usr/bin/python. - Packaging depends on Python 3 packages. Acked-by: Numan Siddique <nusiddiq@redhat.com> Tested-by: Numan Siddique <nusiddiq@redhat.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* sat-math: Add functions for saturating arithmetic on "long long int".Ben Pfaff2019-07-051-0/+5
| | | | | | | | | The first users will be added in an upcoming commit. Also add tests. Acked-by: Ilya Maximets <i.maximets@samsung.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* Permit to build OVS with only Python3 installedTimothy Redaelli2018-07-241-2/+2
| | | | | | | | | | | | | | | | | | This commit renames HAVE_PYTHON to HAVE_PYTHON2 and PYTHON to PYTHON2 and adds HAVE_PYTHON and PYTHON with a different semantics: - If PYTHON environment variable is set, use it as PYTHON - If a python2 interpreter is available, PYTHON became the python2 interpreter - If a python3 interpreter is available, PYTHON became the python3 interpreter PYTHON is only used to run the python scripts needed by the build system NOTE: Since currently most of the utilities and bugtool doesn't support Python3, they're installed only if python2 is available. This will be fixed in later commits. Signed-off-by: Timothy Redaelli <tredaelli@redhat.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* tests: Add tests for stopwatch moduleJakub Sitnicki2018-04-031-0/+5
| | | | | | | | Check if stopwatch module is calculating statistics as expected. Signed-off-by: Jakub Sitnicki <jkbs@redhat.com> Signed-off-by: Mark Michelson <mmichels@redhat.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* tests-windows: Make flow extractor work on WindowsAlin Gabriel Serdean2018-03-081-1/+1
| | | | | | | | | | | | | | +Traceback (most recent call last): + File "../.././flowgen.py", line 204, in <module> + flows = os.fdopen(3, 'wb') +OSError: [Errno 9] Bad file descriptor ./library.at:4: exit code was 1, expected 0 Unfortunately 3/4/5/.. FDs don't work on Windows. Switch to a filename open instead of opening the FDs. Signed-off-by: Alin Gabriel Serdean <aserdean@ovn.org> Acked-by: Ben Pfaff <blp at ovn.org>
* tests: Convert flowgen utility from Perl to Python.Ben Pfaff2017-11-261-1/+1
| | | | | | | | Perl is unfashionable and Python is more widely available and understood, so this commit converts one of the OVS uses of Perl into Python. Signed-off-by: Ben Pfaff <blp@ovn.org> Acked-by: Aaron Conole <aconole@redhat.com>
* lib: skiplist implementationLance Richardson2017-08-031-0/+11
| | | | | | | | | | Skiplist implementation intended for use in the IDL compound indexes feature. Signed-off-by: Esteban Rodriguez Betancourt <estebarb@hpe.com> Co-authored-by: Lance Richardson <lrichard@redhat.com> Signed-off-by: Lance Richardson <lrichard@redhat.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* tests: Fix spelling error in test name.Ben Pfaff2017-06-021-1/+1
| | | | | Signed-off-by: Ben Pfaff <blp@ovn.org> Acked-by: Justin Pettit <jpettit@ovn.org>
* ovsdb: Weak references performance fixRodriguez Betancourt, Esteban2016-07-261-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Prevents the cloning of rows with outgoing or incoming weak references when those rows aren't being modified. It improves the OVSDB Server performance when many rows with weak references are involved in a transaction. In the original code (dst_refs is created from scratch): old->dst_refs = all the rows that weak referenced old new->dst_refs = all the rows that weak referenced old and are still weak +referencing new + rows in the transaction that weak referenced new In the patch (dst_refs incrementally built): Old->dst_refs = all the rows that weak referenced old Ideally, but expansive to calculate: New->dst_refs = old->dst_refs - "weak references removed within this TXN" + +"weak references created within this TXN" What this patch implements: New->dst_refs = old->dst_refs - "weak references in old rows in TXN" + "weak +references in new rows in TXN" The resulting sets should be equal in both cases. We do some more optimizations: - If we know that the transactions must be successful at some point then, instead of cloning dst_refs we could just move the elements between the lists. - At that point we lost the rollback feature, but we aren't going to need it anyway (note that we didn't really touch the src_refs part). - The references in dst_refs must point to new instead than old. Previously we iterated over all the weak references in dst_refs to change that pointer, but using an UUID is easier, and prevents that iteration completely. For some more commentary, see: http://openvswitch.org/pipermail/dev/2016-July/074840.html Signed-off-by: Esteban Rodriguez Betancourt <estebarb@hpe.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* tests: Remove "test" from test names.Ben Pfaff2016-06-101-22/+22
| | | | | | | Every test is a test, so each test doesn't need to attest to being a test. Signed-off-by: Ben Pfaff <blp@ovn.org> Acked-by: Ryan Moats <rmoats@us.ibm.com>
* lib: Add new 'counting cmap' type.Jarno Rajahalme2016-05-161-0/+6
| | | | | | | | | | | | cmap implements duplicates as linked lists, which causes removal of rules to become (O^2) with large number of duplicates. This patch fixes the problem by introducing a new 'counting' variant of the cmap (ccmap), which can be efficiently used to keep counts of inserted hash values provided by the caller. This does not require a node in the user data structure, so this makes the user implementation a bit more memory efficient, too. Signed-off-by: Jarno Rajahalme <jarno@ovn.org> Acked-by: Ben Pfaff <blp@ovn.org>
* hmap: Add HMAP_FOR_EACH_POP.Daniele Di Proietto2016-04-261-1/+1
| | | | | | | Makes popping each member of the hmap a bit easier. Signed-off-by: Daniele Di Proietto <diproiettod@vmware.com> Acked-by: Ben Pfaff <blp@ovn.org>
* ovs-thread: Do not always end quiescent state in ovs_thread_create().Daniele Di Proietto2016-03-251-0/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | A new thread must be started in a non quiescent state. There is a call to ovsrcu_quiesce_end() in ovsthread_wrapper(), to enforce this. ovs_thread_create(), instead, is executed in the parent thread. It must call ovsrcu_quiesce_end() on its first invocation, to put the main thread in a non quiescent state. On every other invocation, it doesn't make sense to alter the calling thread state, so this commits wraps the call to ovsrcu_quiesce_end() in an ovsthread_once construct. This fixes a bug in ovs-rcu where the first call in the process to ovsrcu_quiesce_start() will not be honored, because the calling thread will need to create the 'urcu' thread (and creating a thread will wrongly end its quiescent state). ovsrcu_quiesce_start() ovs_rcu_quiesced() if (ovsthread_once_start(&once)) { ovs_thread_create("urcu") /*This will end the quiescent state*/ } This bug affects in particular ovs-vswitchd with DPDK. In the DPDK case the first threads created are "vhost_thread" and "dpdk_watchdog". If dpdk_watchdog is the first to call ovsrcu_quiesce_start() (via xsleep()), the call is not honored and the RCU grace period lasts at least for DPDK_PORT_WATCHDOG_INTERVAL (5s on current master). If vhost_thread, on the other hand, is the first to call ovsrcu_quiesce_start(), the call is not honored and the RCU grace period lasts undefinitely, because no more calls to ovsrcu_quiesce_start() are issued from vhost_thread. For some reason (it's a race condition after all), on current master, dpdk_watchdog will always be the first to call ovsrcu_quiesce_start(), but with the upcoming DPDK database configuration changes, sometimes vhost_thread will issue the first call to ovsrcu_quiesce_start(). Sample ovs-vswitchd.log: 2016-03-23T22:34:28.532Z|00004|ovs_rcu(urcu3)|WARN|blocked 8000 ms waiting for vhost_thread2 to quiesce 2016-03-23T22:34:30.501Z|00118|ovs_rcu|WARN|blocked 8000 ms waiting for vhost_thread2 to quiesce 2016-03-23T22:34:36.532Z|00005|ovs_rcu(urcu3)|WARN|blocked 16000 ms waiting for vhost_thread2 to quiesce 2016-03-23T22:34:38.501Z|00119|ovs_rcu|WARN|blocked 16000 ms waiting for vhost_thread2 to quiesce The commit also adds a test for the ovs-rcu module to make sure that: * A new thread is started in a non quiescent state. * The first call to ovsrcu_quiesce_start() is honored. * When a process becomes multithreaded the main thread is put in an active state Signed-off-by: Daniele Di Proietto <diproiettod@vmware.com> Acked-by: Ben Pfaff <blp@ovn.org>
* lib/util.c: Optimise bitwise_rscan.Han Zhou2016-03-231-0/+1
| | | | | | | | | | | | | | | | | | | | | | | bitwise_rscan() is found to be hot spot in ovn-controller during OVN scalability tests. It is triggered by lflow_run() when processing lflow updates from SB ovsdb. The perf result shows: + 35.90% ovn-controller ovn-controller [.] bitwise_rscan + 13.39% ovn-controller [kernel.kallsyms] [k] 0xffffffff8104f45a + 5.02% ovn-controller libc-2.19.so [.] _int_malloc + 3.47% ovn-controller libc-2.19.so [.] _int_free After optimization, bitwise_rscan percentage dropped from 36% to less than 6%: + 11.34% ovn-controller [kernel.kallsyms] [k] 0xffffffff8104f45a + 8.15% ovn-controller libc-2.19.so [.] _int_malloc + 5.77% ovn-controller ovn-controller [.] bitwise_rscan + 5.49% ovn-controller libc-2.19.so [.] _int_free Signed-off-by: Han Zhou <zhouhan@gmail.com> [blp@ovn.org enhanced the test] Signed-off-by: Ben Pfaff <blp@ovn.org>
* library.at: Run tests for Python 2 and 3.Russell Bryant2016-02-221-15/+24
| | | | | | | Update Python tests to run for both Python 2 and 3. Signed-off-by: Russell Bryant <russell@ovn.org> Acked-by: Ben Pfaff <blp@ovn.org>
* tests: Better tolerate file system restriction on file name length.Ben Pfaff2016-02-191-10/+18
| | | | | | | | | | | | ecryptfs on Linux restricts file names to 143 bytes, but these two tests used a 150-byte name. This commit fixes the specific problem on ecryptfs by reducing the name it test to 143 bytes. It also fixes the more general problem of name length restrictions by skipping the test, rather than failing it, if a directory with the 143-byte name cannot be created, since the most likely problem is that the name is too long for the file system. Reported-by: Zoltán Balogh <zoltan.balogh@ericsson.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* tests: Automatically initialize OVS_*DIR vars when tests begin.Ben Pfaff2015-09-091-1/+0
| | | | | | | | | | A lot of tests need to initialize the OVS_RUNDIR, OVS_LOGDIR, etc. variables to point to the directory in which the tests run. Until now, each of them has had to do this individually, which is redundant. This commit starts to do this automatically. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Andy Zhou <azhou@nicira.com>
* ofpbuf: Update msg when resizing ofpbuf.Alex Wang2015-07-201-0/+4
| | | | | | | | | | | | | | | | | | | | | Commit 6fd6ed7 (ofpbuf: Simplify ofpbuf API.) introduced the 'header' and 'msg' pointers to 'struct ofpbuf'. However, we forget to update the 'msg' pointer when resizing ofpbuf. This bug could cause serious issue. For example, in the function ofputil_encode_nx_packet_in(), the 'msg' pointer is populated in ofpraw_alloc_xid() when creating the ofpbuf . Later, the ofpbuf memory can be reallocated due to the writing to the ofpbuf. However, since the 'msg' pointer is not updated, the later use of the 'ofpbuf->msg' will end up writing to either free'ed memory or memory allocated for other struct. This commit fixes the bug by always updating the 'header' and 'msg' pointers when the ofpbuf is resized. Also, a simple test is added. Signed-off-by: Alex Wang <alexw@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* packet: Add IP pseudoheader checksum calculation.Jesse Gross2015-04-071-1/+1
| | | | | | | | | As OVS adds userspace support for being the endpoint in protocols like tunnels, it will need to be able to calculate pseudoheaders as part of the checksum calculation. Signed-off-by: Jesse Gross <jesse@nicira.com> Acked-by: Pravin B Shelar <pshelar@nicira.com>
* lib/list: Add LIST_FOR_EACH_POP.Jarno Rajahalme2015-04-061-1/+1
| | | | | | | | Makes popping each member of the list a bit easier. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Russell Bryant <rbryant@redhat.com> Acked-by: Ben Pfaff <blp@nicira.com>
* lib: Add test for library usageThomas Graf2014-12-151-0/+4
| | | | | | | | This test covers inclusion of public header files and basic usage of the API such as vlog. Signed-off-by: Thomas Graf <tgraf@noironetworks.com> Acked-by: Ben Pfaff <blp@nicira.com>
* bitmap: Add test for bitmap_equal and bitmap_scanKmindg2014-07-311-0/+5
| | | | | | Suggested-by: Ben Pfaff <blp@nicira.com> Signed-off-by: Kmindg <kmindg@gmail.com> Signed-off-by: Ben Pfaff <blp@nicira.com>
* test-util: Changes for 'assert' test on Windows.Gurucharan Shetty2014-06-241-3/+8
| | | | | | | | | | | | | There is no 'kill -l' type functionality available on Windows. So instead of looking for the string 'ABRT', check for the exit code in both platforms. On msys (unit test environment), it is 9 and on Linux, it is 134 (SIGABRT + 128). On Windows, stderr is fully buffered if connected to a pipe. Make it _IONBF so that an abort does not miss log contents. Signed-off-by: Gurucharan Shetty <gshetty@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* test-flows: Change the way flows are read.Gurucharan Shetty2014-06-101-1/+1
| | | | | | | | | | With Visual Studio and Msys combination, something is going wrong when we do a '3<pcap' followed by fdopen(3, 'rb'). fdopen fails. I do not know the exact reason for the failure. But the workaround is straightforward. Signed-off-by: Gurucharan Shetty <gshetty@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* cmap: New module for cuckoo hash table.Ben Pfaff2014-05-201-0/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This implements an "optimistic concurrent cuckoo hash", a single-writer, multiple-reader hash table data structure. The point of this data structure is performance, so this commit message focuses on performance. I tested the performance of cmap with the test-cmap utility included in this commit. It takes three parameters for benchmarking: - n, the number of elements to insert. - n_threads, the number of threads to use for searching and mutating the hash table. - mutations, the percentage of operations that should modify the hash table, from 0% to 100%. e.g. "test-cmap 1000000 16 1" inserts one million elements, uses 16 threads, and 1% of the operations modify the hash table. Any given run does the following for both hmap and cmap implementations: - Inserts n elements into a hash table. - Iterates over all of the elements. - Spawns n_threads threads, each of which searches for each of the elements in the hash table, once, and removes the specified percentage of them. - Removes each of the (remaining) elements and destroys the hash table. and reports the time taken by each step, The tables below report results for various parameters with a draft version of this library. The tests were not formally rerun for the final version, but the intermediate changes should only have improved performance, and this seemed to be the case in some informal testing. n_threads=16 was used each time, on a 16-core x86-64 machine. The compiler used was Clang 3.5. (GCC yields different numbers but similar relative results.) The results show: - Insertion is generally 3x to 5x faster in an hmap. - Iteration is generally about 3x faster in a cmap. - Search and mutation is 4x faster with .1% mutations and the advantage grows as the fraction of mutations grows. This is because a cmap does not require locking for read operations, even in the presence of a writer. With no mutations, however, no locking is required in the hmap case, and the hmap is somewhat faster. This is because raw hmap search is somewhat simpler and faster than raw cmap search. - Destruction is faster, usually by less than 2x, in an hmap. n=10,000,000: .1% mutations 1% mutations 10% mutations no mutations cmap hmap cmap hmap cmap hmap cmap hmap insert: 6132 2182 6136 2178 6111 2174 6124 2180 iterate: 370 1203 378 1201 370 1200 371 1202 search: 1375 8692 2393 28197 18402 80379 1281 1097 destroy: 1382 1187 1197 1034 324 241 1405 1205 n=1,000,000: .1% mutations 1% mutations 10% mutations no mutations cmap hmap cmap hmap cmap hmap cmap hmap insert: 311 25 310 60 311 59 310 60 iterate: 25 62 25 64 25 57 25 60 search: 115 637 197 2266 1803 7284 101 67 destroy: 103 64 90 59 25 13 104 66 n=100,000: .1% mutations 1% mutations 10% mutations no mutations cmap hmap cmap hmap cmap hmap cmap hmap insert: 25 6 26 5 25 5 25 5 iterate: 1 3 1 3 1 3 2 3 search: 12 57 27 219 164 735 10 5 destroy: 5 3 6 3 2 1 6 4 Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
* tests/library.at: Disable unix socket tests on Windows.Gurucharan Shetty2014-05-141-2/+4
| | | | | Signed-off-by: Gurucharan Shetty <gshetty@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* unit-test: Link 29 test programs into ovstestAndy Zhou2014-04-031-16/+16
| | | | | | | | | | | | | | Improve link speed by linking 29 test programs into ovstest. On my machine, running the following command against a fully built tree: $ touch lib/random.c; time make Improve the overall build time from 7 seconds to 3.5 seconds. Signed-off-by: Andy Zhou <azhou@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* stdio: New module, initially to provide working [v]snprintf() on Windows.Ben Pfaff2013-12-241-0/+4
| | | | | | | | This should transparently define snprintf() and vsnprintf() wrappers for use on Windows. CC: Saurabh Shah <ssaurabh@vmware.com> Signed-off-by: Ben Pfaff <blp@nicira.com>
* lib/util: Add clz32() and clz64().Jarno Rajahalme2013-12-031-0/+1
| | | | | | | | | Count leading zeroes using builtin if available. Make log_2_floor() use raw_clz() and inline log_2_floor() and log_2_ceil(). Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
* util: Rename popcount to count_1bitsBen Pfaff2013-11-191-1/+1
| | | | | | | | | | | This avoids a conflict with NetBSD's strings.h/libc. (http://netbsd.gw.com/cgi-bin/man-cgi?popcount++NetBSD-current) The new name is suggested by Ben Pfaff. Signed-off-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp> Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Jarno Rajahalme <jrajahalme@gmail.com>
* util: New function ovs_scan().Ben Pfaff2013-11-151-1/+2
| | | | | | | | | | This new function is essentially an implementation of sscanf() with slightly different behavior (see the comment) that is more convenient for Open vSwitch internal use. Also, this implementation ought to work out of the box on Windows, which has a defective sscanf() that lacks the 'hh' modifier required to scan into a char variable. Signed-off-by: Ben Pfaff <blp@nicira.com>
* socket-util: Add symlink based workaround for long pathnames.YAMAMOTO Takashi2013-10-171-2/+0
| | | | | | | | | The existing /proc workaround only works on Linux. Symlinks are more widely available. Signed-off-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp> Co-authored-by: Ben Pfaff <blp@nicira.com> Signed-off-by: Ben Pfaff <blp@nicira.com>
* lib: Add CRC32C ImplementationJoe Stringer2013-08-221-1/+1
| | | | | | | | | This implementation was derived from FreeBSD: http://svnweb.freebsd.org/base/head/sys/libkern/crc32.c Reviewed-by: Simon Horman <horms@verge.net.au> Signed-off-by: Joe Stringer <joe@wand.net.nz> Signed-off-by: Ben Pfaff <blp@nicira.com>
* util: New macros ROUND_UP_POW2, ROUND_DOWN_POW2.Ben Pfaff2013-07-171-0/+2
| | | | Signed-off-by: Ben Pfaff <blp@nicira.com>
* hindex: Fix test expected output.Ben Pfaff2013-07-161-1/+1
| | | | Signed-off-by: Ben Pfaff <blp@nicira.com>
* ovs-atomic: New library for atomic operations.Ben Pfaff2013-06-281-0/+4
| | | | | | | | This library should prove useful for the threading changes coming up. The following commit introduces one (very simple) user. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>
* hindex: New data structure for hashed multimaps.Ben Pfaff2013-06-181-0/+5
| | | | Signed-off-by: Ben Pfaff <blp@nicira.com>
* tests: Add test for Python version of long socket name workaround.Ben Pfaff2013-02-131-2/+22
| | | | | Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>
* tests: Make long name more readable by introducing a shell variable.Ben Pfaff2013-02-131-3/+4
| | | | | Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>
* tests: Make test for Linux /proc/self/fd more straightforward.Ben Pfaff2013-02-131-11/+1
| | | | | | | | | | | Presumably we can test for this Linux feature just by seeing whether the directory is there. Another goal is to shorten the code because I intend to make another copy of it in an upcoming commit, to add a similar test for Python. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>