[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 4/4] bitmaps/bitops: Clarify tests for small constant size.
>>> On 27.02.14 at 17:38, Tim Deegan <tim@xxxxxxx> wrote: > From dba941064825d723b79f866d16bb0f07585de320 Mon Sep 17 00:00:00 2001 > From: Tim Deegan <tim@xxxxxxx> > Date: Thu, 28 Nov 2013 15:40:48 +0000 > Subject: [PATCH] bitmaps/bitops: Clarify tests for small constant size. > > No semantic changes, just makes the control flow a bit clearer. > > I was looking at this bcause the (-!__builtin_constant_p(x) | x__) > formula is too clever for Coverity, but in fact it always takes me a > minute or two to understand it too. :) > > Signed-off-by: Tim Deegan <tim@xxxxxxx> A little reluctantly Acked-by: Jan Beulich <jbeulich@xxxxxxxx> > --- > > v3: Consistenly use '!foo' rather than 'foo == 0' > v2: fix find_next_bit macros to evaluate 'addr' exactly once. > --- > xen/include/asm-x86/bitops.h | 62 > ++++++++++++++++++++------------------------ > xen/include/xen/bitmap.h | 30 ++++++++++++--------- > 2 files changed, 46 insertions(+), 46 deletions(-) > > diff --git a/xen/include/asm-x86/bitops.h b/xen/include/asm-x86/bitops.h > index ab21d92..82a08ee 100644 > --- a/xen/include/asm-x86/bitops.h > +++ b/xen/include/asm-x86/bitops.h > @@ -335,23 +335,20 @@ static inline unsigned int __scanbit(unsigned long val, > unsigned long max) > * @offset: The bitnumber to start searching at > * @size: The maximum size to search > */ > -#define find_next_bit(addr, size, off) ({ \ > - unsigned int r__ = (size); \ > - unsigned int o__ = (off); \ > - switch ( -!__builtin_constant_p(size) | r__ ) \ > - { \ > - case 0: (void)(addr); break; \ > - case 1 ... BITS_PER_LONG: \ > - r__ = o__ + __scanbit(*(const unsigned long *)(addr) >> o__, r__); \ > - break; \ > - default: \ > - if ( __builtin_constant_p(off) && !o__ ) \ > - r__ = __find_first_bit(addr, r__); \ > - else \ > - r__ = __find_next_bit(addr, r__, o__); \ > - break; \ > - } \ > - r__; \ > +#define find_next_bit(addr, size, off) ({ > \ > + unsigned int r__; > \ > + const unsigned long *a__ = (addr); > \ > + unsigned int s__ = (size); > \ > + unsigned int o__ = (off); > \ > + if ( __builtin_constant_p(size) && !s__ ) \ > + r__ = s__; > \ > + else if ( __builtin_constant_p(size) && s__ <= BITS_PER_LONG ) \ > + r__ = o__ + __scanbit(*(const unsigned long *)(a__) >> o__, s__); \ > + else if ( __builtin_constant_p(off) && !o__ ) \ > + r__ = __find_first_bit(a__, s__); > \ > + else > \ > + r__ = __find_next_bit(a__, s__, o__); > \ > + r__; > \ > }) > > /** > @@ -370,23 +367,20 @@ static inline unsigned int __scanbit(unsigned long val, > unsigned long max) > * @offset: The bitnumber to start searching at > * @size: The maximum size to search > */ > -#define find_next_zero_bit(addr, size, off) ({ \ > - unsigned int r__ = (size); \ > - unsigned int o__ = (off); \ > - switch ( -!__builtin_constant_p(size) | r__ ) \ > - { \ > - case 0: (void)(addr); break; \ > - case 1 ... BITS_PER_LONG: \ > - r__ = o__ + __scanbit(~*(const unsigned long *)(addr) >> o__, r__); \ > - break; \ > - default: \ > - if ( __builtin_constant_p(off) && !o__ ) \ > - r__ = __find_first_zero_bit(addr, r__); \ > - else \ > - r__ = __find_next_zero_bit(addr, r__, o__); \ > - break; \ > - } \ > - r__; \ > +#define find_next_zero_bit(addr, size, off) ({ > \ > + unsigned int r__; > \ > + const unsigned long *a__ = (addr); > \ > + unsigned int s__ = (size); > \ > + unsigned int o__ = (off); > \ > + if ( __builtin_constant_p(size) && !s__ ) \ > + r__ = s__; > \ > + else if ( __builtin_constant_p(size) && s__ <= BITS_PER_LONG ) \ > + r__ = o__ + __scanbit(~*(const unsigned long *)(a__) >> o__, s__); \ > + else if ( __builtin_constant_p(off) && !o__ ) \ > + r__ = __find_first_zero_bit(a__, s__); > \ > + else > \ > + r__ = __find_next_zero_bit(a__, s__, o__); > \ > + r__; > \ > }) > > /** > diff --git a/xen/include/xen/bitmap.h b/xen/include/xen/bitmap.h > index b5ec455..e2a3686 100644 > --- a/xen/include/xen/bitmap.h > +++ b/xen/include/xen/bitmap.h > @@ -110,13 +110,14 @@ extern int bitmap_allocate_region(unsigned long > *bitmap, int pos, int order); > > #define bitmap_bytes(nbits) (BITS_TO_LONGS(nbits) * sizeof(unsigned long)) > > -#define bitmap_switch(nbits, zero_ret, small, large) \ > - switch (-!__builtin_constant_p(nbits) | (nbits)) { \ > - case 0: return zero_ret; \ > - case 1 ... BITS_PER_LONG: \ > - small; break; \ > - default: \ > - large; break; \ > +#define bitmap_switch(nbits, zero, small, large) \ > + unsigned int n__ = (nbits); \ > + if (__builtin_constant_p(nbits) && !n__) { \ > + zero; \ > + } else if (__builtin_constant_p(nbits) && n__ <= BITS_PER_LONG) { \ > + small; \ > + } else { \ > + large; \ > } > > static inline void bitmap_zero(unsigned long *dst, int nbits) > @@ -191,7 +192,8 @@ static inline void bitmap_complement(unsigned long *dst, > const unsigned long *sr > static inline int bitmap_equal(const unsigned long *src1, > const unsigned long *src2, int nbits) > { > - bitmap_switch(nbits, -1, > + bitmap_switch(nbits, > + return -1, > return !((*src1 ^ *src2) & BITMAP_LAST_WORD_MASK(nbits)), > return __bitmap_equal(src1, src2, nbits)); > } > @@ -199,7 +201,8 @@ static inline int bitmap_equal(const unsigned long *src1, > static inline int bitmap_intersects(const unsigned long *src1, > const unsigned long *src2, int nbits) > { > - bitmap_switch(nbits, -1, > + bitmap_switch(nbits, > + return -1, > return ((*src1 & *src2) & BITMAP_LAST_WORD_MASK(nbits)) != 0, > return __bitmap_intersects(src1, src2, nbits)); > } > @@ -207,21 +210,24 @@ static inline int bitmap_intersects(const unsigned long > *src1, > static inline int bitmap_subset(const unsigned long *src1, > const unsigned long *src2, int nbits) > { > - bitmap_switch(nbits, -1, > + bitmap_switch(nbits, > + return -1, > return !((*src1 & ~*src2) & BITMAP_LAST_WORD_MASK(nbits)), > return __bitmap_subset(src1, src2, nbits)); > } > > static inline int bitmap_empty(const unsigned long *src, int nbits) > { > - bitmap_switch(nbits, -1, > + bitmap_switch(nbits, > + return -1, > return !(*src & BITMAP_LAST_WORD_MASK(nbits)), > return __bitmap_empty(src, nbits)); > } > > static inline int bitmap_full(const unsigned long *src, int nbits) > { > - bitmap_switch(nbits, -1, > + bitmap_switch(nbits, > + return -1, > return !(~*src & BITMAP_LAST_WORD_MASK(nbits)), > return __bitmap_full(src, nbits)); > } > -- > 1.8.5.2 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |