From mboxrd@z Thu Jan 1 00:00:00 1970 From: Juergen Gross Subject: Re: [PATCH 0/5] use mask operations instead of test_bit() Date: Fri, 2 Oct 2015 11:10:19 +0200 Message-ID: <560E49FB.2020406@suse.com> References: <1443760830-29095-1-git-send-email-jgross@suse.com> <1443776609.14525.41.camel@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1443776609.14525.41.camel@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Dario Faggioli Cc: george.dunlap@eu.citrix.com, andrew.cooper3@citrix.com, keir@xen.org, jbeulich@suse.com, xen-devel List-Id: xen-devel@lists.xenproject.org On 10/02/2015 11:03 AM, Dario Faggioli wrote: > On Fri, 2015-10-02 at 06:40 +0200, Juergen Gross wrote: >> Instead of using test_bit() which is an atomic operation and limits >> the compiler's choices to do optimization, use logical ANDs with >> bitmasks where possible. >> > That's a good idea, I think. It's a fallout from a cleanup patch: http://lists.xen.org/archives/html/xen-devel/2015-09/msg03184.html > >> The possible candidates have been detected by searching definitions >> of bitmasks in the form: >> >> #define MASK 1 << _MASK >> > Right. > >> On x86 the resulting code is slightly smaller (about 2 bytes for each >> case, checked via disassembly in few examples). >> >> I'm quite sure I didn't replace a test_bit() call required to be >> atomic, but I'd be grateful for a thorough review especially in the >> scheduler. >> > I'll have a deep look. Thanks. > One question, can we introduce a __test_bit() macro/inline function, > like Jan did with __set_bit? In the thread mentioned above you'll find a discussion about exactly this idea between Jan and me. > I've quickly-&-dirtily tested this: > > #define __test_bit(nr, addr) ({ \ > unsigned _flags = 1 << nr; \ > addr & _flags; \ > }) > > and the result (I've checked a couple of cases) seems the same to me. The problem is the limited scope where this scheme is really working and is a better solution at the same time (nr must be a constant less than the numbers of bits of *addr). Juergen