On Tue, Mar 24, 2015 at 11:35:30AM -0500, Steven Munroe wrote:
On Tue, 2015-03-24 at 12:19 +0000, Richard W.M. Jones wrote:
> For the OCaml packages on ppc64/ppc64le, we keep having bugs like this
> one:
https://bugzilla.redhat.com/show_bug.cgi?id=1204876
>
> The OCaml compiler is quite recursive, and so it can easily overflow
> the default stack. For reasons that are not entirely clear this
> happens only on ppc64/ppc64le (not on x86 or aarch64). Perhaps POWER
> stack frames are bigger, or the default stack size is smaller.
>
The default thread stack is 8MB-64KB plus a 64KB guard page. PPC uses a
64K default page size.
So there are two possible problems:
1) running into the guard page for a single thread.
2) the sum of all thread stacks exceeds the ulimit -s
The OCaml compiler is single threaded AFAIK.
If changing the ulimit -s solves the problem the sum of all thread
stacks has exceeded the ulimit.
If in cases where increasing the ulimit -s to unlimited does no help
then you have at least one thread that has overflowed the default stack.
Power has lots of registers (32x64b GPRs + 32x64b FPRs + 32x128b VRs) so
we are likely to need a bigger stack frame at each level. The minimums
are 112 bytes for ELF V1 ABI (PPC64BE) and 48 for ELF V2 ABI (PPC64LE),
but any interesting function will need additional space to spill
non-volatiles across function calls and store any local variables.
You (ocaml runtime) can control the stack size on a per thread basis via
pthread_attr_setstack().
I am not sure how ocaml is generating code for PPC64, you could look in
to split stack support,
OCaml uses its own code generator. However the description of
-fsplit-stack from GCC sounds interesting. Are there any more details
of how exactly it works? Does it catch the segfault from hitting the
guard page and do something clever?
but at this time GCC does not implement split
stack.
Did you mean "does implement"? GCC 5 documents it at least ...
Rich.
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
Read my programming and virtualization blog:
http://rwmj.wordpress.com
virt-p2v converts physical machines to virtual machines. Boot with a
live CD or over the network (PXE) and turn machines into KVM guests.
http://libguestfs.org/virt-v2v