Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1092949pxb; Sun, 21 Feb 2021 11:11:45 -0800 (PST) X-Google-Smtp-Source: ABdhPJwETwN1BDLxmjZpdp/8rqbmhmHgf4rilyGeqtiArtp6v/H2AwJJlypzS2nfad2FmFIlvvIL X-Received: by 2002:a17:906:e19:: with SMTP id l25mr16460607eji.20.1613934705365; Sun, 21 Feb 2021 11:11:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1613934705; cv=none; d=google.com; s=arc-20160816; b=o/5znov4+AVuAhQrp4L19v2G0KRLddxwOVd48fc3I9UWozeDM9f/D9r7YJWfzcAyMy OEbHq+EuEQM7nojFutF9LTpcaoOlic7mCDGUyCe1xESwkVy2W4uBhzyGaePdnw/4nGbv tdNvHqKaUGz/vGBk8B0Rs4VZj0OgBCYGHlrvbEMdSkNAsb+eLMPcUi8CWUGtwKbOJKeb Iu1vWi5Fz8QFcq8d0wiL+hI4oxW8yXAyCEENktX4w0I2Xo5FDsItIMszeHhskKVZD3QU ZweSq1hheMm5PW79Ko8Y1LLItpYVfYM+PZEtPYJG1LxbuFvCwcpcon5PslH9ej69RXho xXuA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:ironport-sdr:ironport-sdr; bh=hr3RwTIG0PRmWIjzOi3RdJROcHh6DqqmjhVr+A3aqMk=; b=GJ/0uR90+3P/9PKu3HXcp1pOksEcoNKqEmTIQUMfIJ3kOERXx8h+lQ4//exUlc22Jl rK78wwXvM6ek1WrYqDHi8JFIZhwle3HheYGPN4rzasYOBUNwTe0Ss/g9NsZie3rUgk7v mFlciJWO5YpKAwyyBcEaPz35HSDjwkuQW/CPGhj9DYaC3SsuyUo6KFcHqe4cnbdyjmRc xCMqvnV4rkpvx2E4kK7xxynOUrRc9GEj0LAvlUmVo5t2CZbOBce/A1CXgiQzgXt55DSL F67AkDNwwfA7l3/cFGBs1fuCMJehH/QOV8WOCz6KRHSVqSpXCJSgo1fzU64+B8h7xTIF VwSg== 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=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bs2si9533157edb.459.2021.02.21.11.11.23; Sun, 21 Feb 2021 11:11:45 -0800 (PST) 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=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230458AbhBUTIc (ORCPT + 99 others); Sun, 21 Feb 2021 14:08:32 -0500 Received: from mga07.intel.com ([134.134.136.100]:53159 "EHLO mga07.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230494AbhBUTCy (ORCPT ); Sun, 21 Feb 2021 14:02:54 -0500 IronPort-SDR: Yl6MvMmXhr/R0ymCVEEEPv12ghG7K3Kx1XuHw/hSHt5RtBuaU4Px+eX3wL7Y61Tjq4X/zdJamy 83dxijdcCsWA== X-IronPort-AV: E=McAfee;i="6000,8403,9902"; a="248330336" X-IronPort-AV: E=Sophos;i="5.81,195,1610438400"; d="scan'208";a="248330336" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Feb 2021 11:01:29 -0800 IronPort-SDR: +SSKlxcFeCzaDrYZnsGUhFio2Qjl2wWWV8oSe2FjNHOdzQxyeLwcyhf2Sx/3Wc2lAWgPrSHZbs prsDzTOE/scw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.81,195,1610438400"; d="scan'208";a="429792146" Received: from chang-linux-3.sc.intel.com ([172.25.66.175]) by FMSMGA003.fm.intel.com with ESMTP; 21 Feb 2021 11:01:29 -0800 From: "Chang S. Bae" To: bp@suse.de, luto@kernel.org, tglx@linutronix.de, mingo@kernel.org, x86@kernel.org Cc: len.brown@intel.com, dave.hansen@intel.com, jing2.liu@intel.com, ravi.v.shankar@intel.com, linux-kernel@vger.kernel.org, chang.seok.bae@intel.com, linux-kselftest@vger.kernel.org Subject: [PATCH v4 21/22] x86/fpu/xstate: Support dynamic user state in the signal handling path Date: Sun, 21 Feb 2021 10:56:36 -0800 Message-Id: <20210221185637.19281-22-chang.seok.bae@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210221185637.19281-1-chang.seok.bae@intel.com> References: <20210221185637.19281-1-chang.seok.bae@intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Entering a signal handler, the kernel saves xstate in signal frame. The dynamic user state is better to be saved only when used. fpu->state_mask can help to exclude unused states. Returning from a signal handler, XRSTOR re-initializes the excluded state components. Add a test case to verify in the signal handler that the signal frame excludes AMX data when the signaled thread has initialized AMX state. Signed-off-by: Chang S. Bae Reviewed-by: Len Brown Cc: x86@kernel.org Cc: linux-kernel@vger.kernel.org Cc: linux-kselftest@vger.kernel.org --- Changes from v3: * Removed 'no functional changes' in the changelog. (Borislav Petkov) Changes from v1: * Made it revertable (moved close to the end of the series). * Included the test case. --- arch/x86/include/asm/fpu/internal.h | 2 +- tools/testing/selftests/x86/amx.c | 66 +++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/fpu/internal.h b/arch/x86/include/asm/fpu/internal.h index c467312d38d8..090eb5bb277b 100644 --- a/arch/x86/include/asm/fpu/internal.h +++ b/arch/x86/include/asm/fpu/internal.h @@ -354,7 +354,7 @@ static inline void copy_kernel_to_xregs(struct xregs_state *xstate, u64 mask) */ static inline int copy_xregs_to_user(struct xregs_state __user *buf) { - u64 mask = xfeatures_mask_user(); + u64 mask = current->thread.fpu.state_mask; u32 lmask = mask; u32 hmask = mask >> 32; int err; diff --git a/tools/testing/selftests/x86/amx.c b/tools/testing/selftests/x86/amx.c index f4ecdfd27ae9..a7386b886532 100644 --- a/tools/testing/selftests/x86/amx.c +++ b/tools/testing/selftests/x86/amx.c @@ -650,6 +650,71 @@ static void test_ptrace(void) test_tile_state_write(ptracee_loads_tiles); } +/* Signal handling test */ + +static int sigtrapped; +struct tile_data sig_tiles, sighdl_tiles; + +static void handle_sigtrap(int sig, siginfo_t *info, void *ctx_void) +{ + ucontext_t *uctxt = (ucontext_t *)ctx_void; + struct xsave_data xdata; + struct tile_config cfg; + struct tile_data tiles; + u64 header; + + header = __get_xsave_xstate_bv((void *)uctxt->uc_mcontext.fpregs); + + if (header & (1 << XFEATURE_XTILE_DATA)) + printf("[FAIL]\ttile data was written in sigframe\n"); + else + printf("[OK]\ttile data was skipped in sigframe\n"); + + set_tilecfg(&cfg); + load_tilecfg(&cfg); + init_xdata(&xdata); + + make_tiles(&tiles); + copy_tiles_to_xdata(&xdata, &tiles); + restore_xdata(&xdata); + + save_xdata(&xdata); + if (compare_xdata_tiles(&xdata, &tiles)) + err(1, "tile load file"); + + printf("\tsignal handler: load tile data\n"); + + sigtrapped = sig; +} + +static void test_signal_handling(void) +{ + struct xsave_data xdata = { 0 }; + struct tile_data tiles = { 0 }; + + sethandler(SIGTRAP, handle_sigtrap, 0); + sigtrapped = 0; + + printf("[RUN]\tCheck tile state management in handling signal\n"); + + printf("\tbefore signal: initial tile data state\n"); + + raise(SIGTRAP); + + if (sigtrapped == 0) + err(1, "sigtrap"); + + save_xdata(&xdata); + if (compare_xdata_tiles(&xdata, &tiles)) { + printf("[FAIL]\ttile data was not loaded at sigreturn\n"); + nerrs++; + } else { + printf("[OK]\ttile data was re-initialized at sigreturn\n"); + } + + clearhandler(SIGTRAP); +} + int main(void) { /* Check hardware availability at first */ @@ -672,6 +737,7 @@ int main(void) test_fork(); test_context_switch(); test_ptrace(); + test_signal_handling(); return nerrs ? 1 : 0; } -- 2.17.1