Received: by 10.223.185.111 with SMTP id b44csp105542wrg; Fri, 9 Mar 2018 01:50:42 -0800 (PST) X-Google-Smtp-Source: AG47ELs1srzxwJCA/jmORSUdaDmhVyqpoTN2mT/AAGBIu9LeiXhRES+F4HANjJSff+tRFVjfVk66 X-Received: by 2002:a17:902:b582:: with SMTP id a2-v6mr26587106pls.353.1520589042295; Fri, 09 Mar 2018 01:50:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1520589042; cv=none; d=google.com; s=arc-20160816; b=EnFW4sfThrjCiMEtcDZ0ihTWRw3HbuP8PZj2JIIiftRFkMc4KCY5VXdB3NLBvB1YGa GS/NaZsw8YOQ0HrzYx3DufkrQU1n5FZOvEumnBwEHMnsoOElRk3NnCtkebcg5QslYueb gWs9rIr+kCejj4csS7WXwKeyQ4pl2V3+sj2GkB3RgzON6FPprj70nJ8hC9B+vNmJYcZ0 3tAhksu87hxww4z2qTtT9swqsY2M9re6cfOYvTKzxigm3ek52eRf58L4uD3zXdy3T1zR zEngl/eTwW31zrgQvrajYnAD6l+a2l2R1xKyvL2ezOYJpHnxEfYhcgcZCC6zWTxl16bc ljyA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=wHGOB4to23gy9iuarQv43seUknf2b9trJNwFAFokvag=; b=muwWSSh0JMecXyKoTn8RTHSNT4RXSyEMvZSFAAPQxhVDXBpwcfVVSg2oVRgZNqFyKl ERZnx3Sdvd/kRbaCie/naUyTgIXUky+DlqBQQ8lqpV/akj/aiRBIeELiW8m51Hl+bSe5 nJJ9rWCVkqDX64kepP094VRRDNGcq9ZSzZKTMtvWb77mdvjFpKuc5e1Yn/6fxGYGTpPk j0AqNO3LT9h8JQ3EbZhjJGOHn8rFScC1Fn6ued4zEF2MSmq8G+UOYjzaug5l52VQualg XynStWQGcIsvVswCBDz8lySAiDWFRrLRAgiPlexq9/SbCBCHzMbMG3/wB+/wwRYdWrms Ez3Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g34-v6si583805pld.513.2018.03.09.01.50.28; Fri, 09 Mar 2018 01:50:42 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751246AbeCIJtV (ORCPT + 99 others); Fri, 9 Mar 2018 04:49:21 -0500 Received: from cloudserver094114.home.pl ([79.96.170.134]:52477 "EHLO cloudserver094114.home.pl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751019AbeCIJsw (ORCPT ); Fri, 9 Mar 2018 04:48:52 -0500 Received: from 79.184.254.228.ipv4.supernova.orange.pl (79.184.254.228) (HELO aspire.rjw.lan) by serwer1319399.home.pl (79.96.170.134) with SMTP (IdeaSmtpServer 0.83) id 651ed0d2e43ee7f8; Fri, 9 Mar 2018 10:48:50 +0100 From: "Rafael J. Wysocki" To: Peter Zijlstra , Linux PM , Frederic Weisbecker Cc: Thomas Gleixner , Paul McKenney , Thomas Ilsche , Doug Smythies , Rik van Riel , Aubrey Li , Mike Galbraith , LKML Subject: [RFC/RFT][PATCH v3 1/6] time: tick-sched: Reorganize idle tick management code Date: Fri, 09 Mar 2018 10:36:56 +0100 Message-ID: <2697163.FknhNRV3Rg@aspire.rjw.lan> In-Reply-To: <2450532.XN8DODrtDf@aspire.rjw.lan> References: <2450532.XN8DODrtDf@aspire.rjw.lan> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Rafael J. Wysocki Prepare the scheduler tick code for reworking the idle loop to avoid stopping the tick in some cases. Move away the tick_nohz_start_idle() invocation from __tick_nohz_idle_enter(), rename the latter to __tick_nohz_idle_stop_tick() and define tick_nohz_idle_stop_tick() as a wrapper around it for calling it from the outside. Make tick_nohz_idle_enter() only call tick_nohz_start_idle() instead of calling the entire __tick_nohz_idle_enter(), add another wrapper disabling and enabling interrupts around tick_nohz_idle_stop_tick() and make the current callers of tick_nohz_idle_enter() call it too to retain their current functionality. Signed-off-by: Rafael J. Wysocki --- arch/x86/xen/smp_pv.c | 1 + include/linux/tick.h | 9 +++++++++ kernel/sched/idle.c | 1 + kernel/time/tick-sched.c | 46 +++++++++++++++++++++++++--------------------- 4 files changed, 36 insertions(+), 21 deletions(-) Index: linux-pm/include/linux/tick.h =================================================================== --- linux-pm.orig/include/linux/tick.h +++ linux-pm/include/linux/tick.h @@ -114,6 +114,7 @@ enum tick_dep_bits { #ifdef CONFIG_NO_HZ_COMMON extern bool tick_nohz_enabled; extern int tick_nohz_tick_stopped(void); +extern void tick_nohz_idle_stop_tick(void); extern void tick_nohz_idle_enter(void); extern void tick_nohz_idle_exit(void); extern void tick_nohz_irq_exit(void); @@ -125,6 +126,7 @@ extern u64 get_cpu_iowait_time_us(int cp #else /* !CONFIG_NO_HZ_COMMON */ #define tick_nohz_enabled (0) static inline int tick_nohz_tick_stopped(void) { return 0; } +static inline void tick_nohz_idle_stop_tick(void) { } static inline void tick_nohz_idle_enter(void) { } static inline void tick_nohz_idle_exit(void) { } @@ -136,6 +138,13 @@ static inline u64 get_cpu_idle_time_us(i static inline u64 get_cpu_iowait_time_us(int cpu, u64 *unused) { return -1; } #endif /* !CONFIG_NO_HZ_COMMON */ +static inline void tick_nohz_idle_stop_tick_protected(void) +{ + local_irq_disable(); + tick_nohz_idle_stop_tick(); + local_irq_enable(); +} + #ifdef CONFIG_NO_HZ_FULL extern bool tick_nohz_full_running; extern cpumask_var_t tick_nohz_full_mask; Index: linux-pm/kernel/time/tick-sched.c =================================================================== --- linux-pm.orig/kernel/time/tick-sched.c +++ linux-pm/kernel/time/tick-sched.c @@ -539,14 +539,11 @@ static void tick_nohz_stop_idle(struct t sched_clock_idle_wakeup_event(); } -static ktime_t tick_nohz_start_idle(struct tick_sched *ts) +static void tick_nohz_start_idle(struct tick_sched *ts) { - ktime_t now = ktime_get(); - - ts->idle_entrytime = now; + ts->idle_entrytime = ktime_get(); ts->idle_active = 1; sched_clock_idle_sleep_event(); - return now; } /** @@ -911,19 +908,21 @@ static bool can_stop_idle_tick(int cpu, return true; } -static void __tick_nohz_idle_enter(struct tick_sched *ts) +static void __tick_nohz_idle_stop_tick(struct tick_sched *ts) { - ktime_t now, expires; + ktime_t expires; int cpu = smp_processor_id(); - now = tick_nohz_start_idle(ts); - if (can_stop_idle_tick(cpu, ts)) { int was_stopped = ts->tick_stopped; ts->idle_calls++; - expires = tick_nohz_stop_sched_tick(ts, now, cpu); + /* + * The idle entry time should be a sufficient approximation of + * the current time at this point. + */ + expires = tick_nohz_stop_sched_tick(ts, ts->idle_entrytime, cpu); if (expires > 0LL) { ts->idle_sleeps++; ts->idle_expires = expires; @@ -937,16 +936,19 @@ static void __tick_nohz_idle_enter(struc } /** - * tick_nohz_idle_enter - stop the idle tick from the idle task + * tick_nohz_idle_stop_tick - stop the idle tick from the idle task * * When the next event is more than a tick into the future, stop the idle tick - * Called when we start the idle loop. - * - * The arch is responsible of calling: + */ +void tick_nohz_idle_stop_tick(void) +{ + __tick_nohz_idle_stop_tick(this_cpu_ptr(&tick_cpu_sched)); +} + +/** + * tick_nohz_idle_enter - prepare for entering idle on the current CPU * - * - rcu_idle_enter() after its last use of RCU before the CPU is put - * to sleep. - * - rcu_idle_exit() before the first use of RCU after the CPU is woken up. + * Called when we start the idle loop. */ void tick_nohz_idle_enter(void) { @@ -965,7 +967,7 @@ void tick_nohz_idle_enter(void) ts = this_cpu_ptr(&tick_cpu_sched); ts->inidle = 1; - __tick_nohz_idle_enter(ts); + tick_nohz_start_idle(ts); local_irq_enable(); } @@ -982,10 +984,12 @@ void tick_nohz_irq_exit(void) { struct tick_sched *ts = this_cpu_ptr(&tick_cpu_sched); - if (ts->inidle) - __tick_nohz_idle_enter(ts); - else + if (ts->inidle) { + tick_nohz_start_idle(ts); + __tick_nohz_idle_stop_tick(ts); + } else { tick_nohz_full_update_tick(ts); + } } /** Index: linux-pm/arch/x86/xen/smp_pv.c =================================================================== --- linux-pm.orig/arch/x86/xen/smp_pv.c +++ linux-pm/arch/x86/xen/smp_pv.c @@ -425,6 +425,7 @@ static void xen_pv_play_dead(void) /* us * data back is to call: */ tick_nohz_idle_enter(); + tick_nohz_idle_stop_tick_protected(); cpuhp_online_idle(CPUHP_AP_ONLINE_IDLE); } Index: linux-pm/kernel/sched/idle.c =================================================================== --- linux-pm.orig/kernel/sched/idle.c +++ linux-pm/kernel/sched/idle.c @@ -221,6 +221,7 @@ static void do_idle(void) __current_set_polling(); tick_nohz_idle_enter(); + tick_nohz_idle_stop_tick_protected(); while (!need_resched()) { check_pgt_cache();