Re: [RFC PATCH 0/4] x86: Improve Minimum Alternate Stack Size
From: H.J. Lu <hidden>
Date: 2020-10-05 21:17:46
Also in:
linux-arch, lkml
On Mon, Oct 5, 2020 at 6:45 AM Dave Martin [off-list ref] wrote:
On Tue, Sep 29, 2020 at 01:57:42PM -0700, Chang S. Bae wrote:quoted
During signal entry, the kernel pushes data onto the normal userspace stack. On x86, the data pushed onto the user stack includes XSAVE state, which has grown over time as new features and larger registers have been added to the architecture. MINSIGSTKSZ is a constant provided in the kernel signal.h headers and typically distributed in lib-dev(el) packages, e.g. [1]. Its value is compiled into programs and is part of the user/kernel ABI. The MINSIGSTKSZ constant indicates to userspace how much data the kernel expects to push on the user stack, [2][3]. However, this constant is much too small and does not reflect recent additions to the architecture. For instance, when AVX-512 states are in use, the signal frame size can be 3.5KB while MINSIGSTKSZ remains 2KB. The bug report [4] explains this as an ABI issue. The small MINSIGSTKSZ can cause user stack overflow when delivering a signal. In this series, we suggest a couple of things: 1. Provide a variable minimum stack size to userspace, as a similar approach to [5] 2. Avoid using a too-small alternate stackI can't comment on the x86 specifics, but the approach followed in this series does seem consistent with the way arm64 populates AT_MINSIGSTKSZ. I need to dig up my glibc hacks for providing a sysconf interface to this...
Here is my proposal for glibc: https://sourceware.org/pipermail/libc-alpha/2020-September/118098.html 1. Define SIGSTKSZ and MINSIGSTKSZ to 64KB. 2. Add _SC_RSVD_SIG_STACK_SIZE for signal stack size reserved by the kernel. 3. Deprecate SIGSTKSZ and MINSIGSTKSZ if _SC_RSVD_SIG_STACK_SIZE is in use. -- H.J.