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 B1D84EB64DD for ; Wed, 26 Jul 2023 02:59:18 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2EB2C8D0001; Tue, 25 Jul 2023 22:59:18 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 299FD6B0078; Tue, 25 Jul 2023 22:59:18 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 164D58D0001; Tue, 25 Jul 2023 22:59:18 -0400 (EDT) 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 038A06B0075 for ; Tue, 25 Jul 2023 22:59:18 -0400 (EDT) Received: from smtpin27.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id A807640CBB for ; Wed, 26 Jul 2023 02:59:17 +0000 (UTC) X-FDA: 81052256754.27.141207E Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by imf19.hostedemail.com (Postfix) with ESMTP id 9D68A1A0004 for ; Wed, 26 Jul 2023 02:59:13 +0000 (UTC) Authentication-Results: imf19.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf19.hostedemail.com: domain of hejinyang@loongson.cn designates 114.242.206.163 as permitted sender) smtp.mailfrom=hejinyang@loongson.cn ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1690340354; 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; bh=7AjcNNEMn+/GPN1Dc3n/ESxovlmarP5rKOHYISd4E8E=; b=53rqBJqObLJEkOVoISvY8NbxgHHRLSAjyt8vBryd+DtqQyjB0j9e4uNDs4+E9eKv53yHnW /1L1OYrwsmrqhl8S/JNXngsycDboTuFTC5dXRVu0lQsj72QS3uKPCptShZNBji5c7kRyWi 7icQskuWqA01nB3Li/GLNs26PEl7HzM= ARC-Authentication-Results: i=1; imf19.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf19.hostedemail.com: domain of hejinyang@loongson.cn designates 114.242.206.163 as permitted sender) smtp.mailfrom=hejinyang@loongson.cn ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1690340354; a=rsa-sha256; cv=none; b=dzdCqrVENI9i12+5kiQqH1BcU/MgKK0dlFj2JQsBltsfHsBvxH+mT3Wa2bGji2F2xiKbbj 66P5WkI5pEvMDs/U+NQ627jf74aCSutUkMRav+LqlfAvTwJ4v/ybskyfHW9YjKenneNUYE nm5aS4Zw/VLOolNC7hwjJoEZVVkr1W8= Received: from loongson.cn (unknown [111.9.175.10]) by gateway (Coremail) with SMTP id _____8BxHOv8i8BkswcKAA--.19962S3; Wed, 26 Jul 2023 10:59:08 +0800 (CST) Received: from [10.136.12.26] (unknown [111.9.175.10]) by localhost.localdomain (Coremail) with SMTP id AQAAf8Dx5sz6i8BkwEY7AA--.7565S3; Wed, 26 Jul 2023 10:59:07 +0800 (CST) Subject: Re: [PATCH 2/4 v2] LoongArch: Get stack without NMI when providing regs parameter To: Enze Li , chenhuacai@kernel.org, kernel@xen0n.name, loongarch@lists.linux.dev, glider@google.com, elver@google.com, akpm@linux-foundation.org, kasan-dev@googlegroups.com, linux-mm@kvack.org Cc: yangtiezhu@loongson.cn, dvyukov@google.com References: <20230725061451.1231480-1-lienze@kylinos.cn> <20230725061451.1231480-3-lienze@kylinos.cn> From: Jinyang He Message-ID: Date: Wed, 26 Jul 2023 10:59:06 +0800 User-Agent: Mozilla/5.0 (X11; Linux loongarch64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: <20230725061451.1231480-3-lienze@kylinos.cn> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US X-CM-TRANSID:AQAAf8Dx5sz6i8BkwEY7AA--.7565S3 X-CM-SenderInfo: pkhmx0p1dqwqxorr0wxvrqhubq/ X-Coremail-Antispam: 1Uk129KBj93XoWxZr45Wr1UGry5tF47Jw13GFX_yoWrCr1kpr Z7CFZ3G3yUZrWIyr17Jr1UXryYyF4vga1UuF1xCa4fGr43JryUt34jgFy5Xr1DCrW8A3yU Xry5tF1q9ws0yagCm3ZEXasCq-sJn29KB7ZKAUJUUUU5529EdanIXcx71UUUUU7KY7ZEXa sCq-sGcSsGvfJ3Ic02F40EFcxC0VAKzVAqx4xG6I80ebIjqfuFe4nvWSU5nxnvy29KBjDU 0xBIdaVrnRJUUUvYb4IE77IF4wAFF20E14v26r1j6r4UM7CY07I20VC2zVCF04k26cxKx2 IYs7xG6rWj6s0DM7CIcVAFz4kK6r1Y6r17M28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48v e4kI8wA2z4x0Y4vE2Ix0cI8IcVAFwI0_Jr0_JF4l84ACjcxK6xIIjxv20xvEc7CjxVAFwI 0_Jr0_Gr1l84ACjcxK6I8E87Iv67AKxVWxJVW8Jr1l84ACjcxK6I8E87Iv6xkF7I0E14v2 6r4j6r4UJwAS0I0E0xvYzxvE52x082IY62kv0487Mc804VCY07AIYIkI8VC2zVCFFI0UMc 02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7IYx2IY67AKxVWUXVWUAwAv7VC2z280aVAF wI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4UM4x0Y48IcVAKI48JMxk0xIA0c2IEe2xFo4 CEbIxvr21l42xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG 67AKxVWUJVWUGwC20s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r1q6r43MI IYrxkI7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF7I0E 14v26r1j6r4UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVWUJV W8JwCI42IY6I8E87Iv6xkF7I0E14v26r1j6r4UYxBIdaVFxhVjvjDU0xZFpf9x07j1WlkU UUUU= X-Rspamd-Queue-Id: 9D68A1A0004 X-Rspam-User: X-Rspamd-Server: rspam05 X-Stat-Signature: 4b4w7ni5yq7zthht6ihcy9q35s5i7jgm X-HE-Tag: 1690340353-915432 X-HE-Meta: U2FsdGVkX18sec4Us0VH2LsDMZfsUnaZh/tmcqKTqQGY2mDVOcDpinQm5N2mOX8lJ6a1OXhfimVojEnFXrd2LWBuPXt4ri4+cQ7vPX49JbvF6zQRn5h3irw+4jcU0Cg1NGLXmUVp73p6Ri3Dw97oPP8X8kraTzLZXPqH/1OBO9c1pvYYuAlsI9BWfBx2Q9+D23TXLQhdybtjxbUhjjQF569vzwclobZ11cqvU9kwVC1xl67qCR1T6CuJqxmJOcFHXL0TR3RXUalBERq8jdbTNMLYVf6HQqXhWCoRl9/7y7ha+R2C1yxwNnhfn7cAE74O2LXBCHfjPAwEBJLAJvIb/zRd1K6XE7jtvP8V5okCd3Mp17dGMgqdlk+ZJ8da9Tr/qXBY14hp0GYgvCkJNhJ8YA8oEl9uHlUBqyKLMm9zsTRTpJV+96oDQnWt1+XcK2JSUO6tzzbsSxFipeUlRERYPQJilDo3atsSsLve0y1CJeb65l+rF5larcis6uy8HHrTHqj9dlcDjmvFEL6mJPjznZ3sgMORqukSbfv5LEgPb4Y12wOtFPTVATEDHV+siU4bmpDpE9cJJYPmqQSMIjFWptXVicBWsO8ISnCQO3bqxyo3ztfjfD7AhxMvhBAAbH7W6rfwvnPAqua1shnUDKLkio+3zMr48cxBLyvUP3GwUAiGthna8r8UqrAawBdS2q7RYA6hFezxSWSJsLTUUbu0AebAhvWoKD9dLqrTSt41ch9Srhb3XairqoyPkLOyM3Xowseq719oDOaChhgbBjG9hQZCBFyD5Pmjn2ACcYtn5yj6C/CuePMT/m+SVcJ09O/XNSBRQQv/GZOZN7ey4OeNtt1TWwBqtt0S6+o8MBxuN305DWFEMQD+Sk8Zq2/CErRZKyddnfO/irAPg02DPOU7Bc90qgTJwdfLqB3LZPjhkyQfCLNpRsXfrqtp4VBdZFL4bAIVd6NO8fJNCyYH5EJ jTWvhHoP vzQFw7upqKG8paUG7FfgyK4F3IcHJTX8tyw/qHWprNpfSGY/S6ZOVfhkZcg== 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: On 2023-07-25 14:14, Enze Li wrote: > Currently, arch_stack_walk() can only get the full stack information > including NMI. This is because the implementation of arch_stack_walk() > is forced to ignore the information passed by the regs parameter and use > the current stack information instead. > > For some detection systems like KFENCE, only partial stack information > is needed. In particular, the stack frame where the interrupt occurred. > > To support KFENCE, this patch modifies the implementation of the > arch_stack_walk() function so that if this function is called with the > regs argument passed, it retains all the stack information in regs and > uses it to provide accurate information. > > Before the patch applied, I get, > [ 1.531195 ] ================================================================== > [ 1.531442 ] BUG: KFENCE: out-of-bounds read in stack_trace_save_regs+0x48/0x6c > [ 1.531442 ] > [ 1.531900 ] Out-of-bounds read at 0xffff800012267fff (1B left of kfence-#12): > [ 1.532046 ] stack_trace_save_regs+0x48/0x6c > [ 1.532169 ] kfence_report_error+0xa4/0x528 > [ 1.532276 ] kfence_handle_page_fault+0x124/0x270 > [ 1.532388 ] no_context+0x50/0x94 > [ 1.532453 ] do_page_fault+0x1a8/0x36c > [ 1.532524 ] tlb_do_page_fault_0+0x118/0x1b4 > [ 1.532623 ] test_out_of_bounds_read+0xa0/0x1d8 > [ 1.532745 ] kunit_generic_run_threadfn_adapter+0x1c/0x28 > [ 1.532854 ] kthread+0x124/0x130 > [ 1.532922 ] ret_from_kernel_thread+0xc/0xa4 > > > With this patch applied, I get the correct stack information. > [ 1.320220 ] ================================================================== > [ 1.320401 ] BUG: KFENCE: out-of-bounds read in test_out_of_bounds_read+0xa8/0x1d8 > [ 1.320401 ] > [ 1.320898 ] Out-of-bounds read at 0xffff800012257fff (1B left of kfence-#10): > [ 1.321134 ] test_out_of_bounds_read+0xa8/0x1d8 > [ 1.321264 ] kunit_generic_run_threadfn_adapter+0x1c/0x28 > [ 1.321392 ] kthread+0x124/0x130 > [ 1.321459 ] ret_from_kernel_thread+0xc/0xa4 > > > Signed-off-by: Enze Li > --- > arch/loongarch/kernel/stacktrace.c | 20 ++++++++++++++------ > 1 file changed, 14 insertions(+), 6 deletions(-) > > diff --git a/arch/loongarch/kernel/stacktrace.c b/arch/loongarch/kernel/stacktrace.c > index 2463d2fea21f..9dab30ae68ec 100644 > --- a/arch/loongarch/kernel/stacktrace.c > +++ b/arch/loongarch/kernel/stacktrace.c > @@ -18,16 +18,24 @@ void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie, > struct pt_regs dummyregs; > struct unwind_state state; > > - regs = &dummyregs; > - > if (task == current) { > - regs->regs[3] = (unsigned long)__builtin_frame_address(0); > - regs->csr_era = (unsigned long)__builtin_return_address(0); > + if (regs) > + memcpy(&dummyregs, regs, sizeof(*regs)); > + else { > + dummyregs.regs[3] = (unsigned long)__builtin_frame_address(0); > + dummyregs.csr_era = (unsigned long)__builtin_return_address(0); > + } > } else { > - regs->regs[3] = thread_saved_fp(task); > - regs->csr_era = thread_saved_ra(task); > + if (regs) > + memcpy(&dummyregs, regs, sizeof(*regs)); > + else { > + dummyregs.regs[3] = thread_saved_fp(task); > + dummyregs.csr_era = thread_saved_ra(task); > + } > } > > + regs = &dummyregs; > + if (!regs) {     regs = &dummyregs;     if (task == current) {         regs->regs[3] = (unsigned long)__builtin_frame_address(0);         regs->csr_era = (unsigned long)__builtin_return_address(0);     } else {         regs->regs[3] = thread_saved_fp(task);         regs->csr_era = thread_saved_ra(task);     }     regs->regs[1] = 0; } BTW, I remembered that __unwind_start() deals with this issue in regs, task and current. arch_stack_walk() is unnecessary to provide current or task regs if we fix the unwind_start() skip its parent frame (caller is arch_stack_walk). But the current state is better, I think. Thanks, Jinyang > regs->regs[1] = 0; > for (unwind_start(&state, task, regs); > !unwind_done(&state) && !unwind_error(&state); unwind_next_frame(&state)) {