Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp3404641pxf; Mon, 22 Mar 2021 05:49:16 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwoTtRnvg4Su4GMX0zSmbd7ROh4JjSNgO79g3JzXO01xXPxmohZpUP7ovzAGPwhtkNWIn9L X-Received: by 2002:a17:906:814b:: with SMTP id z11mr18889638ejw.290.1616417356572; Mon, 22 Mar 2021 05:49:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1616417356; cv=none; d=google.com; s=arc-20160816; b=vm57KBI1AkMq1zDN2v4+ydIWSOf+Vilpmau2+OUXMDcLQJGfwlRYzif7O2NSnLj1mg +3HrD3gQ/h0uBUeBUwUnk+MQkxr7gpfuCJKkw8gGrvR9H2H9JFJXc3WouAY03f7yv5mo MkTtrLVziVBFrO4J0az0AxMvr0zPd9w8+vkspbEcoN11M7ao4amcdu1om2rYgTMGXvXq 3faKOpJjxOPxh9EZmVnlC8SFBd6FIQZWk04/IBkKHuRtev5gjAjDcpWPKujSsDdfl4mv 7E3EQBlhGy2y4GkGGPFAu4cZjJY8GRaKf/6YXV24XFz2p2hE7/0+DNJZBfsnL5GKLxXz aaQw== 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=igQgR0cxCXfT3L1rxY3rksUZ3iD4AIaEo1VtSgsI65M=; b=F8I/Bx2T5Go2ab//CdYPL1pFlmhudgL4qdKSEEbgbSWF+fMtn7BExkO4fkFyujRq49 gN7UR99rfZPudQz916A/TBzfj4xfOlzYpD1DiqmfJsK8XBz+anfVPBl7Z+VEzC8tSlRE 2GedtwZEGplW4Ycudae4blz4VjfN1UWjZEAHhXfdacbe2byHbr17QHI25GWA40bxHcTr Z4SicqyuBoxqvrWorIsnxYc2/pogtRHBz7gAzUP+XBLzmwYVwQw7lADcpRwZaJ9eIT8+ z3D5q4IpNfEhexnh4NNkipOexiVvyHrjrRnXvktEk6ir7fpkvsq+NJAG4yG4ciBwfJLK +Ecw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=JNRahqP5; 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 h16si11476675edv.366.2021.03.22.05.48.53; Mon, 22 Mar 2021 05:49:16 -0700 (PDT) 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=JNRahqP5; 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 S232783AbhCVMsO (ORCPT + 99 others); Mon, 22 Mar 2021 08:48:14 -0400 Received: from mail.kernel.org ([198.145.29.99]:35512 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232047AbhCVMjp (ORCPT ); Mon, 22 Mar 2021 08:39:45 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 71BC0619A3; Mon, 22 Mar 2021 12:38:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1616416717; bh=97lJKM0DULfeL0wRz2jQx/tsWov+8WVk+/VuxhHfteg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JNRahqP5xCDcRUHXDQOJDpZ9uP6M6kPju82nuschmg0BIrcf8L2Ce8DGcHSn0TnaD J2EbBDP+hgp5aHMNfYyqicorYER5hJBT07k2geHwqKdp4ACLZnx54R7NqG1NoL3HBn QgkaXUxCV25xxiFEAUOfUB88ICeIiO0jW6O3ptMs= 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 093/157] entry: Explicitly flush pending rcuog wakeup before last rescheduling point Date: Mon, 22 Mar 2021 13:27:30 +0100 Message-Id: <20210322121936.730462638@linuxfoundation.org> X-Mailer: git-send-email 2.31.0 In-Reply-To: <20210322121933.746237845@linuxfoundation.org> References: <20210322121933.746237845@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 e289e6773292..d6587e10bd4c 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