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 X-Spam-Level: X-Spam-Status: No, score=-14.4 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6417DC2BA19 for ; Tue, 14 Apr 2020 17:54:26 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 1284420767 for ; Tue, 14 Apr 2020 17:54:25 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="I+GgGCLl" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1284420767 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id A67D88E0039; Tue, 14 Apr 2020 13:54:25 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id A3E9F8E0001; Tue, 14 Apr 2020 13:54:25 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 954D58E0039; Tue, 14 Apr 2020 13:54:25 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0028.hostedemail.com [216.40.44.28]) by kanga.kvack.org (Postfix) with ESMTP id 7E4568E0001 for ; Tue, 14 Apr 2020 13:54:25 -0400 (EDT) Received: from smtpin20.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay01.hostedemail.com (Postfix) with ESMTP id 3CBE9180AD802 for ; Tue, 14 Apr 2020 17:54:25 +0000 (UTC) X-FDA: 76707210090.20.hill44_7ddcdb3f68862 X-HE-Tag: hill44_7ddcdb3f68862 X-Filterd-Recvd-Size: 9927 Received: from mail-pl1-f194.google.com (mail-pl1-f194.google.com [209.85.214.194]) by imf43.hostedemail.com (Postfix) with ESMTP for ; Tue, 14 Apr 2020 17:54:24 +0000 (UTC) Received: by mail-pl1-f194.google.com with SMTP id m16so227323pls.4 for ; Tue, 14 Apr 2020 10:54:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=CliSFmIDTYWCCk0aW6kra1OKLw9I9BXEau9K0NczJ0k=; b=I+GgGCLlGdDE2o4cEHddEWrBIGrZs+zEjz75IzslTe8ilb4jJ7YDGR78q8fUZTOf2F l9WKipGNRUhQsto5DPDKzB/YPtheyTjM9WYutfW2Ie45DUXDzWGq0LCOm2tjmsN9UIPT Juj2v8wlzeYskVLc/fdniuEcNErz8nbFcrqrf1eghyRFsRxWO6ad4DqIBkSjc80HqXR7 /usFmaOYYlgOmEt/NJTjRmgEjzug9iyeoMZZHFSxv8rnDIyzVQ2ggbcmQ0RZg+0CVOsp KjO6AgsBYhrB6dUP+/4NmAOpo2ol9KqoSAP+wAk+foDgGt7uJkJIFxxvxLA2SL139bkm Nk3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=CliSFmIDTYWCCk0aW6kra1OKLw9I9BXEau9K0NczJ0k=; b=sATeiYoX8ExLyoDmSjW90uNG9ZZRQAEZnUj+3llhyKVP+THp0y88fH7/HOptNL+F8u doujsu8zv8cWeT+q9nGLpR5uhONdOc6MtTdI4LoktBk6o7/meYkqxlCgRTH4g2pJe/Cc HyUNqO8hZNgG3hKYWlMIXG9cfyOliqyzK2Hvoo2z1iAp40RydO+eSoHIcpXdGTtmGOAI etxSPGi6tGw6Kd3+3xVRYyuh63XsZXiHiiZVPkHi+ZFYRQUB6fXpT8SOp1v+n8jxLQAO skOTl8YIQflCyHT0Azl5QzANeyRChk+kduPSN3/44xRnnSyIC5KvOLmbhXSHh4UL4c1Y I25A== X-Gm-Message-State: AGi0PuYijt6s0AjjaSSAFKFco0zEcFS/kEzClTvoz+Gx1NPlBes0X0eA k7SgD8oY11ZlVd6o8WZgVSsYl5/kwnqUMs1us0Yinw== X-Google-Smtp-Source: APiQypJaAtTF+ls+Vo8yZC6xSK2TABMjCt7KvJhyfYeiTgr2Ew2EyG4KXiBJYZDKiQ9fQjjKD0CFPfEliw6rRExG9to= X-Received: by 2002:a17:90a:9af:: with SMTP id 44mr1454911pjo.128.1586886863695; Tue, 14 Apr 2020 10:54:23 -0700 (PDT) MIME-Version: 1.0 References: <20200325161249.55095-1-glider@google.com> <20200325161249.55095-17-glider@google.com> In-Reply-To: <20200325161249.55095-17-glider@google.com> From: Andrey Konovalov Date: Tue, 14 Apr 2020 19:54:12 +0200 Message-ID: Subject: Re: [PATCH v5 16/38] kmsan: x86/asm: softirq: add KMSAN IRQ entry hooks To: Alexander Potapenko Cc: Jens Axboe , Andy Lutomirski , Vegard Nossum , Dmitry Vyukov , Marco Elver , Christoph Hellwig , Linux Memory Management List , Alexander Viro , Andreas Dilger , Andrew Morton , Andrey Ryabinin , Ard Biesheuvel , Arnd Bergmann , Christoph Hellwig , "Darrick J. Wong" , "David S. Miller" , Dmitry Torokhov , Eric Biggers , Eric Dumazet , Eric Van Hensbergen , Greg Kroah-Hartman , Harry Wentland , Herbert Xu , Ilya Leoshkevich , Ingo Molnar , Jason Wang , Marek Szyprowski , Mark Rutland , "Martin K. Petersen" , Martin Schwidefsky , Matthew Wilcox , "Michael S . Tsirkin" , Michal Hocko , Michal Simek , Petr Mladek , Qian Cai , Randy Dunlap , Robin Murphy , Sergey Senozhatsky , Steven Rostedt , Takashi Iwai , "Theodore Ts'o" , Thomas Gleixner , Vasily Gorbik , Wolfram Sang Content-Type: text/plain; charset="UTF-8" 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 Wed, Mar 25, 2020 at 5:13 PM wrote: > > Add assembly helpers to entry_64.S that invoke hooks from kmsan_entry.c and > notify KMSAN about interrupts. > Also call these hooks from kernel/softirq.c > This is needed to switch between several KMSAN contexts holding function > parameter metadata. > > Signed-off-by: Alexander Potapenko > To: Alexander Potapenko > Cc: Jens Axboe > Cc: Andy Lutomirski > Cc: Vegard Nossum > Cc: Dmitry Vyukov > Cc: Marco Elver > Cc: Andrey Konovalov > Cc: Christoph Hellwig > Cc: linux-mm@kvack.org Acked-by: Andrey Konovalov > --- > > v4: > - moved softirq changes to this patch > > Change-Id: I3037d51672fe69d09e588b27adb2d9fdc6ad3a7d > --- > arch/x86/entry/entry_64.S | 16 ++++++++++++++++ > kernel/softirq.c | 5 +++++ > 2 files changed, 21 insertions(+) > > diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S > index 0e9504fabe526..03f5a32b0af4d 100644 > --- a/arch/x86/entry/entry_64.S > +++ b/arch/x86/entry/entry_64.S > @@ -35,6 +35,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -575,6 +576,7 @@ SYM_CODE_START(interrupt_entry) > > 1: > ENTER_IRQ_STACK old_rsp=%rdi save_ret=1 > + KMSAN_INTERRUPT_ENTER > /* We entered an interrupt context - irqs are off: */ > TRACE_IRQS_OFF > > @@ -604,12 +606,14 @@ SYM_CODE_START_LOCAL(common_interrupt) > addq $-0x80, (%rsp) /* Adjust vector to [-256, -1] range */ > call interrupt_entry > UNWIND_HINT_REGS indirect=1 > + KMSAN_UNPOISON_PT_REGS > call do_IRQ /* rdi points to pt_regs */ > /* 0(%rsp): old RSP */ > ret_from_intr: > DISABLE_INTERRUPTS(CLBR_ANY) > TRACE_IRQS_OFF > > + KMSAN_INTERRUPT_EXIT > LEAVE_IRQ_STACK > > testb $3, CS(%rsp) > @@ -801,6 +805,7 @@ SYM_CODE_START(\sym) > .Lcommon_\sym: > call interrupt_entry > UNWIND_HINT_REGS indirect=1 > + KMSAN_UNPOISON_PT_REGS > call \do_sym /* rdi points to pt_regs */ > jmp ret_from_intr > SYM_CODE_END(\sym) > @@ -908,15 +913,18 @@ apicinterrupt IRQ_WORK_VECTOR irq_work_interrupt smp_irq_work_interrupt > > .if \shift_ist != -1 > subq $\ist_offset, CPU_TSS_IST(\shift_ist) > + KMSAN_IST_ENTER(\shift_ist) > .endif > > .if \read_cr2 > movq %r12, %rdx /* Move CR2 into 3rd argument */ > .endif > > + KMSAN_UNPOISON_PT_REGS > call \do_sym > > .if \shift_ist != -1 > + KMSAN_IST_EXIT(\shift_ist) > addq $\ist_offset, CPU_TSS_IST(\shift_ist) > .endif > > @@ -1079,7 +1087,9 @@ SYM_FUNC_START(do_softirq_own_stack) > pushq %rbp > mov %rsp, %rbp > ENTER_IRQ_STACK regs=0 old_rsp=%r11 > + KMSAN_SOFTIRQ_ENTER > call __do_softirq > + KMSAN_SOFTIRQ_EXIT > LEAVE_IRQ_STACK regs=0 > leaveq > ret > @@ -1466,9 +1476,12 @@ SYM_CODE_START(nmi) > * done with the NMI stack. > */ > > + KMSAN_NMI_ENTER > movq %rsp, %rdi > movq $-1, %rsi > + KMSAN_UNPOISON_PT_REGS > call do_nmi > + KMSAN_NMI_EXIT > > /* > * Return back to user mode. We must *not* do the normal exit > @@ -1678,10 +1691,13 @@ end_repeat_nmi: > call paranoid_entry > UNWIND_HINT_REGS > > + KMSAN_NMI_ENTER > /* paranoidentry do_nmi, 0; without TRACE_IRQS_OFF */ > movq %rsp, %rdi > movq $-1, %rsi > + KMSAN_UNPOISON_PT_REGS > call do_nmi > + KMSAN_NMI_EXIT > > /* Always restore stashed CR3 value (see paranoid_entry) */ > RESTORE_CR3 scratch_reg=%r15 save_reg=%r14 > diff --git a/kernel/softirq.c b/kernel/softirq.c > index 0427a86743a46..98c5f4062cbfe 100644 > --- a/kernel/softirq.c > +++ b/kernel/softirq.c > @@ -11,6 +11,7 @@ > > #include > #include > +#include > #include > #include > #include > @@ -370,7 +371,9 @@ static inline void invoke_softirq(void) > * it is the irq stack, because it should be near empty > * at this stage. > */ > + kmsan_context_enter(); > __do_softirq(); > + kmsan_context_exit(); > #else > /* > * Otherwise, irq_exit() is called on the task stack that can > @@ -600,7 +603,9 @@ static void run_ksoftirqd(unsigned int cpu) > * We can safely run softirq on inline stack, as we are not deep > * in the task stack here. > */ > + kmsan_context_enter(); > __do_softirq(); > + kmsan_context_exit(); > local_irq_enable(); > cond_resched(); > return; > -- > 2.25.1.696.g5e7596f4ac-goog >