Received: by 2002:a05:6a10:6744:0:0:0:0 with SMTP id w4csp127895pxu; Tue, 6 Oct 2020 02:29:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzu1WDViNk5AIPqeEO28zao6hi5iNI4UpsZoTqpJvMhBA62pPj1OKY4X/nus/hpZ21JVGbj X-Received: by 2002:a17:906:268d:: with SMTP id t13mr463921ejc.60.1601976576451; Tue, 06 Oct 2020 02:29:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1601976576; cv=none; d=google.com; s=arc-20160816; b=pDlRsZUxyk1+02vlhUdbKTgrtGQBKvgkAY0b5jWZqpKmupXfVHBBmnpIZXS37+O9sU WlI/pTHK/9rBXXmaNH30KZfZrv06bkLtX9KDtB0YyYqmHVO8dIB/1w5shUAf1BzJ7v/N TtxfCgZJo4VgK9otihZet2r+OXd2UbRTQZDYqMedUlP8tY6QFijgVb9ceGLdqTYHBboX w+O1jVlb1QYCFk5oiOH0F4P0Q32XBbTRnt30fA7C0jLgxRmf6PA9iSqV5zF06nJMlXN/ 3NEhBlEiGgK7qaLHzjVBgg64JbGu54zyodVxIMfNt71UR3JBDXGU8xLNOeW+pJh8SFaw BQSQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:user-agent:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:from:date; bh=9XsZ1E5KtxBcBLiPaDl93p0+L7npeDQQbZlZ5SAk1r0=; b=X63YSc9nfUOYZ1TVTRD9q0gJjorKfHNmPOKoO1wcQBZCH/Kv9prk2rQRdrjyB+iBLW 4rairzvYB7WcQ9jw/b5QKAFpwQqxxbSrUZkn3hWc0EIgCx7wrVp2aLtpjxR+OweT808E POc/+aXnPUc/nnn3NMLiKV6lM5WJTWb8nBfJyLSxc0X6k7/BbTV1toLbEYvLYrbiHcEH 3tt1fX7FlXG4aGaHmWKeeneRGOwg1+Xz5UuKho79BArba+2jeXW0KfKRDUT22NpcwmGT wbojWstAv3HYg3HalAWgkpbcQTn96D7KqHP0DByR/8hXScFgLMbHBDx8WFhzX1bzGf5E J4Cg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id x9si1950814ejc.668.2020.10.06.02.29.13; Tue, 06 Oct 2020 02:29:36 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725981AbgJFJZk (ORCPT + 99 others); Tue, 6 Oct 2020 05:25:40 -0400 Received: from foss.arm.com ([217.140.110.172]:42816 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725939AbgJFJZk (ORCPT ); Tue, 6 Oct 2020 05:25:40 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id A53D7113E; Tue, 6 Oct 2020 02:25:39 -0700 (PDT) Received: from arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id A89A23F71F; Tue, 6 Oct 2020 02:25:37 -0700 (PDT) Date: Tue, 6 Oct 2020 10:25:34 +0100 From: Dave Martin To: "H.J. Lu" Cc: "Chang S. Bae" , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Andy Lutomirski , the arch/x86 maintainers , Len Brown , Dave Hansen , Michael Ellerman , Tony Luck , "Ravi V. Shankar" , GNU C Library , linux-arch , Linux API , LKML Subject: Re: [RFC PATCH 0/4] x86: Improve Minimum Alternate Stack Size Message-ID: <20201006092532.GU6642@arm.com> References: <20200929205746.6763-1-chang.seok.bae@intel.com> <20201005134534.GT6642@arm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Oct 05, 2020 at 10:17:06PM +0100, H.J. Lu wrote: > On Mon, Oct 5, 2020 at 6:45 AM Dave Martin wrote: > > > > On Tue, Sep 29, 2020 at 01:57:42PM -0700, Chang S. Bae wrote: > > > 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 stack > > > > I 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 Thanks for the link. Are there patches yet? I already had some hacks in the works, but I can drop them if there's something already out there. > 1. Define SIGSTKSZ and MINSIGSTKSZ to 64KB. Can we do this? IIUC, this is an ABI break and carries the risk of buffer overruns. The reason for not simply increasing the kernel's MINSIGSTKSZ #define (apart from the fact that it is rarely used, due to glibc's shadowing definitions) was that userspace binaries will have baked in the old value of the constant and may be making assumptions about it. For example, the type (char [MINSIGSTKSZ]) changes if this #define changes. This could be a problem if an newly built library tries to memcpy() or dump such an object defined by and old binary. Bounds-checking and the stack sizes passed to things like sigaltstack() and makecontext() could similarly go wrong. > 2. Add _SC_RSVD_SIG_STACK_SIZE for signal stack size reserved by the kernel. How about "_SC_MINSIGSTKSZ"? This was my initial choice since only the discovery method is changing. The meaning of the value is exactly the same as before. If we are going to rename it though, it could make sense to go for something more directly descriptive, say, "_SC_SIGNAL_FRAME_SIZE". The trouble with including "STKSZ" is that is sounds like a recommendation for your stack size. While the signal frame size is relevant to picking a stack size, it's not the only thing to consider. Also, do we need a _SC_SIGSTKSZ constant, or should the entire concept of a "recommended stack size" be abandoned? glibc can at least make a slightly more informed guess about suitable stack sizes than the kernel (and glibc already has to guess anyway, in order to determine the default thread stack size). > 3. Deprecate SIGSTKSZ and MINSIGSTKSZ if _SC_RSVD_SIG_STACK_SIZE > is in use. Great if we can do it. I was concerned that this might be controversial. Would this just be a recommendation, or can we enforce it somehow? Cheers ---Dave