From patchwork Sun Aug 12 16:09:30 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo Yan X-Patchwork-Id: 10563687 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9216D174A for ; Sun, 12 Aug 2018 16:10:21 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 81A9C29466 for ; Sun, 12 Aug 2018 16:10:21 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7641A29469; Sun, 12 Aug 2018 16:10:21 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 172D429466 for ; Sun, 12 Aug 2018 16:10:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728339AbeHLSsk (ORCPT ); Sun, 12 Aug 2018 14:48:40 -0400 Received: from mail-wm0-f67.google.com ([74.125.82.67]:38793 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728294AbeHLSsj (ORCPT ); Sun, 12 Aug 2018 14:48:39 -0400 Received: by mail-wm0-f67.google.com with SMTP id t25-v6so6451108wmi.3 for ; Sun, 12 Aug 2018 09:10:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=V/KD4PZAGRjRkYZ8ZQmu8anS2A7JIpWJS7JiZdKweu4=; b=aAes6E+f295M09g4lYl2w+zmOWFBPesp3HWKkqOQ5wPP5kvZPb7W5oWINgh1HcevCw oqkiFY51eG1PKuRYLMhZ+6B5AcRNNzTuCtfUB5xloqeK9tSAkUa15MIGFDbIYy9AmU8N AYXGe4AeVpuXtaiZrDMTZjIay1m0kZOJIQcQY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=V/KD4PZAGRjRkYZ8ZQmu8anS2A7JIpWJS7JiZdKweu4=; b=nF1N3NcVyiG4AKSxdG9v1x9BJIlEYE3l8Hy7aJBRAWr+Pi0iPfSewFQLeapk8iI+kQ vhdCgcet6gnhXeIt1T9fobXTKEDZE40ROCWQEwOKaHE9Y0ysyhcT1eOFLVFZS9x4gtwX vhfuhvYmIbtaKJxcJa0xnc3pec84WkRMm2SjKfqE06A0x1V1b7oImcQkHbWEyXswho5r ypPyPzbUE+SUGsKJq6Ca8toFwDtuRb8zjoE5lYS/fka3bUABG8cZokcMsBWMcI/rcN0t wTQiSFdSK08w+CwVrxukcc87KmII1G1xMJyttjmiAxKhIYvgTSZgaPQpIlc+xBliqYdi RmOg== X-Gm-Message-State: AOUpUlEn7cE5FrsnGj6PL+38mmr4CzXBDNJgm+3pzem8TOD3h4ME8Zu7 oXzvFHex9kVekzHzYiA8X3IqaA== X-Google-Smtp-Source: AA+uWPwUjljUvyDSo5RIJEKnpg6GAQDUGnFPU/b15XwILTLs5Oxj4ZvrxXpODptJ+gh11ntgmMPFYA== X-Received: by 2002:a1c:4885:: with SMTP id v127-v6mr5928679wma.161.1534090207747; Sun, 12 Aug 2018 09:10:07 -0700 (PDT) Received: from localhost.localdomain ([45.76.138.171]) by smtp.gmail.com with ESMTPSA id t6-v6sm7437369wmf.8.2018.08.12.09.10.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 12 Aug 2018 09:10:06 -0700 (PDT) From: Leo Yan To: "Rafael J. Wysocki" , "Peter Zijlstra (Intel)" , Daniel Lezcano , Vincent Guittot , Ramesh Thomas , linux-kernel@vger.kernel.org, Linux PM Cc: Leo Yan Subject: [PATCH v1 4/5] cpuidle: menu: Don't stay in shallow state for a long time Date: Mon, 13 Aug 2018 00:09:30 +0800 Message-Id: <1534090171-14464-5-git-send-email-leo.yan@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1534090171-14464-1-git-send-email-leo.yan@linaro.org> References: <1534090171-14464-1-git-send-email-leo.yan@linaro.org> Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP To avoid staying in a shallow state for a long time, the menu governor relies on not stopping tick when detects the prediction is shorter than the tick event. This is just luckily to cover most cases but cannot say it is completely safe. For example, if the prediction is 2000us and the TICK_USEC=1000 so it's impossible to meet the condition 'data->predicted_us < TICK_USEC' and this lead to stop the tick for a shallow state; finally the CPU is possible to stay in this shallow state for very long time. This patch checks the candidate idle state isn't deepest one and find if the timer will come after more than 2 times of the maximum target residency, though the governor selects a shallow state according to prediction, due the timer is most reliable waken up source but it will come very late, so the CPU has chance to stay in the shallow state for a long time; the patch doesn't stop the tick for this case so can avoid powernightmares issue. Signed-off-by: Leo Yan --- drivers/cpuidle/governors/menu.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c index 4f02207..566c65c 100644 --- a/drivers/cpuidle/governors/menu.c +++ b/drivers/cpuidle/governors/menu.c @@ -284,6 +284,10 @@ static unsigned int get_typical_interval(struct menu_device *data) static bool menu_decide_stopping_tick(struct cpuidle_driver *drv, struct menu_device *data, int idx) { + int max_target_residency; + + max_target_residency = drv->states[drv->state_count-1].target_residency; + /* * If the tick has been stopped yet, force to stop it afterwards and * don't give chance to set *stop_tick to false. @@ -302,6 +306,23 @@ static bool menu_decide_stopping_tick(struct cpuidle_driver *drv, if (data->predicted_us < TICK_USEC) return false; + /* + * The candidate idle state isn't deepest one, on the other hand + * the most reliable wakeup source is timer (compare against to + * interrupts) says it will come after more than 2 times of maximum + * target residency, this means the CPU has risk to stay in shallow + * state for more than 2 times of maximum target residency. + * + * It's acceptable to stay in the shallow state at this time but we + * need to ensure to wake up the CPU by tick to check if has better + * choice. Finally it can have choice to select deeper state and + * avoid the CPU staying in shallow state for very long time and + * without any wake up event. + */ + if (idx < drv->state_count - 1 && + data->next_timer_us > max_target_residency * 2) + return false; + /* Otherwise, let's stop the tick at this time. */ return true; }