#6 [ffff88000e203c90] invalid_op at ffffffff8100a95b
[exception RIP: skb_put+128]
RIP: ffffffff813b68cb RSP: ffff88000e203d40 RFLAGS: 00010282
RAX: 000000000000009a RBX: ffff88013074a510 RCX: 000000000000181f
RDX: 0000000000000000 RSI: 0000000000000082 RDI: 0000000000000246
RBP: ffff88000e203d60 R8: 0000000000000002 R9: 00000000fffffffe
R10: ffff88008e203c5f R11: 0000000000000000 R12: ffff88013058d560
R13: ffff880119428900 R14: 000000000000003e R15: ffff88010725dc00
ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018
#7 [ffff88000e203d68] rtl8192_rx_normal at ffffffffa02d1985
#8 [ffff88000e203e78] rtl8192_irq_rx_tasklet at ffffffffa02d2031
요런식으로 swapper 에서 스택트레이스가 이루어지더라고...
일단 swapper 에서 뻗은것과, rtl 드라이버들을 보고 찾아보기로 했다.
커널쪽 스택트레이스는 net/core/skbuff.c 의 skb_over_panic 에서 떨어졌고,
이것은 skb_put 함수에서 skb->tail 보다 skb->end 가 큰것으로 판단될때
패닉함수를 호출하여 커널패닉을 발생한다.
일단 crash 의 log 를 보면 메모리 부족이 뜬다.
Node 0 Normal: 1114*4kB 32*8kB 15*16kB 1*32kB 0*64kB 0*128kB 0*2
56kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 4984kB
보는바와같이 노멀존 (커널lowmem) 에 32kB 이상의 페이지는
전혀 존재하지 않고, 프리영역은 총 4984 밖에 되지 않는다.
그럼 어디서 메모리 할당 요청이 일어났는지를 좀더 살펴보기로 하면,
[159457.335827] rtl8192se_update_ratr_table: ratr_index=0 ratr_table=0x00000ff5
[159903.776029] swapper: page allocation failure. order:2, mode:0x4020
[159903.776036] Pid: 0, comm: swapper Not tainted 2.6.35.12-88.fc14.x86_64 #1
[159903.776041] Call Trace:
[159903.776044] <IRQ> [<ffffffff810da9d4>] __alloc_pages_nodemask+0x6fe/0x776
[159903.776064] [<ffffffff81108024>] kmalloc_large_node+0x56/0x96
[159903.776070] [<ffffffff8110b914>] __kmalloc_node_track_caller+0x31/0x135
[159903.776077] [<ffffffff813b7783>] ? alloc_skb+0x13/0x15
[159903.776083] [<ffffffff813b76ad>] __alloc_skb+0x7c/0x13f
[159903.776088] [<ffffffff813b7783>] alloc_skb+0x13/0x15
[159903.776093] [<ffffffff813b7ce3>] dev_alloc_skb+0x16/0x2c
[159903.776129] [<ffffffffa02d1a86>] rtl8192_rx_normal+0x2b6/0x450 [r8192se_pci]
[159903.776138] [<ffffffff81039d8f>] ? __wake_up_common+0x4e/0x84
[159903.776155] [<ffffffffa02d2031>] rtl8192_irq_rx_tasklet+0x21/0x70 [r8192se_pci]
요런녀석들이 발견되며 ( 네트워크 드라이버에서 skb 를 할당하려는 동작. )
열심히 메모리 검색을 하다가 다음과같이 skb 를 할당 하지 못하게 된다.
[159903.814317] ==========>can't alloc skb for rx
[159903.814366] swapper: page allocation failure. order:2, mode:0x4020
메모리 리클레임을 하기 시작하는데, 거기까진 좋은데, 중간에 왜 뻗냐??
그건 역시 sk_buff 에 대한 메모리들을 수집하고 재조정 하는 중에
alloc_skb 부분에서 메모리를 할당하고 확보하려는 과정중 ( skb->head 와 data )
skb_put 이 호출되며 tail 과 len 필드를 갱신하였으나
실제 tail 과 end 의 사이즈가 반대로 할당되어
( 사실 skb 영역을 충분히 확보 못했으니 당연할지도 )
커널 패닉이 발생된 것이다...라고 설명할 수 있다.
메모리 리클레임과정에서 버퍼가 잘못 들어갔을 수도 있다는 추측만 할 뿐..
일단 Low 메모리가 부족하면 어떤 일이든 발생 할 수 있으니까...