Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp875117pxj; Thu, 27 May 2021 13:48:27 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy4USzigdH0fTQX+j3lntI13d8LKwnE8Beq/28H97MYqBQ4c6MIQU4fVU2uE9Tibct7t8zf X-Received: by 2002:a5e:cb45:: with SMTP id h5mr4217017iok.207.1622148506998; Thu, 27 May 2021 13:48:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1622148506; cv=none; d=google.com; s=arc-20160816; b=R60D4dXH4LFidEpqHX7Zm3x4s09hhkLX57TrY/ac5URcG08m1JDpPxhoxItE+QMCob CZEbfygR1r5ZAzZtMbJpG0LYXk6dFlg19xU7osH5zMz0f5Oe9/IG9pR3TghrRJFMEJwk r7i12wbQ/4n4hj1jZ7X85Fu7wJGQt1hg8q27K+/tvNkftiCe9HGdXzwz74Wg3oWUrom0 dw70E/6a0UEAUn1eFVM/3RPU8Nbt7MEPbS5i2wfJ2NzLvhiFxqGRmMQZcudFILmABudE gbFxous0Icc8zJkCtsR6z25SslNctiFReZJd/twTJ7zz2OsWViUfEYzW2cak8UOiWqTv 19IA== 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 :message-id:date:subject:cc:to:from:dkim-signature; bh=ZGFhOA8F102XvQxhXMiow7Z+NMdrpVwVNyeZ/FHP2os=; b=yPHv9QO8oHOi6wn6+DrsfOw3pA6TbVET5yr06oSINvzhD9UntvuyZv2pFBl6N19J9k YiXn7eIlQFVoemd4CDb2mMQcXiPtUvicnrQo2lvaf5iYE4vDlrNchuxWoWChe7+PdiCh bSqqNI0oJOW5LbFAVjEjvRoMO0dYbMJjhxAYgOEyYkMiGoPKzB4AskZMhUKiND2R7Uo1 bcdlm0Bokw/SFKxfZM1k9wL+XSG9e+x00WPl07qKE5rioyJ+jDHfrbVFQGqcdeU7cAqs 2OIA4fzV8VpE8IkOK+kE/ioo/LDHzTEZaTLuAFmeFA9Ena46ZDIWMqLMSnGUzEB9heRh XOBA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=Hr3465MF; 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=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id j2si4002323jak.119.2021.05.27.13.48.13; Thu, 27 May 2021 13:48:26 -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=@kernel.org header.s=k20201202 header.b=Hr3465MF; 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=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233657AbhE0LgU (ORCPT + 99 others); Thu, 27 May 2021 07:36:20 -0400 Received: from mail.kernel.org ([198.145.29.99]:45580 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229657AbhE0LgT (ORCPT ); Thu, 27 May 2021 07:36:19 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 1A9E76113B; Thu, 27 May 2021 11:34:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1622115286; bh=qIR0Xp1IFWI6K0A1WmRCygyc0qbztkIIn5fbZJjjmBU=; h=From:To:Cc:Subject:Date:From; b=Hr3465MFEWrrqP/VBjCjykFMuzlQ9RZTiAZgO1TunecUPQEyX/YQGucXhwOFFWlFd RYAcjfrN9WBsXW4XEPvkGN6A1bnL5Uya21bUpiSLK+SMdhckecpxMr39X7+V8D5TAT aZYfz2l/ju+OjinrQZ1ccz85Y+E4URiixf65sWSfA1Zb5QFR4e3QdkhjzgYWQL4coB PzIWqC/Dx1iiQUsFP56R84DG3I4+26vu93LnNgDIbN4FiUo9W/T7GgMh7WgaZCILD1 2MGOAk04KuSaGd6fXXIAA8qQkAimJky+4lTQBRb/rd+qPDLI/nLUyaxKWuGWFjEPq4 sFOIcwUPO8Amg== From: Frederic Weisbecker To: Peter Zijlstra , Ingo Molnar Cc: LKML , Frederic Weisbecker , Thomas Gleixner , kernel test robot , stable@vger.kernel.org, "Paul E . McKenney" Subject: [PATCH] tick/nohz: Only check for RCU deferred wakeup on user/guest entry when needed Date: Thu, 27 May 2021 13:34:41 +0200 Message-Id: <20210527113441.465489-1-frederic@kernel.org> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Checking for and processing RCU-nocb deferred wakeup upon user/guest entry is only relevant when nohz_full runs on the local CPU, otherwise the periodic tick should take care of it. Make sure we don't needlessly pollute these fast-paths as a -3% performance regression on a will-it-scale.per_process_ops has been reported so far. Reported-by: kernel test robot Fixes: 47b8ff194c1f (entry: Explicitly flush pending rcuog wakeup before last rescheduling point) Fixes: 4ae7dc97f726 (entry/kvm: Explicitly flush pending rcuog wakeup before last rescheduling point) Cc: Ingo Molnar Cc: Peter Zijlstra Cc: stable@vger.kernel.org Cc: Paul E. McKenney Cc: Thomas Gleixner Signed-off-by: Frederic Weisbecker --- include/linux/entry-kvm.h | 3 ++- include/linux/tick.h | 7 +++++++ kernel/entry/common.c | 5 +++-- kernel/time/tick-sched.c | 1 + 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/include/linux/entry-kvm.h b/include/linux/entry-kvm.h index 8b2b1d68b954..136b8d97d8c0 100644 --- a/include/linux/entry-kvm.h +++ b/include/linux/entry-kvm.h @@ -3,6 +3,7 @@ #define __LINUX_ENTRYKVM_H #include +#include /* Transfer to guest mode work */ #ifdef CONFIG_KVM_XFER_TO_GUEST_WORK @@ -57,7 +58,7 @@ int xfer_to_guest_mode_handle_work(struct kvm_vcpu *vcpu); static inline void xfer_to_guest_mode_prepare(void) { lockdep_assert_irqs_disabled(); - rcu_nocb_flush_deferred_wakeup(); + tick_nohz_user_enter_prepare(); } /** diff --git a/include/linux/tick.h b/include/linux/tick.h index 7340613c7eff..1a0ff88fa107 100644 --- a/include/linux/tick.h +++ b/include/linux/tick.h @@ -11,6 +11,7 @@ #include #include #include +#include #ifdef CONFIG_GENERIC_CLOCKEVENTS extern void __init tick_init(void); @@ -300,4 +301,10 @@ static inline void tick_nohz_task_switch(void) __tick_nohz_task_switch(); } +static inline void tick_nohz_user_enter_prepare(void) +{ + if (tick_nohz_full_cpu(smp_processor_id())) + rcu_nocb_flush_deferred_wakeup(); +} + #endif diff --git a/kernel/entry/common.c b/kernel/entry/common.c index a0b3b04fb596..bf16395b9e13 100644 --- a/kernel/entry/common.c +++ b/kernel/entry/common.c @@ -5,6 +5,7 @@ #include #include #include +#include #include "common.h" @@ -186,7 +187,7 @@ static unsigned long exit_to_user_mode_loop(struct pt_regs *regs, local_irq_disable_exit_to_user(); /* Check if any of the above work has queued a deferred wakeup */ - rcu_nocb_flush_deferred_wakeup(); + tick_nohz_user_enter_prepare(); ti_work = READ_ONCE(current_thread_info()->flags); } @@ -202,7 +203,7 @@ 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(); + tick_nohz_user_enter_prepare(); if (unlikely(ti_work & EXIT_TO_USER_MODE_WORK)) ti_work = exit_to_user_mode_loop(regs, ti_work); diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 828b091501ca..6784f27a3099 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c @@ -230,6 +230,7 @@ static void tick_sched_handle(struct tick_sched *ts, struct pt_regs *regs) #ifdef CONFIG_NO_HZ_FULL cpumask_var_t tick_nohz_full_mask; +EXPORT_SYMBOL_GPL(tick_nohz_full_mask); bool tick_nohz_full_running; EXPORT_SYMBOL_GPL(tick_nohz_full_running); static atomic_t tick_dep_mask; -- 2.25.1