From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751856AbbDCFmm (ORCPT ); Fri, 3 Apr 2015 01:42:42 -0400 Received: from mail-pa0-f46.google.com ([209.85.220.46]:35536 "EHLO mail-pa0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751005AbbDCFmj (ORCPT ); Fri, 3 Apr 2015 01:42:39 -0400 Message-ID: <551E2847.8020201@linaro.org> Date: Fri, 03 Apr 2015 11:12:31 +0530 From: viresh kumar User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 MIME-Version: 1.0 To: Peter Zijlstra CC: Thomas Gleixner , Ingo Molnar , Linaro Kernel Mailman List , Linux Kernel Mailing List Subject: Re: [PATCH 2/2] hrtimer: create for_each_active_base() to iterate over active clock-bases References: <909ec44dbfcc4898ecaf86f72e311f78756b21a8.1427959032.git.viresh.kumar@linaro.org> <20150402134519.GA23123@twins.programming.kicks-ass.net> In-Reply-To: <20150402134519.GA23123@twins.programming.kicks-ass.net> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2 April 2015 at 19:15, Peter Zijlstra wrote: > On Thu, Apr 02, 2015 at 04:21:22PM +0530, Viresh Kumar wrote: >> +#define for_each_active_base(_index, _base, _cpu_base, _active_bases) \ >> + for ((_active_bases) = (_cpu_base)->active_bases; \ >> + (_index) = ffs(_active_bases), \ >> + (_base) = (_cpu_base)->clock_base + (_index) - 1, (_index); \ >> + (_active_bases) &= ~(1 << ((_index) - 1))) > > Can't use ffs here, some people end up using asm-generic/bitops/ffs.h > and that sucks. > > Esp for small vectors like here, the unconditional iteration is faster. Okay what about this instead (This is the best I could write :).) ? +static inline int __next_bit(unsigned int active_bases, int bit) +{ + do { + if (active_bases & (1 << bit)) + return bit; + } while (++bit < HRTIMER_MAX_CLOCK_BASES); + + /* We should never reach here */ + return 0; +} +/* + * for_each_active_base: iterate over all active clock bases + * @_bit: 'int' variable for internal purpose + * @_base: holds pointer to a active clock base + * @_cpu_base: cpu base to iterate on + * @_active_bases: 'unsigned int' variable for internal purpose + */ +#define for_each_active_base(_bit, _base, _cpu_base, _active_bases) \ + for ((_active_bases) = (_cpu_base)->active_bases, (_bit) = -1; \ + (_active_bases) && \ + ((_bit) = __next_bit(_active_bases, ++_bit), \ + (_base) = (_cpu_base)->clock_base + _bit); \ + (_active_bases) &= ~(1 << (_bit))) + Tested it well with the help of: http://pastebin.com/cYyB513D, with inputs from 0 to 15. I will send it formally if it looks fine to you ..