100% CPU with multithread real time on StaticSpinMutex::LockSlow
Hello. At work, we build our software with g++ 4.9.1 and AddressSanitizer and C++11. We run this software on a PREEMPT RT kernel (currently 3.18.21-rt19). Our software has several thread scheduled by FIFO and sometimes the thread with most priority use almost 100% CPU. I suspect this thread trying to lock the StaticSpinMutex in infinite loop while it's already locked by another thread with less real time priority. Does it seems plausible? Do you know any issue that could be related, maybe already closed?
I put both end of backtraces so you can look at it. Realtime thread scheduled by FIFO with priority 35 : #0 0xb15abb0a in __memset_sse2_rep () from /lib/libc.so.6 #1 0xb1cff49d in __asan::PoisonShadow(unsigned long, unsigned long, unsigned char) () from /lib/libasan.so.1 #2 0xb1cc99c7 in __sanitizer::SizeClassAllocator32<0ul, 4294967296ull, 16ul, __sanitizer::SizeClassMap<17ul, 64ul, 14ul>, 20ul, __sanitizer::FlatByteMap<4096ull>, __asan::AsanMapUnmapCallback>::Alloca---Type to continue, or q to quit---
teBatch(_sanitizer::AllocatorStats, __sanitizer::SizeClassAllocatorLocalCache<__sanitizer::SizeClassAllocator32<0ul, 4294967296ull, 16ul, __sanitizer::SizeClassMap<17ul, 64ul, 14ul>, 20ul, __sanitizer::FlatByteMap<4096ull>, _asan::AsanMapUnmapCallback> >, unsigned long) () from /lib/libasan.so.1 #3 0xb1cc9e0f in __sanitizer::SizeClassAllocatorLocalCache<__sanitizer::SizeClassAllocator32<0ul, 4294967296ull, 16ul, __sanitizer::SizeClassMap<17ul, 64ul, 14ul>, 20ul, __sanitizer::FlatByteMap<4096ull>, __asan::AsanMapUnmapCallback> >::Refill(__sanitizer::SizeClassAllocator32<0ul, 4294967296ull, 16ul, __sanitizer::SizeClassMap<17ul, 64ul, 14ul>, 20ul, __sanitizer::FlatByteMap<4096ull>, __asan::AsanMapUnmapCallback>, unsigned long) () from /lib/libasan.so.1 #4 0xb1cc8c05 in __asan::Allocate(unsigned long, unsigned long, __sanitizer::StackTrace, __asan::AllocType, bool) () from /lib/libasan.so.1 #5 0xb1cfeb70 in operator new(unsigned int) () from /lib/libasan.so.1
Realtime thread scheduled by FIFO with priority 40 : #0 0xb21b49e4 in __kernel_vsyscall () #1 0xb1569837 in syscall () from /lib/libc.so.6 #2 0xb1d0afb9 in __sanitizer::internal_sched_yield() () from /lib/libasan.so.1 #3 0xb1cc97c0 in __sanitizer::StaticSpinMutex::LockSlow() () from /lib/libasan.so.1 #4 0xb1cc9908 in __sanitizer::SizeClassAllocator32<0ul, 4294967296ull, 16ul, __sanitizer::SizeClassMap<17ul, 64ul, 14ul>, 20ul, __sanitizer::FlatByteMap<4096ull>, __asan::AsanMapUnmapCallback>::AllocateBatch(_sanitizer::AllocatorStats, __sanitizer::SizeClassAllocatorLocalCache<__sanitizer::SizeClassAllocator32<0ul, 4294967296ull, 16ul, __sanitizer::SizeClassMap<17ul, 64ul, 14ul>, 20ul, __sanitizer::FlatByteMap<4096ull>, _asan::AsanMapUnmapCallback> >, unsigned long) () from /lib/libasan.so.1 #5 0xb1cc9e0f in __sanitizer::SizeClassAllocatorLocalCache<__sanitizer::SizeClassAllocator32<0ul, 4294967296ull, 16ul, __sanitizer::SizeClassMap<17ul, 64ul, 14ul>, 20ul, __sanitizer::FlatByteMap<4096ull>, __asan::AsanMapUnmapCallback> >::Refill(__sanitizer::SizeClassAllocator32<0ul, 4294967296ull, 16ul, __sanitizer::SizeClassMap<17ul, 64ul, 14ul>, 20ul, __sanitizer::FlatByteMap<4096ull>, __asan::AsanMapUnmapCallback>, unsigned long) () from /lib/libasan.so.1 #6 0xb1cc8c05 in __asan::Allocate(unsigned long, unsigned long, __sanitizer::StackTrace, __asan::AllocType, bool) () from /lib/libasan.so.1 #7 0xb1cfeb70 in operator new(unsigned int) () from /lib/libasan.so.1
Source: google/sanitizers