<kernel v5.0>
Compound 페이지
- 버디 시스템에서 order 단위로 free 페이지를 관리하고, 할당 받아 사용하는 페이지들은 order를 제거한 상태에서 사용한다. 그런데 order 단위로 묶어 관리하는 페이지가 있는데 이들을 compound 페이지라고 한다.
- 용도
- 슬랩 캐시
- Huge 페이지
- 일반적인 high order 페이지와 다른 점은 TLB 성능을 극대화하기 위해 설계되었다.
- 성능을 향상시키기 위해 리눅스는 대량의 페이지(high order 페이지)를 할당 받는 경우 PMD 레벨에서 huge 페이지를 사용하여 더 빠른 access를 사용할 수 있게 매핑을 한다.
- HugeTLBFS 및 THP(Transparent Huge Page)에서 사용한다.
- 2015년 12월 kernel v.4.6-rc1 에서 CONFIG_PAGEFLAGS_EXTENDED 옵션과 PG_compound, PG_tail 이 없어지고 PG_head 만 남겨지게 되었다.
prep_compound_page()
/mm/page_alloc.c
void prep_compound_page(struct page *page, unsigned long order) { int i; int nr_pages = 1 << order; set_compound_page_dtor(page, COMPOUND_PAGE_DTOR); set_compound_order(page, order); __SetPageHead(page); for (i = 1; i < nr_pages; i++) { struct page *p = page + i; set_page_count(p, 0); p->mapping = TAIL_MAPPING; set_compound_head(p, page); } }
compound 페이지를 준비한다.
- 코드 라인 6에서 compound 파괴자 id에 COMPOUND_PAGE_DTOR를 대입한다.
- 파괴자 id는 다음과 같다.
- NULL_COMPOUND_DTOR
- COMPOUND_PAGE_DTOR
- HUGETLB_PAGE_DTOR
- TRANSHUGE_PAGE_DTOR
- 파괴자 id는 다음과 같다.
- 코드 라인 7에서 두 번째 페이지에 order를 설정한다.
- 코드 라인 8에서 헤더 페이지의 플래그에 PG_Head 비트를 설정한다.
- 코드 라인 9~14에서 나머지 페이지의 참조 카운터에 0을 대입하고, 나머지 페이지들이 헤드 페이지를 가리키게 한 후 플래그에 PG_Tail 비트를 설정한다.
다음 그림은 prep_compound_page() 함수에 의해 compound 페이지가 준비되는 모습을 보여준다.
- 두 번째 페이지에 compound 정보가 존재한다.
page_count()
include/linux/mm.h
static inline int page_count(struct page *page) { return atomic_read(&compound_head(page)->_count); }
요청 페이지의 _count 값을 알아온다. 만일 compound page인 경우 선두 페이지에서 _count 값을 알아온다.
compound_order()
include/linux/mm.h
static inline int compound_order(struct page *page) { if (!PageHead(page)) return 0; return page[1].compound_order; }
compound 페이지이면 compound_order를 알아오고 compound 페이지가 아닌 경우 0 order를 반환한다
- 첫 번째 페이지의 Head 플래그가 설정된 경우 compound 페이지를 의미한다.
- 두 번째 페이지 구조체에서 compound_order를 알아온다.
다음 그림은 compound 페이지로부터 order 값을 알아오는 과정을 보여준다.
사용 용도의 Huge page에서 Transparent Hugepage가 아닌 HugeTLB가 맞나요? 아
안녕하세요?
HugeTLBFS 및 THP(Transparent Huge Page) 둘 다 compound 페이지로 구성합니다.
본문도 추가하였습니다.
감사합니다.