Can anyone help to shed the light on mysterious bug in SBCL (probably)?
Vasily Postnicov
shamaz.mazum at gmail.com
Mon Apr 14 22:33:22 PDT 2014
2014-04-14 20:50 GMT+04:00 Matthew Dillon <dillon at apollo.backplane.com>:
>
> :Hello. I use DragonFlyBSD on x86-64 machine:
> :
> :Fatal error 'Cannot allocate red zone for initial thread' at line 275 in
> :file /usr/src/lib/libthread_xu/thread/thr_init.c (errno = 12)
>
> Hmm. It sounds like the threading system is being started late.
> What is happening is that the main program has already allocated stack
> past the initial thread stack size before trying to start the pthreads
> subsystem. This is a lot of space... 2MB or so. I don't know why it
> is doing that.
>
> Either that or some part of SBCL did some specific mmap()'s into
> the user stack space which it should not have done. It is one of those
> two things.
>
> Here is something to try real quick as a patch to libthread_xu. It
> requires DragonFly sources in /usr/src (if you haven't already) to test
> this:
>
> cd /usr/src/lib/libthread_xu
>
> Change THR_STACK_INITIAL from THR_STACK_DEFAULT * 2 to
> THR_STACK_DEFAULT * 4 in thread/thr_private.h.
>
> Then recompile libthread_xu:
>
> cd /usr/srclib/libthread_xu
> make clean
> make obj
> make clean
> make -j 4
> make install
>
> If that doesn't work then try * 8... I don't know how much stack lisp
> is trying to use. The default 2MB is already a lot. So if it still
> doesn't work then it must be trying to do specific mmap()'s into the
> user stack area which the program should definitely not be doing.
>
> -Matt
>
>
Hello, Matt. I've tried to increase the stack size as you said (multiplying
by 4, 8 and even 512), but no luck. SBCL allocates memory for lisp objects
by calling to os_validate which is a wrapper around mmap. I modified it to
be more verbose:
os_vm_address_t
os_validate(os_vm_address_t addr, os_vm_size_t len)
{
int flags = MAP_PRIVATE | MAP_ANON;
if (addr)
flags |= MAP_TRYFIXED;
addr = mmap(addr, len, OS_VM_PROT_ALL, flags, -1, 0);
if (addr == MAP_FAILED) {
perror("mmap");
return NULL;
}
printf ("====== OS_VALIDATE: allocated %li bytes at 0x%08lx ======\n",
len, addr);
return addr;
}
Here is the output:
http://pastebin.com/n4Bng5MJ
The minimal mapped address is 0x20000000 which is a beginning of lisp
"readonly and static" spaces (sbcl/src/compiler/generic/parms.lisp), the
maximal address is 0x100a818000 which is a lisp heap. There is another
region starting at 0x80067c000 which is a lisp stack (it has its own),
according to LDB (built-in SBCL debugger). So, as it seems, SBCL does not
interfere with C stack. I think ktrace may be helpful, I will write if I
find something.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.dragonflybsd.org/pipermail/users/attachments/20140415/3bd35c55/attachment-0002.html>
More information about the Users
mailing list