Known Issues

From liblfds.org
Jump to navigation Jump to search

liblfds

  • 7th June 2016 - The porting abstraction layer for x64, with GCC versions >= 4.1.2 and < 4.7.3, is missing the LFDS720_PAL_ATOMIC_DWCAS macro, i.e. is broken and the code will not compile. This is my fault - I have a GCC in that version range, but only on MIPS32. To fix this, add the following code on line 314 of lfds710_porting_abstraction_layer_compiler.h;
#if( defined __x86_64__ )
  /* TRD : On 64 bit platforms, unsigned long long int is 64 bit, so we must manually use cmpxchg16b, 
           as the atomic intrinsics will only emit cmpxchg8b
  */

  // TRD : lfds710_pal_uint_t volatile (*destination)[2], lfds710_pal_uint_t (*compare)[2], lfds710_pal_uint_t (*new_destination)[2], enum lfds710_misc_cas_strength cas_strength, char unsigned result

  #define LFDS710_PAL_ATOMIC_DWCAS( pointer_to_destination, pointer_to_compare, pointer_to_new_destination, cas_strength, result )                             \
  {                                                                                                                                                            \
    (result) = 0;                                                                                                                                              \
                                                                                                                                                               \
    __asm__ __volatile__                                                                                                                                       \
    (                                                                                                                                                          \
      "lock;"           /* make cmpxchg16b atomic        */                                                                                                    \
      "cmpxchg16b %0;"  /* cmpxchg16b sets ZF on success */                                                                                                    \
      "setz       %4;"  /* if ZF set, set result to 1    */                                                                                                    \
                                                                                                                                                               \
      /* output */                                                                                                                                             \
      : "+m" ((pointer_to_destination)[0]), "+m" ((pointer_to_destination)[1]), "+a" ((pointer_to_compare)[0]), "+d" ((pointer_to_compare)[1]), "=q" (result)  \
                                                                                                                                                               \
      /* input */                                                                                                                                              \
      : "b" ((pointer_to_new_destination)[0]), "c" ((pointer_to_new_destination)[1])                                                                           \
                                                                                                                                                               \
      /* clobbered */                                                                                                                                          \
      :                                                                                                                                                        \
    );                                                                                                                                                         \
  }
#endif
  • 23rd June 2016 - build on MIPS64 is broken, as on that platform the #ifdefs select both the MIPS32 abstraction and the MIPS64 abstraction.
  • 17th Feburary 2017 - major bug in the unbounded, many, many queue. A bug was introduced in 7.1.0 in the code, outside of the lock-free code, which handles exponential backoff. This means that a race condition now exists where a queue can end up seemingly dequeuing an empty element when a non-empty element was expected, or an element which has already been dequeued. Release 7.1.1 fixes this bug. Full details here; http://www.liblfds.org/wordpress/?p=884

libshared

  • 31st May 2016 - The Linux kernel abstraction layer port is incomplete.

libtest

  • 18th Feburary 2017 - some test will spuriously fail if they do not complete at least one internal iteration of the data test; this has been observed on the ringbuffer write test, on ARM32, on a Raspberry Pi 2. Currently there is a performance issue with the unbounded/many/many queue on ARM32 (this was missed when 7.1.0 was released - too many bars on the bar graph!) and this in particular causes this problem on ARM32.

libbenchmark

  • 31st May 2016 - The Linux kernel abstraction layer port is incomplete.
  • 31st May 2016 - The btree test is a bit unfair - it does a bit more work as the number of logical cores increases, so as such, it is underplaying performance for higher core counts.

test

  • 31st May 2016 - If using shared object versions of liblfds libraries, cannot link on ARM32. Quite possibly not a liblfds bug, but still an issue.

benchmark

  • 31st May 2016 - If using shared object versions of liblfds libraries, cannot link on ARM32. Quite possibly not a liblfds bug, but still an issue.
  • 19th Aug 2016 - huge bug; builds using "gcc_gnumake_hosted_liblfds710_liblfds700" all crash, because some code involved in benchmark init effectively assumes NUMA. To work around this, install libnuma-devel (name varies a little by platform) and compile the "gcc_gnumake_hosted_liblfds710_liblfds700_libnuma" variant.

See Also