> On Fri, May 04, 2018 at 03:35:33PM +0200, Michal Hocko wrote: > > On Fri 04-05-18 14:52:08, Huaisheng Ye wrote: > > > Suggest using unsigned int instead of int for bit within gfp_zone. > > > @@ -401,7 +401,7 @@ static inline bool gfpflags_allow_blocking(const > gfp_t gfp_flags) > > > static inline enum zone_type gfp_zone(gfp_t flags) > > > { > > > enum zone_type z; > > > - int bit = (__force int) (flags & GFP_ZONEMASK); > > > + unsigned int bit = (__force unsigned int) (flags & GFP_ZONEMASK); > > > > > > z = (GFP_ZONE_TABLE >> (bit * GFP_ZONES_SHIFT)) & > > > ((1 << GFP_ZONES_SHIFT) - 1); > > That reminds me. I wanted to talk about getting rid of GFP_ZONE_TABLE. > Instead, we should encode the zone number in the bottom three bits of > the gfp mask, while preserving the rules that ZONE_NORMAL gets encoded > as zero (so GFP_KERNEL | GFP_HIGHMEM continues to work) and also leaving > __GFP_MOVABLE in bit 3 so that it can continue to be used as a flag. > > So I was thinking ... > > -#define ___GFP_DMA 0x01u > -#define ___GFP_HIGHMEM 0x02u > -#define ___GFP_DMA32 0x04u > +#define ___GFP_ZONE_MASK 0x07u > > #define __GFP_DMA ((__force gfp_t)OPT_ZONE_DMA ^ ZONE_NORMAL) > #define __GFP_HIGHMEM ((__force gfp_t)OPT_ZONE_HIGHMEM ^ > ZONE_NORMAL) > #define __GFP_DMA32 ((__force gfp_t)OPT_ZONE_DMA32 ^ > ZONE_NORMAL) > #define __GFP_MOVABLE ((__force gfp_t)ZONE_MOVABLE ^ ZONE_NORMAL | \ > ___GFP_MOVABLE) > #define GFP_ZONEMASK ((__force gfp_t)___GFP_ZONE_MASK | > ___GFP_MOVABLE) > > Then we can delete GFP_ZONE_TABLE and GFP_ZONE_BAD. > gfp_zone simply becomes: > > static inline enum zone_type gfp_zone(gfp_t flags) > { > return ((__force int)flags & ___GFP_ZONE_MASK) ^ ZONE_NORMAL; > } > > Huaisheng Ye, would you have time to investigate this idea? OK, it is a great pleasure for me, let me think about how it works in detail. Sincerely, Huaisheng, Ye OS Team | Lenovo