Advice requested for fixing issue 17914
Nemanja Boric
4burgos at gmail.com
Wed Oct 25 15:48:10 UTC 2017
On Wednesday, 25 October 2017 at 15:43:12 UTC, Steven
Schveighoffer wrote:
> On 10/25/17 11:27 AM, Nemanja Boric wrote:
>> On Wednesday, 25 October 2017 at 15:22:18 UTC, Nemanja Boric
>> wrote:
>>> On Wednesday, 25 October 2017 at 15:12:27 UTC, Nemanja Boric
>>> wrote:
>>>> On Wednesday, 25 October 2017 at 14:19:14 UTC, Jonathan M
>>>> Davis wrote:
>>>>> On Wednesday, October 25, 2017 09:26:26 Steven
>>>>> Schveighoffer via Digitalmars-d wrote:
>>>>>> [...]
>>>>>
>>>>> Maybe there was a change in the OS(es) being used that
>>>>> affected the limit?
>>>>>
>>>>> - Jonathan M Davis
>>>>
>>>> Yes, the stack is not immediately unmapped because it's very
>>>> common
>>>> just to reset the fiber and reuse it for handling the new
>>>> connection -
>>>> creating new fibers (and doing unmap on termination) is a
>>>> problem in the
>>>> real life (as this is as well).
>>>>
>>>> At sociomantic we already had this issue:
>>>> https://github.com/sociomantic-tsunami/tangort/issues/2
>>>> Maybe this is the way to go - I don't see a reason why every
>>>> stack should be mmaped separately.
>>>
>>> I'm not sure that would allow us to mprotect the page guards,
>>> though.
>>
>> I think the easiest way to proceed from here is to default the
>> stack protection page to 0, so we avoid this regression. Once
>> that's in, we can think about different allocation strategy
>> for the fiber's stacks or throwing the exceptions on too many
>> fibers (too bad mmap doesn't return error code, but you get
>> SIGABRT instead :( )
>
> mmap does return an error. And onOutMemoryError is called when
> it fails.
>
> https://github.com/dlang/druntime/blob/master/src/core/thread.d#L4518
>
> Which should throw an error:
>
> https://github.com/dlang/druntime/blob/144c9e6e9a3c00aba82b92da527a52190fe91c97/src/core/exception.d#L542
>
> however, when mprotect fails, it calls abort():
>
> https://github.com/dlang/druntime/blob/master/src/core/thread.d#L4540
>
>> What do you think?
>
> I think we should reverse the mprotect default, and try and
> determine a better way to opt-in to the limit.
>
> Is this a Linux-specific problem? Are there issues with
> mprotect on other OSes? Or is Linux the only OS that supports
> mprotect?
>
> -Steve
Reading FreeBSD man pages, it looks like at least FreeBSD has the
same limitation in the mmap, but the man pages for the mprotect
doesn't specify this. However, I believe it's just the issue in
the man pages, as it would be the same thing really as with
Linux. Linux's manpage for mprotect specifically says this:
> ENOMEM Changing the protection of a memory region would
> result in the
total number of mappings with distinct attributes
(e.g., read
versus read/write protection) exceeding the allowed
maximum.
(For example, making the protection of a range
PROT_READ in
the middle of a region currently protected as
PROT_READ|PROT_WRITE would result in three
mappings: two
read/write mappings at each end and a read-only
mapping in the
middle.)
so I was right about doubling the mappings.
> > I think we should reverse the mprotect default, and try and
> determine a better way to opt-in to the limit.
I agree: https://github.com/dlang/druntime/pull/1956
More information about the Digitalmars-d
mailing list