[lvm-devel] [BISECT] Regression: SEGV: 9156c5d dmeventd rework locking code

Zdenek Kabelac zkabelac at redhat.com
Wed Apr 5 08:05:19 UTC 2017


Dne 5.4.2017 v 01:22 Eric Wheeler napsal(a):
> On Sat, 1 Apr 2017, Zdenek Kabelac wrote:
>
>> Dne 1.4.2017 v 00:19 Eric Wheeler napsal(a):

>>> (gdb) bt
>>> #0  _touch_memory (size=<optimized out>, mem=<optimized out>) at
>>> mm/memlock.c:141
>>> #1  _allocate_memory () at mm/memlock.c:163
>>
>>
>> Hi
>>
>> Hmm few theories -  from your gdb backtrace it suggests it has failed on libc
>> syscall  (getpagesize()) ??
>> So have you upgraded all related packages ?  (device-mapper*,  kernel*)
>> or it's some 'mixture' in use ?
>>
>> Also don't you have some large/changed values of 'reserved_stack'   or
>> 'reserved_memory' in your lvm.conf ?
>
> Yes! Actually, reserved_stack was the problem. By trial and error we found
> that when reserved_stack is 290 or more, dmeventd will segfault. We tried
> on servers with far fewer logical volumes and did not have a problem, so
> while I am not going to try and figure out how many logical volumes hit
> this stack limit, this is the problem!
>
> Is there some kind of hard limit to reserved_stack that should be
> enforced?
>
> I seem to recall increasing these values because lvcreate (or lvchange or
> something) suggested that the values were too small.
>
> Do you still want a bugzilla report?


Hi

Yep - so this explains it. Not clear we need BZ yet.
I'll explain the reason of limitation.

Dmeventd is using threads - and to minimize the RAM usage by memlocked process 
with number of threads - we picked 'relatively' low value for pthread_stack 
with assumption noone will ever need bigger value than this :)

Now lvm.conf does defined 'reserved_stack' amount - and this stack is then 
'mapped' in dmeventd lvm plugin thread.  However this is after 'dmeventd' has 
created thread with 128K stack limit (dmeventd itself doesn't 'see/use' 
lvm.conf so can't create threads with different settings)

So clearly a logical problem we can't really solve in any easy way.
We limited amount of stack used by lvm2 code - so current defaults should be 
rather good enough for almost every possible use-case.

So before we start to fix this  'catch 42' case - could you check and 
eventually describe which use-case was not working well we 'default' 
reserved_stack  so you had to raise the value to 290 to make it work ?

Otherwise I think the best solution would be to simply internally limit
the 'accepted' value and ignore any higher setting and just document it.


Regards

Zdenek




More information about the lvm-devel mailing list