关于内存去的选择:
1 #define __GFP_DMA ((__force gfp_t)0x01u) 2 #define __GFP_HIGHMEM ((__force gfp_t)0x02u) 3 #define __GFP_DMA32 ((__force gfp_t)0x04u) 4 #define __GFP_MOVABLE ((__force gfp_t)0x08u) /* Page is movable */ 5 #define GFP_ZONEMASK (__GFP_DMA|__GFP_HIGHMEM|__GFP_DMA32|__GFP_MOVABLE)
1 #define GFP_ZONE_TABLE ( \ 2 (ZONE_NORMAL << 0 * ZONES_SHIFT) \ 3 | (OPT_ZONE_DMA << __GFP_DMA * ZONES_SHIFT) \ 4 | (OPT_ZONE_HIGHMEM << __GFP_HIGHMEM * ZONES_SHIFT) \ 5 | (OPT_ZONE_DMA32 << __GFP_DMA32 * ZONES_SHIFT) \ 6 | (ZONE_NORMAL << __GFP_MOVABLE * ZONES_SHIFT) \ 7 | (OPT_ZONE_DMA << (__GFP_MOVABLE | __GFP_DMA) * ZONES_SHIFT) \ 8 | (ZONE_MOVABLE << (__GFP_MOVABLE | __GFP_HIGHMEM) * ZONES_SHIFT)\ 9 | (OPT_ZONE_DMA32 << (__GFP_MOVABLE | __GFP_DMA32) * ZONES_SHIFT)\ 10 )
1 static inline enum zone_type gfp_zone(gfp_t flags) 2 { 3 enum zone_type z; 4 int bit = flags & GFP_ZONEMASK; 5 6 z = (GFP_ZONE_TABLE >> (bit * ZONES_SHIFT)) & 7 ((1 << ZONES_SHIFT) - 1); 8 9 if (__builtin_constant_p(bit)) 10 MAYBE_BUILD_BUG_ON((GFP_ZONE_BAD >> bit) & 1); 11 else { 12 #ifdef CONFIG_DEBUG_VM 13 BUG_ON((GFP_ZONE_BAD >> bit) & 1); 14 #endif 15 } 16 return z; 17 }
1 #if MAX_NR_ZONES < 2 2 #define ZONES_SHIFT 0 3 #elif MAX_NR_ZONES <= 2 4 #define ZONES_SHIFT 1 5 #elif MAX_NR_ZONES <= 4 6 #define ZONES_SHIFT 2 7 #else 8 #error ZONES_SHIFT -- too many zones configured adjust calculation 9 #endif
1 #ifdef CONFIG_HIGHMEM 2 #define OPT_ZONE_HIGHMEM ZONE_HIGHMEM 3 #else 4 #define OPT_ZONE_HIGHMEM ZONE_NORMAL 5 #endif 6 7 #ifdef CONFIG_ZONE_DMA 8 #define OPT_ZONE_DMA ZONE_DMA 9 #else 10 #define OPT_ZONE_DMA ZONE_NORMAL 11 #endif 12 13 #ifdef CONFIG_ZONE_DMA32 14 #define OPT_ZONE_DMA32 ZONE_DMA32 15 #else 16 #define OPT_ZONE_DMA32 ZONE_NORMAL 17 #endif
1 enum zone_type { 2 #ifdef CONFIG_ZONE_DMA 3 ZONE_DMA, 4 #endif 5 #ifdef CONFIG_ZONE_DMA32 6 ZONE_DMA32, 7 #endif 8 ZONE_NORMAL, 9 #ifdef CONFIG_HIGHMEM 10 ZONE_HIGHMEM, 11 #endif 12 ZONE_MOVABLE, 13 __MAX_NR_ZONES 14 };