Received: by 10.213.65.68 with SMTP id h4csp1307020imn; Wed, 21 Mar 2018 07:38:22 -0700 (PDT) X-Google-Smtp-Source: AG47ELs5LkHls5VpfTT1M45XHqOsO7uxAt6j/q1DhtaI4kNJm3Oat9FqkCKzEXz9quaQ/zSp8HHL X-Received: by 10.99.116.30 with SMTP id p30mr15187965pgc.60.1521643102380; Wed, 21 Mar 2018 07:38:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521643102; cv=none; d=google.com; s=arc-20160816; b=LPFg+yOP9qbgAbKi/cazFV7Es6KPzOfFA0MGxQRB260YLoAK9KwxcLIbgibgJUBGPt 0T9in38npPaBhIqmsEj6ySo8+B7NbGGDiEcQ7GT6Do9cE/jcSKMWp3UU5rBS4iMItBgU I8l4YMZmgNKAwdht+V5JpmnHWB2DyqpusZdkVXG3NcZHUrAAEC6oNX4NphdgYD4nh/x5 aXgFk9VuM5CDpSGK81ZRxHj3w7DL+H2iBhmFKts5wqRCGFYe/JBVVGW3uuWal0o37Woj c77/D6Lum53ZzCvKv7muo7hqcQQ6Xz3br3dm5NXzDkTRsBDIU4Jj8PxOB1DCr/aQ7ziI PrhQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=LFOTQm0+0EdMBbj9fBQ79jDMo9oJz+t/hsirLTH0DzY=; b=ICje5aMaCDX5nMz+9usqRrt6taeRpPJ8wElq071kKG0oZNf/GuzLpGTxsd7WsJ+bL4 D+GeHiZD+PaeYUQB5YbMFAdc+vopFlE2xE6GfQBkNDnbmZA/R8ANK3IpYBtFQNRB7UwM fh7aP6PPLvwHH43ZZZ54GDpOKNTxMdYqXxKM+Yam2UhBiCWlkcY7bz9YUs4Az6t7fUK6 vooII2r63AftFVsufQXIKysg38VgeIAPGh4B2JF4f9jdVpep9GdgO0VHsKcvK4bG146w WmAJ/xw6wpp8GlZ64W3Ng0KNYf7s7cvXTSyxwVr4ltFOO5pfMx5WdETRrH16/7HKdE16 +CeQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=C+8of2K8; 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 u25si2821386pgv.221.2018.03.21.07.38.06; Wed, 21 Mar 2018 07:38:22 -0700 (PDT) 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; dkim=fail header.i=@gmail.com header.s=20161025 header.b=C+8of2K8; 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 S1752123AbeCUOgn (ORCPT + 99 others); Wed, 21 Mar 2018 10:36:43 -0400 Received: from mail-oi0-f67.google.com ([209.85.218.67]:44444 "EHLO mail-oi0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751881AbeCUOgl (ORCPT ); Wed, 21 Mar 2018 10:36:41 -0400 Received: by mail-oi0-f67.google.com with SMTP id 23-v6so4468320oir.11; Wed, 21 Mar 2018 07:36:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=LFOTQm0+0EdMBbj9fBQ79jDMo9oJz+t/hsirLTH0DzY=; b=C+8of2K8wc1vMoJIr0+ZiXuNXvVXC25vH6ZxaCpv87KpYSrGa9AqB2vhBOMaemgRi/ IhTVvzJU7ObO4uXYAo+g4Au/PwocTds7YskuY1uHiZzs3uxdyw653i1eu8MquTkiqUxS PbUoWn6/QirraD/YMh4oDp7/w+hpvxRKQhZzskHRS34R3F+ejFEeWQFZRAmCd2trt6fu JafG6+vA03/owPEODA2zoeUFzIrmwzV48NXefZW4DqgfBdeTVmxC59a+Tqfg/07xcJhn odkuiIBp0eGXjrEJ1HdCl7S9C5EmynXYO1JnkjXknCZg7XUWmbngTTONZhEWWXB9T1/q LKRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=LFOTQm0+0EdMBbj9fBQ79jDMo9oJz+t/hsirLTH0DzY=; b=TjcwevfM4QSYju+mqzG5TmmUBWoSA6NkHoXmVyPfPi95YVi7UESBqOHMQukzGMLpZb XJ6UvFPQC8Pz+ULmIqgv584GlWb7ffDh2xS+yHbzc1P2Fb0mcfZf/skkHtUHMYIqg/GQ KmQDl+8sNaqVg+b5wLmi1Zu1mtVsYEddAEcgZn+TASrUlzspDYoFzybeMOR0lMP8FlUo 211HbPMr/vz7V1cVQBrJfKMjIIhoBVxhvr4B0EeD2owIuyv3d86RQoidhzlC/+JMoRf3 4jmYkhQnCj2Jjl40XrhZEZyxWK1wNJyvyCt0WGixxc6gcDEn1F2jOpZxFDVDRAeCNrQP FFuw== X-Gm-Message-State: AElRT7GJNy33NkcJgHd7OHekeQnDEER1S+UIY+958ogiq6dpHow8sc3l W9YQavY5FaVYjyplRSvZ5z75KhAJ8tYDFcb5L2tVdA== X-Received: by 10.202.9.19 with SMTP id 19mr5651252oij.358.1521643000326; Wed, 21 Mar 2018 07:36:40 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a9d:9f7:0:0:0:0:0 with HTTP; Wed, 21 Mar 2018 07:36:39 -0700 (PDT) In-Reply-To: <1635957.yuHkCe9oyz@aspire.rjw.lan> References: <2390019.oHdSGtR3EE@aspire.rjw.lan> <1635957.yuHkCe9oyz@aspire.rjw.lan> From: "Rafael J. Wysocki" Date: Wed, 21 Mar 2018 15:36:39 +0100 X-Google-Sender-Auth: E_AZozhau3AO2JO-kOhyyprec2Q Message-ID: Subject: Re: [RFT][PATCH v7 5/8] cpuidle: Return nohz hint from cpuidle_select() To: Linux PM Cc: Peter Zijlstra , Frederic Weisbecker , Thomas Gleixner , Paul McKenney , Thomas Ilsche , Doug Smythies , Rik van Riel , Aubrey Li , Mike Galbraith , LKML Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Mar 20, 2018 at 4:45 PM, Rafael J. Wysocki wrote: > From: Rafael J. Wysocki > > Add a new pointer argument to cpuidle_select() and to the ->select > cpuidle governor callback to allow a boolean value indicating > whether or not the tick should be stopped before entering the > selected state to be returned from there. > > Make the ladder governor ignore that pointer (to preserve its > current behavior) and make the menu governor return 'false" through > it if: > (1) the idle exit latency is constrained at 0, or > (2) the selected state is a polling one, or > (3) the expected idle period duration is within the tick period > range. > > In addition to that, the correction factor computations in the menu > governor need to take the possibility that the tick may not be > stopped into account to avoid artificially small correction factor > values. To that end, add a mechanism to record tick wakeups, as > suggested by Peter Zijlstra, and use it to modify the menu_update() > behavior when tick wakeup occurs. Namely, make it add a (sufficiently > large) constant value to the correction factor in these cases (instead > of increasing the correction factor by a value based on the > measured idle time). > > Since the value returned through the new argument pointer of > cpuidle_select() is not used by its caller yet, this change by > itself is not expected to alter the functionality of the code. > > Signed-off-by: Rafael J. Wysocki > --- > > v5 -> v7: > * Rename the new cpuidle_select() arg (and some related things) from > "nohz" to "stop_tick" (as requested by Peter). > * Use TICK_USEC from the previous patch. > * Record tick wakeups (as suggested by Peter) and use them to take the > tick into account in menu_update(). [cut] > @@ -427,31 +449,44 @@ static void menu_update(struct cpuidle_d > * assume the state was never reached and the exit latency is 0. > */ > > - /* measured value */ > - measured_us = cpuidle_get_last_residency(dev); > - > - /* Deduct exit latency */ > - if (measured_us > 2 * target->exit_latency) > - measured_us -= target->exit_latency; > - else > - measured_us /= 2; > - > - /* Make sure our coefficients do not exceed unity */ > - if (measured_us > data->next_timer_us) > - measured_us = data->next_timer_us; > - > /* Update our correction ratio */ > new_factor = data->correction_factor[data->bucket]; > new_factor -= new_factor / DECAY; > > - if (data->next_timer_us > 0 && measured_us < MAX_INTERESTING) > - new_factor += RESOLUTION * measured_us / data->next_timer_us; > - else > + if (data->tick_wakeup) { This should check if data->next_timer_us is greater than TICK_USEC too, but also the measured_us computation needs to go before it (or uninitialized measured_us will be used later on if this branch is executed). So please disregard this one entirely and take the v7.2 replacement instead of it: https://patchwork.kernel.org/patch/10299429/ The current versions (including the above) is in the git branch at git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git \ idle-loop-v7.2 > /* > - * we were idle so long that we count it as a perfect > - * prediction > + * If the CPU was woken up by the tick, it might have been idle > + * for a much longer time if the tick had been stopped. That > + * time cannot be determined, so asssume that it would have been > + * long, but not as long as the original return value of > + * tick_nohz_get_sleep_length(). Use a number between 0.5 and > + * 1, something like 0.75 (which is easy enough to get), that > + * should work on the average. > */ > - new_factor += RESOLUTION; > + new_factor += RESOLUTION / 2 + RESOLUTION / 4; > + } else { > + /* measured value */ > + measured_us = cpuidle_get_last_residency(dev); > + > + /* Deduct exit latency */ > + if (measured_us > 2 * target->exit_latency) > + measured_us -= target->exit_latency; > + else > + measured_us /= 2; > + > + /* Make sure our coefficients do not exceed unity */ > + if (measured_us > data->next_timer_us) > + measured_us = data->next_timer_us; > + > + if (data->next_timer_us > 0 && measured_us < MAX_INTERESTING) > + new_factor += RESOLUTION * measured_us / data->next_timer_us; > + else > + /* > + * we were idle so long that we count it as a perfect > + * prediction > + */ > + new_factor += RESOLUTION; > + } > > /* > * We don't want 0 as factor; we always want at least