[Piglit] [PATCH] mingw: use default 2MB stack size instead of 1MB
Brian Paul
brianp at vmware.com
Thu Oct 12 19:19:54 UTC 2017
On 10/12/2017 12:11 PM, Jose Fonseca wrote:
> On 12/10/17 17:51, Brian Paul wrote:
>> On 10/12/2017 08:04 AM, Jose Fonseca wrote:
>>> The intent here was not so much to match the piglti MSVC build, but apps
>>> build by MSVC in general.
>>>
>>> After all, nothing ever prevented us from setting a huge stack size on
>>> both MinGW and MSVC alike, as both toolchains allow to congifure the
>>> stack size to whatever we want.
>>>
>>>
>>> The key issue here is that OpenGL driver don't get to pick the apps they
>>> are loaded, and real OpenGL applications will be likely built with MSVC
>>> instead of Mingw, and therefore will likely only have the MSVC default
>>> stack size. And we should err on the side of caution when testing.
>>>
>>>
>>> Regardless of the compiler used, if we bump the stack size in piglit,
>>> one is just increasing the chance that wasteful stack allocations go
>>> undetected on piglit and blow up on real applications.
>>>
>>>
>>> Therefore I suggest we continue to keep 1MB default, and try to fix Mesa
>>> to be less stack hungry. If that's not pratical here,
>>
>> The ir_expression::constant_expression_value() function's local vars
>> are pretty minimal. The two that stand out:
>>
>> ir_constant *op[ARRAY_SIZE(this->operands)] = { NULL, };
>> ir_constant_data data;
>>
>> are only 32 and 128 bytes, respectively (on a 32-bit build). I'm not
>> sure what else accounts for the approx 2KB of the activation record.
>>
>> I don't see an obvious way to fix the problem. Even if we could
>> reduce per-call stack memory, someone could write an evil shader that
>> adds a thousand or more terms and we'd overflow the stack again.
>
> I'm not following...
>
> If the application is malicous, it can overflow the stack without OpenGL
> driver help. We have to trust the application. After all, the opengl
> driver is in the same process.
>
> If the application is a browser, who needs to handle untrusted shaders,
> then it's the application responsibility to ensure it has enough stack
> to cope with big shaders.
>
> And for the sake of argument, if increasing stack size is the solution
> for malicious shaders, where would one stop? If increasing stack size
> is not a solution to malicous shaders, then why is it relevant to the
> discussion?
I'm just saying that if we found a way to "fix Mesa to be less stack
hungry" someone could generate a new "evil" Piglit test that'd still
breaks things. Any construct which generates a really deep IR tree and
is evaluated recursively could run out of stack space.
I wasn't thinking about it, but now that you mention malicious shaders,
we should probably consider the case of the GLSL compiler running in a
driver loaded by the X server for indirect rendering. But that's a
whole other topic.
>
>>> then we should
>>> try to bump the stack size of specific piglit tests (like those that
>>> stress the compiler to the extreme, as Cmake allows to set these options
>>> per executable), and only those tests. Or just mark the affected tests
>>> as expected fail/skip.
>>
>> The op-selection-bool-bvec4-bvec4.frag test is run with
>> shader_runner.exe. I think most of the large/complex shaders in
>> Piglit are run with shader_runner so I don't think it makes much
>> difference if only shader_runner or all piglit executables are build
>> with a 2MB stack.
>>
>> In any case, I've got a patch which only sets shader_runner's stack
>> size which I'll post next.
>>
>> I guess another option is to change the
>> op-selection-bool-bvec4-bvec4.frag test to be simpler, but that's just
>> sweeping the root problem under the rug. Someone could always craft a
>> complex shader which blows out the stack.
>
> That's fine. I'm not worried about uber shaders at all. Malicous or not.
>
> What I'm worried is that once you set the stack to 2MB, some appearently
> innocuous code somewhere in Mesa source tree (probably completely
> unrelated to GLSL for example) wastefully uses up 1MB of stack, and
> piglit does not catch the issue because all tests have 2MB of stack.
>
> And this is not hypothetical: we had several functions in Mesa related
> to writing/read/converting pixels to/from textures, eating up wasteful
> amounts of stack. And more than once real apps hit stack overflow
> because of it. I'd hate to see us increasing the stack sizes of all our
> tests, just for the same issues with real applications creeping back in.
>
> The only way I see to avoid this sort of regressions is to continue
> using the default stack, and use big stacks only when necessary, IMO.
So, is increasing the stack size for shader_runner alone to 2MB
acceptable to you?
Otherwise, the question is: can we change the default stack size at
shader_runner runtime for particular shader tests? I guess
setrlimit(RLIMIT_STACK) is an option on Linux. Not sure about Windows.
-Brian
More information about the Piglit
mailing list