Received: by 2002:a19:771d:0:0:0:0:0 with SMTP id s29csp1234618lfc; Wed, 1 Jun 2022 12:34:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwgXyz99KMZU8PrwGZZZKj3g3M3C0yEAioQ2uyYfoVqzUcmqHobMrWRCi6sWrYr80qiIqsJ X-Received: by 2002:a17:90a:c202:b0:1e2:e772:5f0a with SMTP id e2-20020a17090ac20200b001e2e7725f0amr977607pjt.109.1654112080908; Wed, 01 Jun 2022 12:34:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1654112080; cv=none; d=google.com; s=arc-20160816; b=gA+IYngrwUlsF+s2jwWcM9bxOkF6q/GusxRcC3AL6k6tcZ/ShuVEfzFCAZsGW+xxZH +paI2dHbg47d+ORCBHJITjE/jNmFLG6Gzjmowu/Xi4mGCWT4fDT5Z5paDCwD9hUJFj7+ dVnmUa+Awhvh34GY/W4JlvH5mQtTxtYr2oDgZoZZYlDABBb2g8u+XMXZYh+3/ev0Ei3T 5MaeMblhj0JGD7g7WZ3oeMNpJfILkwreUxGguLu0yp6X5taBOcV1KLvfwzMkfYtkkLWB VdrS0cpyM0OED1dVPXE5AUCFcGivVG0+xFmFzKNqgKDsNmFjIO9dkW+ux2H9G///Hd/6 jaTA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=n0erMVA2WLxTnlrSBdIrVdtNSrXGOBg+9JqlB+pB8OI=; b=sxP50Q5F0VkeekkUnWKok0XFkL7GaD3U2Lmm3lwwotoV95EhReiINUFa2h1fl9ALRj VkRLoN6hninYJjsxXjHwIg+42pga15XjQp5yzqLOk/pz+QzNnMQHQmxRl+AVdQcEsFU8 BmMS2IwngIqtHAmnKdXya3p9KCW3zhGK7ueVFJ/5Q7iP3Z9qdpsm5MWxJo1hV0/q6ck1 XmbNYq11RrDMJAsD3X9FckXQe61fiYgVyfEpPcHl6niT1weWyY9s8UNF8lawH61FSjIu 4T0ZvZ3t/0aCdSkSUIUaOX/G1e8mjC5sxjFA0i2grLjMHaj6cPmB0smW9f3zPAHasIuG 4ouQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b="Hxx7j/A8"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id h70-20020a638349000000b003fbc3be28d7si3289751pge.335.2022.06.01.12.34.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Jun 2022 12:34:40 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b="Hxx7j/A8"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 8CE4719EC36; Wed, 1 Jun 2022 12:03:48 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1347402AbiEaU4K (ORCPT + 99 others); Tue, 31 May 2022 16:56:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53150 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243326AbiEaUz6 (ORCPT ); Tue, 31 May 2022 16:55:58 -0400 Received: from mail-yw1-x1136.google.com (mail-yw1-x1136.google.com [IPv6:2607:f8b0:4864:20::1136]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 005909D4D1 for ; Tue, 31 May 2022 13:55:49 -0700 (PDT) Received: by mail-yw1-x1136.google.com with SMTP id 00721157ae682-306b5b452b1so120977667b3.1 for ; Tue, 31 May 2022 13:55:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=n0erMVA2WLxTnlrSBdIrVdtNSrXGOBg+9JqlB+pB8OI=; b=Hxx7j/A8m31TgFbVzraeVQLkmGp1R3N65ku/+Mo1VayfP7QOiMBD+Q/xPjg8gC4bVA Jge8obmljL51sJAaYF7hcYWToYBCdLzYVx438YdCYWoWfUanfv57BTTt5PIxsRm55Tep HhIsCwONlvBxa4J9CvqlRMtoEB2/f1Hdh4FMvvfauVrrIekTR/uTSxRrNeKTyFxC/0Wc kmxZlOJn80yA6ovOO5vY/zsQq/9gyFQUqcYWkgQCMtlC+hkW4PPaSoGwhwpdONxBZ2od PKpIiRwbt1w3Bu7UBf43dHqgICbwz+TL5rtJaYqlTlagSixAyr/fVLxKN+VAjK7KGW8P DnIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=n0erMVA2WLxTnlrSBdIrVdtNSrXGOBg+9JqlB+pB8OI=; b=dGSvPypZT+eLonQB9iiU27n2lFo6oMlaMNayNyD2veUnfa7p0GydK3vG6KZNHtw6Gf IpHKnRX9s9AKIyVnnnnoCpx+/YBlVZg/ZS4ibTlSc3+UW1MmRbRH2GvuVLuL5J51hrR4 kXygOoyNoD2jvN9O1y6OLbhI1AJHyRNNv7NyYUme9jaVX0ZMZayJQGJt53OIwaLihMUs P9kTaNfqwh5pF4bhHQFTiDLF0UtIyF5f+VRl31Et2II8kc9MXvJUIRG4PEO1rZXWWAdH vsLflYbVL33wvj5pbx6ejzt7c/Fm3+6V1Rq6R+/EaHzVsiWpMzTAWqA65fYChgXCIHLS 40hA== X-Gm-Message-State: AOAM53137zNQZuGL+Y3OpymCe2uwv37HsSn7xVdkKkktm8EvxTRKILy9 gtCXIhnqYezfRMIpmmT3Bor1bfDOY/2cnnQn1dc3Sw== X-Received: by 2002:a81:1e14:0:b0:2f8:c348:9c62 with SMTP id e20-20020a811e14000000b002f8c3489c62mr65829007ywe.291.1654030549041; Tue, 31 May 2022 13:55:49 -0700 (PDT) MIME-Version: 1.0 References: <20220531175910.890307-1-samitolvanen@google.com> <202205311231.C26F6E4E@keescook> In-Reply-To: <202205311231.C26F6E4E@keescook> From: Sami Tolvanen Date: Tue, 31 May 2022 13:55:13 -0700 Message-ID: Subject: Re: [PATCH] cfi: Fix __cfi_slowpath_diag RCU usage with cpuidle To: Kees Cook Cc: "Paul E. McKenney" , Nathan Chancellor , Nick Desaulniers , llvm@lists.linux.dev, LKML Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-9.5 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE, USER_IN_DEF_DKIM_WL autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, May 31, 2022 at 12:33 PM Kees Cook wrote: > > On Tue, May 31, 2022 at 10:59:10AM -0700, Sami Tolvanen wrote: > > RCU_NONIDLE usage during __cfi_slowpath_diag can result in an invalid > > RCU state in the cpuidle code path: > > > > WARNING: CPU: 1 PID: 0 at kernel/rcu/tree.c:613 rcu_eqs_enter+0xe4/0x138 > > ... > > Call trace: > > rcu_eqs_enter+0xe4/0x138 > > rcu_idle_enter+0xa8/0x100 > > cpuidle_enter_state+0x154/0x3a8 > > cpuidle_enter+0x3c/0x58 > > do_idle.llvm.6590768638138871020+0x1f4/0x2ec > > cpu_startup_entry+0x28/0x2c > > secondary_start_kernel+0x1b8/0x220 > > __secondary_switched+0x94/0x98 > > > > Instead, call rcu_irq_enter/exit to wake up RCU only when needed and > > disable interrupts for the entire CFI shadow/module check when we do. > > > > Signed-off-by: Sami Tolvanen > > --- > > kernel/cfi.c | 22 ++++++++++++++++------ > > 1 file changed, 16 insertions(+), 6 deletions(-) > > > > diff --git a/kernel/cfi.c b/kernel/cfi.c > > index 9594cfd1cf2c..08102d19ec15 100644 > > --- a/kernel/cfi.c > > +++ b/kernel/cfi.c > > @@ -281,6 +281,8 @@ static inline cfi_check_fn find_module_check_fn(unsigned long ptr) > > static inline cfi_check_fn find_check_fn(unsigned long ptr) > > { > > cfi_check_fn fn = NULL; > > + unsigned long flags; > > + bool rcu_idle; > > > > if (is_kernel_text(ptr)) > > return __cfi_check; > > @@ -290,13 +292,21 @@ static inline cfi_check_fn find_check_fn(unsigned long ptr) > > * the shadow and __module_address use RCU, so we need to wake it > > * up if necessary. > > */ > > - RCU_NONIDLE({ > > - if (IS_ENABLED(CONFIG_CFI_CLANG_SHADOW)) > > - fn = find_shadow_check_fn(ptr); > > + rcu_idle = !rcu_is_watching(); > > + if (rcu_idle) { > > + local_irq_save(flags); > > + rcu_irq_enter(); > > + } > > + > > + if (IS_ENABLED(CONFIG_CFI_CLANG_SHADOW)) > > + fn = find_shadow_check_fn(ptr); > > + if (!fn) > > + fn = find_module_check_fn(ptr); > > > > - if (!fn) > > - fn = find_module_check_fn(ptr); > > - }); > > + if (rcu_idle) { > > + rcu_irq_exit(); > > + local_irq_restore(flags); > > + } > > > > return fn; > > } > > -- > > 2.36.1.255.ge46751e96f-goog > > > > Thanks for the fix! It looks like these tags could be added, yes? > > Fixes: cf68fffb66d6 ("add support for Clang CFI") > Cc: stable@vger.kernel.org Yes, agreed. > Also, to improve the commit log, under what situation was this problem > encountered? On affected devices, this warning is triggered at boot. Sami