Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752745AbcCJPKs (ORCPT ); Thu, 10 Mar 2016 10:10:48 -0500 Received: from www.linutronix.de ([62.245.132.108]:33347 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751383AbcCJPKk (ORCPT ); Thu, 10 Mar 2016 10:10:40 -0500 From: Richard Cochran To: Cc: , Dirk Brandewie , "Rafael J. Wysocki" , Viresh Kumar Subject: [PATCH] cpufreq: Make cpufreq_quick_get() safe to call. Date: Thu, 10 Mar 2016 16:10:36 +0100 Message-Id: <1457622636-10028-1-git-send-email-rcochran@linutronix.de> X-Mailer: git-send-email 1.7.10.4 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1299 Lines: 40 The function, cpufreq_quick_get, accesses the global 'cpufreq_driver' and its fields without taking the associated lock, cpufreq_driver_lock. Without the locking, nothing guarantees that 'cpufreq_driver' remains consistent during the call. This patch fixes the issue by taking the lock before accessing the data structure. Cc: Dirk Brandewie Cc: Rafael J. Wysocki Cc: Viresh Kumar Signed-off-by: Richard Cochran --- drivers/cpufreq/cpufreq.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index e979ec7..ce02b2b 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -1457,9 +1457,17 @@ unsigned int cpufreq_quick_get(unsigned int cpu) { struct cpufreq_policy *policy; unsigned int ret_freq = 0; + unsigned long flags; + + read_lock_irqsave(&cpufreq_driver_lock, flags); if (cpufreq_driver && cpufreq_driver->setpolicy && cpufreq_driver->get) - return cpufreq_driver->get(cpu); + ret_freq = cpufreq_driver->get(cpu); + + read_unlock_irqrestore(&cpufreq_driver_lock, flags); + + if (ret_freq) + return ret_freq; policy = cpufreq_cpu_get(cpu); if (policy) { -- 2.1.4