Messages in this thread | | | Subject | Re: [PATCH] slab.h: Avoid using & for logical and of booleans | From | Bart Van Assche <> | Date | Mon, 05 Nov 2018 16:01:06 -0800 |
| |
On Mon, 2018-11-05 at 14:48 -0800, Alexander Duyck wrote: > On Mon, Nov 5, 2018 at 2:41 PM Bart Van Assche <bvanassche@acm.org> wrote: > > How about this version, still untested? My compiler is able to evaluate > > the switch expression if the argument is constant. > > > > static __always_inline enum kmalloc_cache_type kmalloc_type(gfp_t flags) > > { > > - int is_dma = 0; > > - int type_dma = 0; > > - int is_reclaimable; > > + unsigned int dr = !!(flags & __GFP_RECLAIMABLE); > > > > #ifdef CONFIG_ZONE_DMA > > - is_dma = !!(flags & __GFP_DMA); > > - type_dma = is_dma * KMALLOC_DMA; > > + dr |= !!(flags & __GFP_DMA) << 1; > > #endif > > > > - is_reclaimable = !!(flags & __GFP_RECLAIMABLE); > > - > > /* > > * If an allocation is both __GFP_DMA and __GFP_RECLAIMABLE, return > > * KMALLOC_DMA and effectively ignore __GFP_RECLAIMABLE > > */ > > - return type_dma + (is_reclaimable & !is_dma) * KMALLOC_RECLAIM; > > + switch (dr) { > > + default: > > + case 0: > > + return 0; > > + case 1: > > + return KMALLOC_RECLAIM; > > + case 2: > > + case 3: > > + return KMALLOC_DMA; > > + } > > } > > Doesn't this defeat the whole point of the code which I thought was to > avoid conditional jumps and branches? Also why would you bother with > the "dr" value when you could just mask the flags value and switch on > that directly?
Storing the relevant bits of 'flags' in the 'dr' variable avoids that the bit selection expressions have to be repeated and allows to use a switch statement instead of multiple if / else statements.
Most kmalloc() calls pass a constant to the gfp argument. That allows the compiler to evaluate kmalloc_type() at compile time. So the conditional jumps and branches only appear when the gfp argument is not a constant. What makes you think it is important to optimize for that case?
Bart.
| |