On Fri, 9 Nov 2018 09:12:09 +0100 Vlastimil Babka <vba...@suse.cz> wrote:
> Multiple people have reported the following sparse warning: > > ./include/linux/slab.h:332:43: warning: dubious: x & !y > > The minimal fix would be to change the logical & to boolean &&, which emits > the > same code, but Andrew has suggested that the branch-avoiding tricks are maybe > not worthwile. David Laight provided a nice comparison of disassembly of > multiple variants, which shows that the current version produces a 4 deep > dependency chain, and fixing the sparse warning by changing logical and to > multiplication emits an IMUL, making it even more expensive. > > The code as rewritten by this patch yielded the best disassembly, with a > single > predictable branch for the most common case, and a ternary operator for the > rest, which gcc seems to compile without a branch or cmov by itself. > > The result should be more readable, without a sparse warning and probably also > faster for the common case. > > Reported-by: Bart Van Assche <bvanass...@acm.org> > Reported-by: Darryl T. Agostinelli <dagostine...@gmail.com> > Suggested-by: Andrew Morton <a...@linux-foundation.org> > Suggested-by: David Laight <david.lai...@aculab.com> > Fixes: 1291523f2c1d ("mm, slab/slub: introduce kmalloc-reclaimable caches") > Signed-off-by: Vlastimil Babka <vba...@suse.cz> > --- > include/linux/slab.h | 24 ++++++++++++------------ > 1 file changed, 12 insertions(+), 12 deletions(-) > > diff --git a/include/linux/slab.h b/include/linux/slab.h > index 918f374e7156..18c6920c2803 100644 > --- a/include/linux/slab.h > +++ b/include/linux/slab.h > @@ -304,6 +304,8 @@ enum kmalloc_cache_type { > KMALLOC_RECLAIM, > #ifdef CONFIG_ZONE_DMA > KMALLOC_DMA, > +#else > + KMALLOC_DMA = KMALLOC_NORMAL, > #endif > NR_KMALLOC_TYPES > }; I don't think this works correctly. Resetting KMALLOC_DMA to 0 will cause NR_KMALLOC_TYPES to have value 1. enum foo { a = 0, b, c = 0, d } main() { printf("%d %d %d %d\n", a, b, c, d); } akpm3> ./a.out 0 1 0 1