Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp4925281pxj; Wed, 12 May 2021 16:44:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzmBAhAK4R5dnGLCcErnDOGr7rv4IduON7r9XV66mv2CUqptOeOXQ5R2AFNvJRzWC6hKhS+ X-Received: by 2002:a05:6602:2cd5:: with SMTP id j21mr29694119iow.83.1620863097769; Wed, 12 May 2021 16:44:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620863097; cv=none; d=google.com; s=arc-20160816; b=AVyClzMny8Dd41pUgYd5Lrx59t7g6DvRmjx0ehfBfevJyPF1Lx2FGRg8FroWD5zSRL IBUxoVSeQULClvxHXAmR84AOEhUeiOQQ1qqq+J2xK4tPuv2dVwRXijamp6f57KPFBewg 98Z85Zy9kOONkZLlP9c139GiQr8k3TykY2YTNCAn44lp7W6/gwXIfvcA5kf6wzrlYPWE bZL+im2ajbwm4cvnTXQ7gwOuFGCKLk/r4x/o6UgoGhR20PlRAqpSa5JbAIu+2JBoxtzw ZrowvMuOiTmJE50nz6EFBfeAG2u8Tg6nIzZ6I49O4cx+/RwbtBd7Rh1XXwiR9HjefcmS rNRw== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=q4HqRJeslwa5PrkhSkrAzG98ERMBPIBFAKjBLDzadrU=; b=gRivIv8QQmMoNo0zD2e6yJqOtd3OaXdWLrN8ttrICqsgQQYRmo2KtdDIPdujfWZE64 5RBkwO2F7gIGqth3C1aswRJaptTVlHlIhnLriJBC2SDvB3iz97yE5JOSa/01VdUBPJW9 qd5Ybptc6Cvz3DQlCpynZuYYnFv4g/lhEsBfMgw6GONE4Omxa8LySWxEaN6Kaa2Sk998 aSMSZWmxz0UCrrCcZMvDEddgt0EIdklkgYtGqhaz6xzW7y7ZOsGAsZzVbofnX570YhcD aE2EXZne5tv9hZbOKTu6gDYNXHEyxlMRR9H+1hFVHYgzqsRGE8ymyPnGFrUdHpH1hLPC xzOg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=eFfXvkcS; 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 t19si1265538iog.66.2021.05.12.16.44.45; Wed, 12 May 2021 16:44:57 -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=eFfXvkcS; 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 S240487AbhELXmp (ORCPT + 99 others); Wed, 12 May 2021 19:42:45 -0400 Received: from mail.kernel.org ([198.145.29.99]:51738 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243629AbhELXav (ORCPT ); Wed, 12 May 2021 19:30:51 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 2DCA361404; Wed, 12 May 2021 23:29:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1620862182; bh=MlnjlfDWU8WjcXYxH4r3Kr4foTTcI7rnl2+3Ou9at1I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eFfXvkcSO0t0h16mCL8tdC+/Chsn5h/xi2jXH3N56+hkG28F8EcOEMqHEpo75P0Vo l8XT4uuAX19gEQTp9KevHTwqomDhNnjyggPKCgSscLs9xCtm2SQMQ6i7GSizerh1zA mKcV80HtEy6Slz6vmULx4JsAv7goOVUG0u+IxziQfMjJCPqOBjoAy+pPAw/+9vuCJM Vy+CU/wBOt4/Q9wDajmqdWEXFLhLqdj0HTvSuIqxCKLJlxrSPl/sd9q8JDoI/8/l7O h91xzXG8CCMmNDQLfVCGwhblPNfmCkSxiqBbQvREOS5mFFO6qsewXru0SL2g/YgP3D nSn1BFaX18LwA== From: Frederic Weisbecker To: Thomas Gleixner , Ingo Molnar Cc: LKML , Yunfeng Ye , "Rafael J . Wysocki" , Peter Zijlstra , Frederic Weisbecker , Marcelo Tosatti Subject: [PATCH 02/10] tick/nohz: Conditionally restart tick on idle exit Date: Thu, 13 May 2021 01:29:16 +0200 Message-Id: <20210512232924.150322-3-frederic@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210512232924.150322-1-frederic@kernel.org> References: <20210512232924.150322-1-frederic@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Yunfeng Ye In nohz_full mode, switching from idle to a task will unconditionally issue a tick restart. If the task is alone in the runqueue or is the highest priority, the tick will fire once then eventually stop. But that alone is still undesired noise. Therefore, only restart the tick on idle exit when it's strictly necessary. Acked-by: Peter Zijlstra Signed-off-by: Yunfeng Ye Cc: Thomas Gleixner Cc: Marcelo Tosatti Cc: Rafael J. Wysocki Signed-off-by: Frederic Weisbecker --- kernel/time/tick-sched.c | 46 +++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 828b091501ca..05c1ce1034d6 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c @@ -926,24 +926,30 @@ static void tick_nohz_restart_sched_tick(struct tick_sched *ts, ktime_t now) tick_nohz_restart(ts, now); } -static void tick_nohz_full_update_tick(struct tick_sched *ts) +static void __tick_nohz_full_update_tick(struct tick_sched *ts, + ktime_t now) { #ifdef CONFIG_NO_HZ_FULL int cpu = smp_processor_id(); - if (!tick_nohz_full_cpu(cpu)) - return; - - if (!ts->tick_stopped && ts->nohz_mode == NOHZ_MODE_INACTIVE) - return; - if (can_stop_full_tick(cpu, ts)) tick_nohz_stop_sched_tick(ts, cpu); else if (ts->tick_stopped) - tick_nohz_restart_sched_tick(ts, ktime_get()); + tick_nohz_restart_sched_tick(ts, now); #endif } +static void tick_nohz_full_update_tick(struct tick_sched *ts) +{ + if (!tick_nohz_full_cpu(smp_processor_id())) + return; + + if (!ts->tick_stopped && ts->nohz_mode == NOHZ_MODE_INACTIVE) + return; + + __tick_nohz_full_update_tick(ts, ktime_get()); +} + static bool can_stop_idle_tick(int cpu, struct tick_sched *ts) { /* @@ -1209,18 +1215,24 @@ static void tick_nohz_account_idle_ticks(struct tick_sched *ts) #endif } -static void __tick_nohz_idle_restart_tick(struct tick_sched *ts, ktime_t now) -{ - tick_nohz_restart_sched_tick(ts, now); - tick_nohz_account_idle_ticks(ts); -} - void tick_nohz_idle_restart_tick(void) { struct tick_sched *ts = this_cpu_ptr(&tick_cpu_sched); - if (ts->tick_stopped) - __tick_nohz_idle_restart_tick(ts, ktime_get()); + if (ts->tick_stopped) { + tick_nohz_restart_sched_tick(ts, ktime_get()); + tick_nohz_account_idle_ticks(ts); + } +} + +static void tick_nohz_idle_update_tick(struct tick_sched *ts, ktime_t now) +{ + if (tick_nohz_full_cpu(smp_processor_id())) + __tick_nohz_full_update_tick(ts, now); + else + tick_nohz_restart_sched_tick(ts, now); + + tick_nohz_account_idle_ticks(ts); } /** @@ -1252,7 +1264,7 @@ void tick_nohz_idle_exit(void) tick_nohz_stop_idle(ts, now); if (tick_stopped) - __tick_nohz_idle_restart_tick(ts, now); + tick_nohz_idle_update_tick(ts, now); local_irq_enable(); } -- 2.25.1