[strongSwan-dev] [PATCH] log: do not acquire lock if nobody is listening

Christophe Gouault christophe.gouault at 6wind.com
Tue Apr 15 15:48:05 CEST 2014


On 04/15/2014 10:31 AM, Christophe Gouault wrote:

> On 04/14/2014 06:31 PM, Tobias Brunner wrote:
>> It seems strange that acquiring an *uncontested* read lock (the write
>> lock is only very rarely held, in your case probably never) can produce
>> such a massive overhead.  Acquiring such a lock should be possible
>> without syscall, just some atomic compare-and-swap operation should be
>> sufficient.
>
> I was also surprised by this behavior. I didn't expect spin_locks to be
> invoked on a read lock.

I had a look at the source code for pthread_rwlock_rdlock in the glibc
nptl implementation.

The implementation of pthread_rwlock_rdlock calls lll_lock to protect
critical sections within its own pthread library data structures.
__pthread_rwlock_rdlock perform several operations under this internal
lock (check flags, increment counters...). Once done, the lock is
released with lll_unlock.

The lll_lock function may call a kernel futex under contention.

This means that, even if there are only readers:

- contention may happen due to critical sections in pthread_rwlock_rdlock
- system calls may be invoked

Read locks are in fact more costly than one usually thinks.

>> Unless, of course, your architecture does not support such atomic
>> operations, hence the library has to resort to using a regular
>> (spin-)lock.  Or if the library just is not optimized very much and
>> always does this.
>>
>> It might not be a bad idea to check if there is any potential in
>> optimizing the pthread_rwlock_rdlock implementation in the pthread
>> library you are using.
>
> I am using debian's libpthread-2.13.so for x86_64. I would reasonably
> expect that it supports optimized read locks.

Regards,
Christophe


More information about the Dev mailing list