• Linus Torvalds's avatar
    minmax: avoid overly complicated constant expressions in VM code · 3a7e02c0
    Linus Torvalds authored
    The minmax infrastructure is overkill for simple constants, and can
    cause huge expansions because those simple constants are then used by
    other things.
    
    For example, 'pageblock_order' is a core VM constant, but because it was
    implemented using 'min_t()' and all the type-checking that involves, it
    actually expanded to something like 2.5kB of preprocessor noise.
    
    And when that simple constant was then used inside other expansions:
    
      #define pageblock_nr_pages      (1UL << pageblock_order)
      #define pageblock_start_pfn(pfn)  ALIGN_DOWN((pfn), pageblock_nr_pages)
    
    and we then use that inside a 'max()' macro:
    
    	case ISOLATE_SUCCESS:
    		update_cached = false;
    		last_migrated_pfn = max(cc->zone->zone_start_pfn,
    			pageblock_start_pfn(cc->migrate_pfn - 1));
    
    the end result was that one statement expanding to 253kB in size.
    
    There are probably other cases of this, but this one case certainly
    stood out.
    
    I've added 'MIN_T()' and 'MAX_T()' macros for this kind of "core simple
    constant with specific type" use.  These macros skip the type checking,
    and as such need to be very sparingly used only for obvious cases that
    have active issues like this.
    Reported-by: default avatarLorenzo Stoakes <lorenzo.stoakes@oracle.com>
    Link: https://lore.kernel.org/all/36aa2cad-1db1-4abf-8dd2-fb20484aabc3@lucifer.local/
    Cc: David Laight <David.Laight@aculab.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    3a7e02c0
pageblock-flags.h 2.8 KB