Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1974210pxb; Fri, 5 Mar 2021 04:32:10 -0800 (PST) X-Google-Smtp-Source: ABdhPJxDkPwyDUcr26oCGw7s8rrvFrePFU3eKZL10zGcCS5tyNUa1YzGkKOudO7S+6pGr6lUOO4j X-Received: by 2002:aa7:d74b:: with SMTP id a11mr8766914eds.92.1614947530675; Fri, 05 Mar 2021 04:32:10 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614947530; cv=none; d=google.com; s=arc-20160816; b=ziAZfY2PP8qJ22QaaMe8ps9vSNG+3+bvVhlQ4ZusfyA7xjvc0UIrHdIHBH9Q9FucTM KSby4tST8qQUzzFpPzwkz9nFW225PZYWVNEBezZhoRuhHfs5VEDEDlAIYEJhZ9OVTa3t eWH1J35VzGg9N1h6iQLcQltObInkn0Jz7X6NN/2MvSwZzImAc9vKwp9tNc9SDBhnvcZl gPzPWt1WLxvQnhCeO4N3eZZS+d7LAB6HY9rZE69vPqrSkc3b00iHILMrccYIpQjjfeH9 LA3w51YxeIqM2u/Jbt2r4yawn7Qrxx5h1IFxUfG4DjvCyJvDJtDfsY5HhJbnUtQDHWKq hVTg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=blAOP5PfAcF72NhprEvcz+TZIny3665MTufW0reavy0=; b=IrY0895+dmbz1SWhFFtELfzv4vnVQDRZmIRlUdojHpJmWkKGl1SScrW5yat/L11bmh H6Bgn1634EF8TJLb4bOb/T3Dv+6tVHebwHpp4NUzc4qH52/QC30HRIsoR8AVCeUHITBT CSMsw0cR3i4sZrXWZuHqd4nw7IL1pJ6+U9xAyuUadO3KS6mmCQ+GKaIZjWAgAtMexe4O z9XHnb7CBT63tM00Obm6bZhlQnlJmojtIuvUXuak3z5NJGYBX9fakC9F+nVufDED8Rj3 Q2y59lrqfADP7LmLHtw1m+zqn+344Ganr6PenQUZQws7zb252SWW+4ikZuJdCVbBqMGF xWAQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=l7+07604; 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=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id n1si1506678edo.504.2021.03.05.04.31.47; Fri, 05 Mar 2021 04:32:10 -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; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=l7+07604; 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=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232177AbhCEM3w (ORCPT + 99 others); Fri, 5 Mar 2021 07:29:52 -0500 Received: from mail.kernel.org ([198.145.29.99]:38480 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230491AbhCEM3X (ORCPT ); Fri, 5 Mar 2021 07:29:23 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 9B7C165019; Fri, 5 Mar 2021 12:29:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1614947363; bh=mUUw0aQtWnNeSeIwEvMCzhEijvdKxmJQJJlHsrePJPU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=l7+07604eREO6Tur16919DS+WP48wTHXsrcjymIGEb0Yu0VOzNIjXQyvh7iiu2da7 W0g8zxddMSdNSwnUsuex71f7JuCfgbzGdWtAwiFy0xkL1sxyhjl1tNgz6TmdGO7n/K lS1QH7BspX3lQ0hWPHfcga5TecG9jY2KE6siVC5M= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Frederic Weisbecker , "Peter Zijlstra (Intel)" , Ingo Molnar , Sasha Levin Subject: [PATCH 5.10 038/102] entry: Explicitly flush pending rcuog wakeup before last rescheduling point Date: Fri, 5 Mar 2021 13:20:57 +0100 Message-Id: <20210305120905.162067333@linuxfoundation.org> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210305120903.276489876@linuxfoundation.org> References: <20210305120903.276489876@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Frederic Weisbecker [ Upstream commit 47b8ff194c1fd73d58dc339b597d466fe48c8958 ] Following the idle loop model, cleanly check for pending rcuog wakeup before the last rescheduling point on resuming to user mode. This way we can avoid to do it from rcu_user_enter() with the last resort self-IPI hack that enforces rescheduling. Signed-off-by: Frederic Weisbecker Signed-off-by: Peter Zijlstra (Intel) Signed-off-by: Ingo Molnar Cc: stable@vger.kernel.org Link: https://lkml.kernel.org/r/20210131230548.32970-5-frederic@kernel.org Signed-off-by: Sasha Levin --- kernel/entry/common.c | 7 +++++++ kernel/rcu/tree.c | 12 +++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/kernel/entry/common.c b/kernel/entry/common.c index e9e2df3f3f9e..fcc7e93401d5 100644 --- a/kernel/entry/common.c +++ b/kernel/entry/common.c @@ -174,6 +174,10 @@ static unsigned long exit_to_user_mode_loop(struct pt_regs *regs, * enabled above. */ local_irq_disable_exit_to_user(); + + /* Check if any of the above work has queued a deferred wakeup */ + rcu_nocb_flush_deferred_wakeup(); + ti_work = READ_ONCE(current_thread_info()->flags); } @@ -187,6 +191,9 @@ static void exit_to_user_mode_prepare(struct pt_regs *regs) lockdep_assert_irqs_disabled(); + /* Flush pending rcuog wakeup before the last need_resched() check */ + rcu_nocb_flush_deferred_wakeup(); + if (unlikely(ti_work & EXIT_TO_USER_MODE_WORK)) ti_work = exit_to_user_mode_loop(regs, ti_work); diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index f137a599941b..0d8a2e2df221 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -699,13 +699,15 @@ noinstr void rcu_user_enter(void) lockdep_assert_irqs_disabled(); /* - * We may be past the last rescheduling opportunity in the entry code. - * Trigger a self IPI that will fire and reschedule once we resume to - * user/guest mode. + * Other than generic entry implementation, we may be past the last + * rescheduling opportunity in the entry code. Trigger a self IPI + * that will fire and reschedule once we resume in user/guest mode. */ instrumentation_begin(); - if (do_nocb_deferred_wakeup(rdp) && need_resched()) - irq_work_queue(this_cpu_ptr(&late_wakeup_work)); + if (!IS_ENABLED(CONFIG_GENERIC_ENTRY) || (current->flags & PF_VCPU)) { + if (do_nocb_deferred_wakeup(rdp) && need_resched()) + irq_work_queue(this_cpu_ptr(&late_wakeup_work)); + } instrumentation_end(); rcu_eqs_enter(true); -- 2.30.1