GFP_KERNEL vs GFP_KERNEL_ACCOUNT

커널 코드를 보다보면,

C
kmalloc(size, GFP_KERNEL)
kmalloc(size, GFP_KERNEL_ACCOUNT)

다음과 같이 할당을 받는 코드를 많이 쓰는데 저 둘의 주요한 차이점이 뭘까?

우리의 익스 관전에서 보면 가장 큰 차이는 일단, 캐시가 다르다.

할당이 된뒤 각각을 free하면 서로 다른 캐시에 들어간다.

GFP_KERNEL_ACCOUNT 이 켜져 있으면, 슬랩/kmalloc이 kmalloc-XXX 말고 kmalloc-cg-XXX 같은 “cgroup-accounted” 캐시로 갈 수 있다. 그렇다면, 우리가 커널 heap에 대한 공격을 할때 일반적인 kmalloc-XXX slab 캐시를 사용하니깐 문제가 될 수 있다. 다른 캐시에 free가 되면 우리가 다시 반환받을 수 없으니깐