From patchwork Thu Apr 14 19:23:54 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Lezcano X-Patchwork-Id: 65843 Delivered-To: patch@linaro.org Received: by 10.140.93.198 with SMTP id d64csp782404qge; Thu, 14 Apr 2016 12:24:18 -0700 (PDT) X-Received: by 10.98.42.4 with SMTP id q4mr23303799pfq.23.1460661858521; Thu, 14 Apr 2016 12:24:18 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h17si8783815pfj.143.2016.04.14.12.24.18; Thu, 14 Apr 2016 12:24:18 -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=pass header.i=@linaro.org; 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=pass (p=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753668AbcDNTYP (ORCPT + 29 others); Thu, 14 Apr 2016 15:24:15 -0400 Received: from mail-wm0-f54.google.com ([74.125.82.54]:38905 "EHLO mail-wm0-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751017AbcDNTYM (ORCPT ); Thu, 14 Apr 2016 15:24:12 -0400 Received: by mail-wm0-f54.google.com with SMTP id u206so2488583wme.1 for ; Thu, 14 Apr 2016 12:24:11 -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; bh=KeyL7SlXiQlABDHaKmOJmRW7bLRAcV3GLQkjil3ZJ50=; b=ggrYB0qxgYFVxG/CsjgIeGGTr5+QPhy026zjgJzGWVymhT5OaQaJEmM4E/Jrd0/Xsz YGQc9OCU8GcuoQIdlUVmLPHj+lsx0AgIWku0DBBR7c6s3vm5ox1K642vwMWdFlvnNwqg /U2on4ozbj5sk25Y823Yd+3b4vILmP3TZmKos= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=KeyL7SlXiQlABDHaKmOJmRW7bLRAcV3GLQkjil3ZJ50=; b=awUO7NZmGQzgNoRT1e49XZxfjsieqewYokha5C0YJBM0/vNvkf9S1dDlAO/JsD4N9U LGwWDFINV62iJOJpQqbdP+DrYjPf/xIo38PYtMzyCWFIInia0B0zM2PjJDK+k+0bN2a7 KS4sdUV2pQglk4RYhgV7zvacSUT4U+HZAUGgpee0XoMP8yqPq4Ppk5Sky5WY/68lHjFf NRt5BGmIqlkbKVoSr55FM5Fix0+YURLneoIlT4U3r1Xa4YktCLUq2ZaKyh/qgvQw5zEX 1AnQ82Odf01QS/Bc0AJ3KwsI0QGJtnJXOYObYKdTd9aD00xRIxqMrhgt6szTtVFNnodz BXnA== X-Gm-Message-State: AOPr4FWu9Yy48K99SPrWztbyEGOY7EX1slbgVW56l6Ln5viEYxrhKHAaBhmNtfbOXe1Avi2z X-Received: by 10.28.195.139 with SMTP id t133mr321105wmf.14.1460661850457; Thu, 14 Apr 2016 12:24:10 -0700 (PDT) Received: from localhost.localdomain (sju31-1-78-210-255-2.fbx.proxad.net. [78.210.255.2]) by smtp.gmail.com with ESMTPSA id b1sm45366348wjy.0.2016.04.14.12.24.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 14 Apr 2016 12:24:09 -0700 (PDT) From: Daniel Lezcano To: rjw@rjwysocki.net Cc: peterz@infradead.org, mingo@kernel.org, linux-pm@vger.kernel.org (open list:CPUIDLE DRIVERS), linux-kernel@vger.kernel.org (open list) Subject: [PATCH] cpuidle: Change ktime_get() with local_clock() Date: Thu, 14 Apr 2016 21:23:54 +0200 Message-Id: <1460661834-5683-1-git-send-email-daniel.lezcano@linaro.org> X-Mailer: git-send-email 1.9.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The ktime_get() can have a non negligeable overhead, use local_clock() instead. In order to test the difference between ktime_get() and local_clock(), a quick hack has been added to trigger, via debugfs, 10000 times a call to ktime_get() and local_clock() and measure the elapsed time. Then the average value, the min and max is computed for each call. >From userspace, the test above was called 100 times every 2 seconds. So, ktime_get() and local_clock() have been called 1000000 times in total. The results are: ktime_get(): -- 1.9.1 ============ * average: 101 ns (stddev: 27.4) * maximum: 38313 ns * minimum: 65 ns local_clock(): ============== * average: 60 ns (stddev: 9.8) * maximum: 13487 ns * minimum: 46 ns The local_clock() is faster and more stable. Even if it is a drop in the ocean, changing the ktime_get() by the local_clock() allows to save 80ns at idle time (entry + exit). And in some circumstances, especially when there are several CPUs racing for the clock access, we save tens of microseconds. Signed-off-by: Daniel Lezcano --- drivers/cpuidle/cpuidle.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index f996efc..78447bc 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c @@ -173,7 +173,7 @@ int cpuidle_enter_state(struct cpuidle_device *dev, struct cpuidle_driver *drv, struct cpuidle_state *target_state = &drv->states[index]; bool broadcast = !!(target_state->flags & CPUIDLE_FLAG_TIMER_STOP); - ktime_t time_start, time_end; + u64 time_start, time_end; s64 diff; /* @@ -195,13 +195,13 @@ int cpuidle_enter_state(struct cpuidle_device *dev, struct cpuidle_driver *drv, sched_idle_set_state(target_state); trace_cpu_idle_rcuidle(index, dev->cpu); - time_start = ktime_get(); + time_start = local_clock(); stop_critical_timings(); entered_state = target_state->enter(dev, drv, index); start_critical_timings(); - time_end = ktime_get(); + time_end = local_clock(); trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, dev->cpu); /* The cpu is no longer idle or about to enter idle. */ @@ -217,7 +217,11 @@ int cpuidle_enter_state(struct cpuidle_device *dev, struct cpuidle_driver *drv, if (!cpuidle_state_is_coupled(drv, entered_state)) local_irq_enable(); - diff = ktime_to_us(ktime_sub(time_end, time_start)); + /* + * local_clock() returns the time in nanosecond, let's shift + * by 10 (divide by 1024) to have microsecond based time. + */ + diff = (time_end - time_start) >> 10; if (diff > INT_MAX) diff = INT_MAX;