From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0DC56C46CD2 for ; Tue, 2 Jan 2024 11:16:56 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 90E4B6B007E; Tue, 2 Jan 2024 06:16:56 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 8BDE66B0081; Tue, 2 Jan 2024 06:16:56 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 75D9B6B0082; Tue, 2 Jan 2024 06:16:56 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 627646B007E for ; Tue, 2 Jan 2024 06:16:56 -0500 (EST) Received: from smtpin26.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 2EFB816076E for ; Tue, 2 Jan 2024 11:16:56 +0000 (UTC) X-FDA: 81634118832.26.93E7C60 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf23.hostedemail.com (Postfix) with ESMTP id 3DE5014001E for ; Tue, 2 Jan 2024 11:16:54 +0000 (UTC) Authentication-Results: imf23.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=rKmx+O3G; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf23.hostedemail.com: domain of chenhuacai@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=chenhuacai@kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1704194214; a=rsa-sha256; cv=none; b=QNMZ2WyF26bHoR3MD/H4tb1LTR9h9Td8SyjmzysFi3Y+pjqA8NMFp1rQQM0rCCGc8rzdex gn9OScaaXfzHS3sMR2o7MEiuyGxm2Fjo34QHj+YutYaUdzyEC/y3aDMVAe7Kl7CG2DmvwW T911D1dyNW6WcIJm1ykWrzmTqjIm3KI= ARC-Authentication-Results: i=1; imf23.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=rKmx+O3G; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf23.hostedemail.com: domain of chenhuacai@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=chenhuacai@kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1704194214; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=ZnJwVDvjRupAlgztJKJPO9rm+AOYU0WF1cQQZkrOyhw=; b=jd6E7kyoXCEZI62PZ28r2EmzM/1K/dqIw8lkG+0a94k1QpGjE1xTFukh331sEh//nN6IuJ /sGLBu6o289enPg2tKc6+fnmL/qkhHdSNG2AO/osnKBhDr78HszNfQqpRzSCsxL4JkIbDO t8SCENsn58MalxkhFLZ4VmBweUbhMw8= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id 4EBC260FBC for ; Tue, 2 Jan 2024 11:16:53 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id AAEC3C433CC for ; Tue, 2 Jan 2024 11:16:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1704194212; bh=wH3UN+QEBeHo1CxZ6/L0nHaYUK8LzrtPCHlYvTqoAPQ=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=rKmx+O3G4u6tD/av1MVTGyVxCkd2s7aCJQMOAf5BmsZGJ2kac2aZZOirU3ltVF+xU BY2I1h4URbBV3ME3JYpYc/Lk7bneh1cTHtl6Qjv0k9fveNELZ6dSabLVupVUgQi3Hm sMXBGCCQsdVSeBQyp7+t9TNe9aI6HfuXY7p/xYhIwrJ6crJV6QVhWkeTMuJQqbkz5q sNLGt01zACtu7LZBl3P9NyS6Shd9TJ938UU64KsL9R/gGuwdsjdxkjo2BMlmmEtZxT PcdBKIAk2mDsoUuSm9isVjYr0aLeufNAyB6JCuGJSB7EoKW1+QfFl/s3toWaFJeDEr ubPjbOhP1PLVw== Received: by mail-ed1-f43.google.com with SMTP id 4fb4d7f45d1cf-5563944b3dfso1467787a12.3 for ; Tue, 02 Jan 2024 03:16:52 -0800 (PST) X-Gm-Message-State: AOJu0YwxmDUrZ8MKmKcCgBoAFQ9Wof+/pBfMJGBY0r38B+4Z9cZXKi+p begXzeJS1E8xXskfdQp2NpaQymNvDTnOVW+S6D4= X-Google-Smtp-Source: AGHT+IGz8iOixHSCpJ0lYL7fIB2qzRVNbPRM/W2vZAG0Y741XUSxrPBDI1OQCXvTMipu+vnICAmP15DLX+1P3yL2QZM= X-Received: by 2002:a17:907:61a2:b0:a26:8ee9:9b31 with SMTP id mt34-20020a17090761a200b00a268ee99b31mr708210ejc.4.1704194211016; Tue, 02 Jan 2024 03:16:51 -0800 (PST) MIME-Version: 1.0 References: <20240102101711.10872-2-xry111@xry111.site> In-Reply-To: <20240102101711.10872-2-xry111@xry111.site> From: Huacai Chen Date: Tue, 2 Jan 2024 19:16:43 +0800 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v2] LoongArch: Fix and simplify fcsr initialization on execve To: Xi Ruoyao Cc: WANG Xuerui , Eric Biederman , Kees Cook , Tiezhu Yang , Jinyang He , Jiaxun Yang , loongarch@lists.linux.dev, linux-mm@kvack.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 3DE5014001E X-Stat-Signature: oqzmn5jqzfeh36t7p53txwu9nqhkaaw3 X-HE-Tag: 1704194214-9605 X-HE-Meta: U2FsdGVkX19o3zZ8vMgLLJjpl6GudfmM1HuP7BUYBe2xxlFbDEzPdVVzquJ5zIerKGuI+vcAf/TgldnmgL0mvXyXQchB7Rs1N5btyRAooAkE2f1fiqP0q0mDmmCfeSvLMB7UswunkCLn58Z5NJIDfZ6/RBdTWOclDDIJ4JYI5i3grn+9rhVENjvyoiNUjlCFYnwCccEw1WHHjsmVin8fjet+a07rVTE4kFvkcDMLy+3EsxCjSuhb9JwHMd3DdrlLasThCv740i00NH3NJ8YAiw7l5MH/WCdwwvZ+v19cP2oh8kBli1RGG2Jaclu7A99MPbjxHIM29lMSKrdE5PIZAUusErFhjjmmIl/cPepJ9uZ8CYCoXym6Wy0ZjqqpIbcwk3xaItDJM0kdZcRrE/BIi5GcWrLd804bFz62mM6KyPx0cDmdkYs7luiwtsD4InAkt5SVciG34JCh6kM781655y8v79xHRV3iawfndhUgj+mupRgVHoGZu26F3kROF1qp6j1Ku8C+kTKgJHGZIHBSMiPdS11j0PisuiIcPrUhFWZr0z9i2/2dHHdVkQANrwIpb49cMyY8RfW6Akh4/AVi8jMQeak3yUnXpB7EP5qDI4LsUZHi0Mqrj6sPsYFUKkg5K9pVCNAKksBvBvOAV3v3Xj3A72rhIxEaeqqN1Qb8uvCd+sEX3EYmuqMnUmGzhw6j7F5IbMEv3NfQpciulHdHl2054wZMTc/NkSv35sbF7RJ4AmbXBAwmuzlxCB1fDQ6jU46iB7IliR9r8E5KHJ7fPa/L1W8cKJBX5cN0/BHgUc6lAcvS9Nv7d1rbwsMnYYml4szFbeg1hO2HImrXtkwIUNd8jEvy48nR9RTkcQBTbXprELMUMf3+gAiuqo3ENU+4HSlVZ2N9JWDniK6acFqWmeeqeHCC3vKNRkW1W0XNhtzGmaQ3oeyBWlt1+ZZJMy0ALUsuG23xsPHM0+ivJ3f LF1xPDSc ImMdDtxh2Y5/9kRvA7Be+bFeu6NUpq/OiF9qyn3AHVdBONVMn7ewKCUmEa8dFOBqs+pBxe5fmPtAJRydovPW4cQ7k60bjXDguUwBnLdsGzGQGqvcmUWBnSgwew+XUU4EH6b044Jrvt/Nxk8FRvmy9szXdJLPpicocU9VqXz2q7drME40TZ5qs7Q58TplIiOvzropVF60xtWzh/cdtu1oHvoCW0Yp8cfZXlxqCM0S3DhoGxOzKH8i+dY88/YjI8ZeL1ezQeAczvwCBLVqx/drp90MittCgWAis7zIpiGBcdc31pfo= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On Tue, Jan 2, 2024 at 6:17=E2=80=AFPM Xi Ruoyao wrote= : > > There has been a lingering bug in LoongArch Linux systems causing some > GCC tests to intermittently fail (see Closes link). I've made a minimal > reproducer: > > zsh% cat measure.s > .align 4 > .globl _start > _start: > movfcsr2gr $a0, $fcsr0 > bstrpick.w $a0, $a0, 16, 16 > beqz $a0, .ok > break 0 > .ok: > li.w $a7, 93 > syscall 0 > zsh% cc mesaure.s -o measure -nostdlib > zsh% echo $((1.0/3)) > 0.33333333333333331 > zsh% while ./measure; do ; done > > This while loop should not stop as POSIX is clear that execve must set > fenv to the default, where FCSR should be zero. But in fact it will > just stop after running for a while (normally less than 30 seconds). > Note that "$((1.0/3))" is needed to reproduce the issue because it > raises FE_INVALID and makes fcsr0 non-zero. > > The problem is we are relying on SET_PERSONALITY2 to reset > current->thread.fpu.fcsr. But SET_PERSONALITY2 is executed before > start_thread which calls lose_fpu(0). We can see if kernel preempt is > enabled, we may switch to another thread after SET_PERSONALITY2 but > before lose_fpu(0). Then bad thing happens: during the thread switch > the value of the fcsr0 register is stored into current->thread.fpu.fcsr, > making it dirty again. > > The issue can be fixed by setting current->thread.fpu.fcsr after > lose_fpu(0) because lose_fpu clears TIF_USEDFPU, then the thread > switch won't touch current->thread.fpu.fcsr. > > The only other architecture setting FCSR in SET_PERSONALITY2 is MIPS. > They do this for supporting different FP flavors (NaN encodings etc). > which do not exist on LoongArch. I'm not sure how MIPS evades the issue > (or maybe it's just buggy too) but I'll investigate it later. You have already investigated it, so should this message be updated? Huacai > > For LoongArch, just remove the current->thread.fpu.fcsr setting from > SET_PERSONALITY2 and do it in start_thread, after lose_fpu(0). > > The while loop failing with the mainline kernel has survived one hour > after this change. > > Closes: https://github.com/loongson-community/discussions/issues/7 > Fixes: 803b0fc5c3f2 ("LoongArch: Add process management") > Cc: stable@vger.kernel.org > Signed-off-by: Xi Ruoyao > --- > > v1 -> v2: > - Still set current->thread.fpu.fcsr to boot_cpu_data.fpu_csr0 instead > of constant 0. > > arch/loongarch/include/asm/elf.h | 5 ----- > arch/loongarch/kernel/elf.c | 5 ----- > arch/loongarch/kernel/process.c | 1 + > 3 files changed, 1 insertion(+), 10 deletions(-) > > diff --git a/arch/loongarch/include/asm/elf.h b/arch/loongarch/include/as= m/elf.h > index 9b16a3b8e706..f16bd42456e4 100644 > --- a/arch/loongarch/include/asm/elf.h > +++ b/arch/loongarch/include/asm/elf.h > @@ -241,8 +241,6 @@ void loongarch_dump_regs64(u64 *uregs, const struct p= t_regs *regs); > do { \ > current->thread.vdso =3D &vdso_info; = \ > \ > - loongarch_set_personality_fcsr(state); \ > - \ > if (personality(current->personality) !=3D PER_LINUX) = \ > set_personality(PER_LINUX); \ > } while (0) > @@ -259,7 +257,6 @@ do { = \ > clear_thread_flag(TIF_32BIT_ADDR); \ > \ > current->thread.vdso =3D &vdso_info; = \ > - loongarch_set_personality_fcsr(state); \ > \ > p =3D personality(current->personality); = \ > if (p !=3D PER_LINUX32 && p !=3D PER_LINUX) = \ > @@ -340,6 +337,4 @@ extern int arch_elf_pt_proc(void *ehdr, void *phdr, s= truct file *elf, > extern int arch_check_elf(void *ehdr, bool has_interpreter, void *interp= _ehdr, > struct arch_elf_state *state); > > -extern void loongarch_set_personality_fcsr(struct arch_elf_state *state)= ; > - > #endif /* _ASM_ELF_H */ > diff --git a/arch/loongarch/kernel/elf.c b/arch/loongarch/kernel/elf.c > index 183e94fc9c69..0fa81ced28dc 100644 > --- a/arch/loongarch/kernel/elf.c > +++ b/arch/loongarch/kernel/elf.c > @@ -23,8 +23,3 @@ int arch_check_elf(void *_ehdr, bool has_interpreter, v= oid *_interp_ehdr, > { > return 0; > } > - > -void loongarch_set_personality_fcsr(struct arch_elf_state *state) > -{ > - current->thread.fpu.fcsr =3D boot_cpu_data.fpu_csr0; > -} > diff --git a/arch/loongarch/kernel/process.c b/arch/loongarch/kernel/proc= ess.c > index 767d94cce0de..3f9cae615f52 100644 > --- a/arch/loongarch/kernel/process.c > +++ b/arch/loongarch/kernel/process.c > @@ -92,6 +92,7 @@ void start_thread(struct pt_regs *regs, unsigned long p= c, unsigned long sp) > clear_used_math(); > regs->csr_era =3D pc; > regs->regs[3] =3D sp; > + current->thread.fpu.fcsr =3D boot_cpu_data.fpu_csr0; > } > > void flush_thread(void) > -- > 2.43.0 >