강좌 & 팁
이것 때문에 가끔 에러가 나고 테스트에서 실패를 한다.
그렇게 큰 메모리를 할당하는 경우는 거의 없지만 그래도 한번씩 이 일이 발생한다.
아래 코드를 보자
101 struct zb_dma_used_mem* zb_dma_node_alloc(void)
102 {
103 return (struct zb_dma_used_mem *)kzalloc(ZB_DMA_MEM_NODE_SIZE, GFP_KERNEL);
104 }
그냥 간단히 메모리 할당하는 함수다
물론 크기는 위에서 결정된다.
#define ZB_DMA_MEM_NODE_SIZE SZ_1M
이것이 실제로는 이렇게 되어 있었다.
#define ZB_DMA_MEM_NODE_SIZE (16384 * sizeof(struct zb_dma_node))
디버깅 코드를 넣다보니 자료구조의 크기가 커졌고 그게 4M 를 넘어 버려다.
물론 16384 역시 더큰 숫자로 커졌고...
약 10만개 정도까지 커지니 메모리 할당 에러가 발생했다. 첨에는 몰랐지만
다시 한번 상기한 것은 커널의 메모리 할당은 최대 크기가 있다.
64비트가 아닌 32비트... 특히 ARM 에서는 주의 하자
MAX_ORDER 로 시작되는 메모리 버디시스템에서 할당 가능은 4M 이다.
물론 아무리 테스트 코드라도 아래와 같이 해주는 것이 당연합니다만...
zb_dma_mem = zb_dma_node_alloc();
if (!zb_dma_mem) {
printk(" ERRORORORORORORO\n");
}