GFP_ATOMIC / __GFP_WAIT 관련 질문드립니다.
일반적으로 여러 커널 서적에서 __GFP_WAIT를 쓰면 선점 당해 휴면 상태로 전환될 수 있는 경우이고, GFP_ATOMIC 같은 경우 휴면이 되지 않아야 되는 인터럽트 처리 루틴이라던지, 후반부 처리 루틴에서 사용한다고 되어 있습니다.
중요한 것은 __GFP_WAIT를 썻을 경우 alloc_pages 내부에서 명시적인 resched() 호출로 재 스케줄링, 선점 유도를 하는 반면에 GFP_ATOMIC은 명시적으로 그런 처리를 안할뿐이라는 점입니다.
kernel 3.x 대에서 alloc_pages 함수를 보면 내가 만약 GFP_ATOMIC을 선언 해서 명시적인 resched() 호출 상황을 피한다고 하더라도, 이게 왜 선점, 휴면을 막는지는 이해가 되지 않습니다. 코드상으로 irq를 disable하거나 preempt를 disable을 해주는 구간이 없습니다. 다시 말해 명시적으로 resched() 호출을 피할뿐이지, 언제든지 타임 슬라이스 소진, irq 발생 등에 의해 선점 당할 수 있는 소지가 분명히 있어 보입니다.
그렇다면 GFP_ATOMIC을 써도 프로세스가 블록 당할 확률이 없다고 말할 수 없고, 즉 선점을 당하면 위험한 상황에서는 자체적으로 preempt를 disable하던지 irq disable을 걸던지 해야된다는 소리인데 이게 맞는 내용인가요? 이럴거면 왜 __GFP_WAIT가 따로 플래그로 존재하는지도 이해가 되질 않아서요...
고수분들 답변좀 해주시면 감사드리겠습니다.
중복 죄송합니다. 저장이 한번 더 눌러져서 중복으로
중복 죄송합니다. 저장이 한번 더 눌러져서 중복으로 올라왔습니다.
댓글 달기