Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp523954ybi; Fri, 12 Jul 2019 00:06:11 -0700 (PDT) X-Google-Smtp-Source: APXvYqzXGPwS6WPkvF1Nxih+E8m0OdymRT/8+hCTkKD6Zu4zGdxP2K2gkq1zr5glDMHnLdXmjwZT X-Received: by 2002:a17:902:8f93:: with SMTP id z19mr9200044plo.97.1562915171724; Fri, 12 Jul 2019 00:06:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1562915171; cv=none; d=google.com; s=arc-20160816; b=kK3N+LZjONrpeQRv+JWGyoWYOZ6DWAWsjMmBmWQnE5CtAAsZEqGUEahCPXk4UGtSgQ NuFjg0edBZLMJku366ohaNxPOuR9A2CcSBAjzjhwYTnAc2y7wvKt9D88zY5oyLERiSxu WKZXRGrJUcM94pvOeRwTaOOgRv3N1xJ+u6Uf+nLpJBPGqEf4k0L1kgdEyzTfsTfRG3Yr Q4S0zK+6lDbWQBGABDDqYzSEL2R0evFZjfGOf7TqCsvpb86quXkOnRcIIZ3ONbTmt7vl jINA6I2fovF4aUOy+tLdd+d+7PoSjGYhBUC5PILJ8VYN0hbIL66RibxQ9seiSdVNiw3a IIDQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from; bh=c1hSVDEnLfAnysydW/t3Kzld48P0S2vi5yKeZthh9is=; b=UJImroD9FwpDeUy7U3cvi4VDyhYUnIkmpj32nXUqAy4/1XcBTayD0I2TjY0X/XeaNk oCFCz8mN50qIlxuJ0gH5Zg1UFvQ6u7NB1nU56xJiiKIuL+/IduXpKGKz2Tf3Q/RFlCkE YHzOVu1KWVsGjeBej62FgWMxZ9D7tuwUw/sAuHWVvTAWfiGjQ+rTBw0Ir/JnJq/HjHOO JXneGVQi44Y0n8GRFTTdhp9nlxe/36oioMVT4Nvh+Zn/G8vaUB563FlbNcnVI2aQE5mw 4X9V+crz+HdhTW20BOEOX3Rj0Zo+dV29IZhhgPb9bJEaWu8uBQwFu8V1fWlS9JSnIJlm TC2g== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m13si6813329pgv.398.2019.07.12.00.05.56; Fri, 12 Jul 2019 00:06:11 -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; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726132AbfGLHFd (ORCPT + 99 others); Fri, 12 Jul 2019 03:05:33 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:57730 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725840AbfGLHFd (ORCPT ); Fri, 12 Jul 2019 03:05:33 -0400 Received: from pps.filterd (m0098393.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.27/8.16.0.27) with SMTP id x6C6x9FA101465 for ; Fri, 12 Jul 2019 03:05:32 -0400 Received: from e06smtp01.uk.ibm.com (e06smtp01.uk.ibm.com [195.75.94.97]) by mx0a-001b2d01.pphosted.com with ESMTP id 2tpj35q5x0-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Fri, 12 Jul 2019 03:05:31 -0400 Received: from localhost by e06smtp01.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 12 Jul 2019 08:05:25 +0100 Received: from b06cxnps4074.portsmouth.uk.ibm.com (9.149.109.196) by e06smtp01.uk.ibm.com (192.168.101.131) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Fri, 12 Jul 2019 08:05:22 +0100 Received: from d06av21.portsmouth.uk.ibm.com (d06av21.portsmouth.uk.ibm.com [9.149.105.232]) by b06cxnps4074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id x6C75Lax48693436 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 12 Jul 2019 07:05:21 GMT Received: from d06av21.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 255AA52052; Fri, 12 Jul 2019 07:05:21 +0000 (GMT) Received: from boston16h.aus.stglabs.ibm.com (unknown [9.3.23.78]) by d06av21.portsmouth.uk.ibm.com (Postfix) with ESMTP id A2FEC52054; Fri, 12 Jul 2019 07:05:19 +0000 (GMT) From: Abhishek Goel To: linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-pm@vger.kernel.org Cc: npiggin@gmail.com, rjw@rjwysocki.net, daniel.lezcano@linaro.org, mpe@ellerman.id.au, ego@linux.vnet.ibm.com, dja@axtens.net, Abhishek Goel Subject: [PATCH v4 0/3] Forced-wakeup for stop states on Powernv Date: Fri, 12 Jul 2019 02:04:54 -0500 X-Mailer: git-send-email 2.17.1 X-TM-AS-GCONF: 00 x-cbid: 19071207-4275-0000-0000-0000034C64FA X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 19071207-4276-0000-0000-0000385C6E06 Message-Id: <20190712070457.55242-1-huntbag@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2019-07-12_02:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000 definitions=main-1907120071 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently, the cpuidle governors determine what idle state a idling CPU should enter into based on heuristics that depend on the idle history on that CPU. Given that no predictive heuristic is perfect, there are cases where the governor predicts a shallow idle state, hoping that the CPU will be busy soon. However, if no new workload is scheduled on that CPU in the near future, the CPU will end up in the shallow state. Motivation ---------- In case of POWER, this is problematic, when the predicted state in the aforementioned scenario is a shallow stop state on a tickless system. As we might get stuck into shallow states even for hours, in absence of ticks or interrupts. To address this, We forcefully wakeup the cpu by setting the decrementer. The decrementer is set to a value that corresponds with the residency of the next available state. Thus firing up a timer that will forcefully wakeup the cpu. Few such iterations will essentially train the governor to select a deeper state for that cpu, as the timer here corresponds to the next available cpuidle state residency. Thus, cpu will eventually end up in the deepest possible state and we won't get stuck in a shallow state for long duration. Experiment ---------- For earlier versions when this feature was meat to be only for shallow lite states, I performed experiments for three scenarios to collect some data. case 1 : Without this patch and without tick retained, i.e. in a upstream kernel, It would spend more than even a second to get out of stop0_lite. case 2 : With tick retained in a upstream kernel - Generally, we have a sched tick at 4ms(CONF_HZ = 250). Ideally I expected it to take 8 sched tick to get out of stop0_lite. Experimentally, observation was ========================================================= sample min max 99percentile 20 4ms 12ms 4ms ========================================================= It would take atleast one sched tick to get out of stop0_lite. case 2 : With this patch (not stopping tick, but explicitly queuing a timer) ============================================================ sample min max 99percentile ============================================================ 20 144us 192us 144us ============================================================ Description of current implementation ------------------------------------- We calculate timeout for the current idle state as the residency value of the next available idle state. If the decrementer is set to be greater than this timeout, we update the decrementer value with the residency of next available idle state. Thus, essentially training the governor to select the next available deeper state until we reach the deepest state. Hence, we won't get stuck unnecessarily in shallow states for longer duration. -------------------------------- v1 of auto-promotion : https://lkml.org/lkml/2019/3/22/58 This patch was implemented only for shallow lite state in generic cpuidle driver. v2 : Removed timeout_needed and rebased to current upstream kernel Then, v1 of forced-wakeup : Moved the code to cpuidle powernv driver and started as forced wakeup instead of auto-promotion v2 : Extended the forced wakeup logic for all states. Setting the decrementer instead of queuing up a hrtimer to implement the logic. v3 : 1) Cleanly handle setting the decrementer after exiting out of stop states. 2) Added a disable_callback feature to compute timeout whenever a state is enbaled or disabled instead of computing everytime in fast idle path. 3) Use disable callback to recompute timeout whenever state usage is changed for a state. Also, cleaned up the get_snooze_timeout function. v4 : Changed the type and name of set/reset decrementer function. Handled irq work pending in try_set_dec_before_idle. No change in patch 2 and 3. Abhishek Goel (3): cpuidle-powernv : forced wakeup for stop states cpuidle : Add callback whenever a state usage is enabled/disabled cpuidle-powernv : Recompute the idle-state timeouts when state usage is enabled/disabled arch/powerpc/include/asm/time.h | 2 ++ arch/powerpc/kernel/time.c | 43 ++++++++++++++++++++++++ drivers/cpuidle/cpuidle-powernv.c | 55 +++++++++++++++++++++++-------- drivers/cpuidle/sysfs.c | 15 ++++++++- include/linux/cpuidle.h | 5 +++ 5 files changed, 106 insertions(+), 14 deletions(-) -- 2.17.1