From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757484AbcASTRv (ORCPT ); Tue, 19 Jan 2016 14:17:51 -0500 Received: from bombadil.infradead.org ([198.137.202.9]:47831 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755745AbcASTRn (ORCPT ); Tue, 19 Jan 2016 14:17:43 -0500 Date: Tue, 19 Jan 2016 20:17:34 +0100 From: Peter Zijlstra To: Juri Lelli Cc: Michael Turquette , Viresh Kumar , linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, rjw@rjwysocki.net, steve.muckle@linaro.org, vincent.guittot@linaro.org, morten.rasmussen@arm.com, dietmar.eggemann@arm.com Subject: Re: [RFC PATCH 18/19] cpufreq: remove transition_lock Message-ID: <20160119191734.GB6357@twins.programming.kicks-ass.net> References: <1452533760-13787-1-git-send-email-juri.lelli@arm.com> <1452533760-13787-19-git-send-email-juri.lelli@arm.com> <20160112112409.GJ1084@ubuntu> <20160113005452.10884.77606@quark.deferred.io> <20160113063148.GJ6050@ubuntu> <20160113182131.1168.45753@quark.deferred.io> <20160119140036.GG6344@twins.programming.kicks-ass.net> <20160119144233.GG8573@e106622-lin> <20160119153007.GZ6357@twins.programming.kicks-ass.net> <20160119160155.GH8573@e106622-lin> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160119160155.GH8573@e106622-lin> User-Agent: Mutt/1.5.21 (2012-12-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Jan 19, 2016 at 04:01:55PM +0000, Juri Lelli wrote: > Right, read path is fast, but write path still requires some sort of > locking (malloc, copy and update). So, I'm wondering if this still pays > off for a structure that gets written a lot. No, not at all. struct cpufreq_driver *driver; void sched_util_change(unsigned int util) { struct my_per_cpu_data *foo; rcu_read_lock(); foo = __this_cpu_ptr(rcu_dereference(driver)->data); if (foo) { if (abs(util - foo->last_util) > 10) { foo->last_util = util; foo->set_util(util); } } rcu_read_unlock(); } struct cpufreq_driver *cpufreq_flip_driver(struct cpufreq_driver *new_driver) { struct cpufreq_driver *old_driver; mutex_lock(&cpufreq_driver_lock); old_driver = driver; rcu_assign_driver(driver, new_driver); if (old_driver) synchronize_rcu(); mutex_unlock(&cpufreq_driver_lock); return old_driver; }