Fallback allocation
What is fallback allocation?
- 시스템에 존재하는 페이지는 migrate type이라는 속성을 가지고 있음
- enum migratetype
- 페이지 할당은 어떤 migrate type의 페이지를 할당할지 정해서 시도됨
- 할당을 요청할 페이지의 migrate type은 할당 요청시 전달된 gfp flag에 의해 결정됨
- gfpflags_to_migratetype()
- fastpath 페이지 할당시에 시도한 migrate type에서 할당이 불가할 경우 fallback migrate type으로 시도하는 할당을 의미함
When does fallback allocation begin?
fallback allocation은 페이지 할당자가 지정된 migrate type과 order로 시도한 fastpath 페이지 할당이 실패했을 때 __rmqueue()에서 호출되는 __rmqueue_fallback()에서 시작된다.
enum migratetype - migrate type of page
enum migratetype {
MIGRATE_UNMOVABLE,
MIGRATE_MOVABLE,
MIGRATE_RECLAIMABLE,
MIGRATE_PCPTYPES,
MIGRATE_HIGHATOMIC = MIGRATE_PCPTYPES,
#ifdef CONFIG_CMA
MIGRATE_CMA,
#endif
#ifdef CONFIG_MEMORY_ISOLATION
MIGRATE_ISOLATE,
#endif
MIGRATE_TYPES
};
migrate type은 6개로 이루어져 있음.(MIGRATE_TYPES, MIGRATE_PCPTYPES 제외)
gfpflags_to_migratetype() - get migrate type from gfp flags
#define GFP_MOVABLE_MASK (__GFP_RECLAIMABLE|__GFP_MOVABLE)
#define GFP_MOVABLE_SHIFT 3
static inline int gfpflags_to_migratetype(const gfp_t gfp_flags)
{
VM_WARN_ON((gfp_flags & GFP_MOVABLE_MASK) == GFP_MOVABLE_MASK);
BUILD_BUG_ON((1UL << GFP_MOVABLE_SHIFT) != ___GFP_MOVABLE);
BUILD_BUG_ON((___GFP_MOVABLE >> GFP_MOVABLE_SHIFT) != MIGRATE_MOVABLE);
if (unlikely(page_group_by_mobility_disabled))
return MIGRATE_UNMOVABLE;
return (gfp_flags & GFP_MOVABLE_MASK) >> GFP_MOVABLE_SHIFT;
}
- @gfp_flags로 전달된 gfp flag의 두 비트(reclaimable, movable)의 존재여부를 이용해서 migrate type을 구함.
- nothing -> MIGRATE_UNMOVABLE
- __GFP_RECLAIMABLE -> MIGRATE_RECLAIMABLE
- __GFP_MOVABLE -> MIGRATE_MOVABLE
- __GFP_RECLAIMABLE | __GFP_MOVABLE -> warning
- mobility를 이용한 page group 기능을 사용하기에는 시스템 메모리가 매우 적은 경우에는 gfp flag와 상관없이 무조건 MIGRATE_UNMOVABLE만 사용한다. page_group_by_mobility_disabled 변수는 부팅타임에 true로 설정된다.
- build_all_zonelists()
fallback migrate type list
static int fallbacks[MIGRATE_TYPES][4] = {
[MIGRATE_UNMOVABLE] = { MIGRATE_RECLAIMABLE, MIGRATE_MOVABLE, MIGRATE_TYPES },
[MIGRATE_RECLAIMABLE] = { MIGRATE_UNMOVABLE, MIGRATE_MOVABLE, MIGRATE_TYPES },
[MIGRATE_MOVABLE] = { MIGRATE_RECLAIMABLE, MIGRATE_UNMOVABLE, MIGRATE_TYPES },
#ifdef CONFIG_CMA
[MIGRATE_CMA] = { MIGRATE_TYPES },
#endif
#ifdef CONFIG_MEMORY_ISOLATION
[MIGRATE_ISOLATE] = { MIGRATE_TYPES },
#endif
};
- 해당 배열은 각 migrate type마다 가지고 있는 fallback migrate type list로 구성되어 있음
- list는 MIGRATE_TYPES를 끝으로 가지고 있으며 해당 type은 fallback allocation에 사용되지 않음
'커널 분석' 카테고리의 다른 글
[bottom half] softirq 등록과 처리과정 (0) | 2018.09.08 |
---|