[포기] Lock debugging: detect incorrect freeing of live locks 옵션
안녕하세요.
malloc 과 free
그리고 각 lock 들의 안정성을 검사하기 위해서
menuconfig 에서 kernel hacking 에 있는
Lock debugging: detect incorrect freeing of live locks
옵션을 켯더니
빌드후 실행시에 modules 쪽에서 kernel panic 이 발생하네요.
-----------------------------------------------------------
[ 5.707189] Unable to handle kernel NULL pointer dereference at virtual address 00000040
[ 5.715211] pgd = c3684000
[ 5.717897] [00000040] *pgd=333e6031, *pte=00000000, *ppte=00000000
[ 5.724138] Internal error: Oops: 17 [#1]
[ 5.728121] Modules linked in: fsr(P+)
[ 5.731852] CPU: 0 Tainted: P (2.6.29.4 #6)
[ 5.737230] PC is at kmem_cache_alloc+0x48/0xac
[ 5.741728] LR is at kmem_cache_alloc+0x30/0xac
[ 5.746236] pc : [] lr : [] psr: 20000093
[ 5.746242] sp : c3677e30 ip : c3677e30 fp : c3677e5c
[ 5.757672] r10: 00000040 r9 : c3676000 r8 : bf002118
[ 5.762872] r7 : 000000d0 r6 : 40000013 r5 : 00000040 r4 : c0476418
[ 5.769371] r3 : 00000000 r2 : 0000063f r1 : 00000000 r0 : c041933d
[ 5.775872] Flags: nzCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment user
[ 5.783064] Control: 10c5387d Table: 33684019 DAC: 00000015
[ 5.788782] Process insmod (pid: 1217, stack limit = 0xc36762e0)
[ 5.794762] Stack: (0xc3677e30 to 0xc3678000)
[ 5.799093] 7e20: 07d40108 00000001 00000000 0000000c
[ 5.807325] 7e40: c05234c0 00000000 00000000 ffffffff c3677ea4 c3677e60 bf002118 c00a9198
[ 5.815557] 7e60: 00000001 00000032 00042000 00000028 e78400ec 383310b4 31323835 090b0c0c
[ 5.823790] 7e80: 00000000 0000000c c05234c0 00000000 c002e0e8 00000000 c3677ec4 c3677ea8
[ 5.832022] 7ea0: bf0582b8 bf002100 c3677ec4 c3672c00 bf0508a0 bf05052c c3677edc c3677ec8
[ 5.840254] 7ec0: bf0581ac bf058218 00000000 bf05052c c3677ef4 c3677ee0 bf0580c8 bf058120
[ 5.848487] 7ee0: 00154711 bf050424 c3677f7c c3677ef8 c002d308 bf05800c 00000000 00000594
[ 5.856719] 7f00: bf058000 00000000 c015db0c c3676000 c3677f44 0000002a e980c2e8 e980bc58
[ 5.864952] 7f20: c032b4fc c048bd0c 40298008 60000013 c032b4fc c048bd0c c3677f6c c3677f48
[ 5.873184] 7f40: c032b494 00154711 bf050424 40298008 00000000 00154711 bf050424 40298008
[ 5.881416] 7f60: 00000000 c002e0e8 c3676000 00000000 c3677fa4 c3677f80 c0078ac8 c002d2b4
[ 5.889649] 7f80: 40298000 00000000 00154711 00000123 00078cd0 00000080 00000000 c3677fa8
[ 5.897881] 7fa0: c002df40 c0078a38 00154711 00000123 40298008 00154711 0007c3d0 00000002
[ 5.906114] 7fc0: 00154711 00000123 00078cd0 00000080 bec54f44 00000033 00000002 00000000
[ 5.914346] 7fe0: bec54cb8 bec54ca8 000114e0 40227ec0 60000010 40298008 3090d021 3090d421
[ 5.922578] Backtrace:
[ 5.925006] [] (kmem_cache_alloc+0x0/0xac) from [] (bml_add_disk+0x24/0x310 [fsr])
[ 5.934278] [] (bml_add_disk+0x0/0x310 [fsr]) from [] (bml_blkdev_init+0xac/0x140 [fsr])
[ 5.944070] [] (bml_blkdev_init+0x0/0x140 [fsr]) from [] (bml_block_init+0x98/0xf8 [fsr])
[ 5.953949] r5:bf05052c r4:bf0508a0
[ 5.957501] [] (bml_block_init+0x0/0xf8 [fsr]) from [] (fsr_init+0xc8/0x114 [fsr])
[ 5.966774] r5:bf05052c r4:00000000
[ 5.970326] [] (fsr_init+0x0/0x114 [fsr]) from [] (__exception_text_end+0x60/0x198)
[ 5.979686] r5:bf050424 r4:00154711
[ 5.983238] [] (__exception_text_end+0x0/0x198) from [] (sys_init_module+0x9c/0x1a4)
[ 5.992684] [] (sys_init_module+0x0/0x1a4) from [] (ret_fast_syscall+0x0/0x2c)
[ 6.001610] r7:00000080 r6:00078cd0 r5:00000123 r4:00154711
[ 6.007242] Code: e594509c e594a0ac e3550000 159430a8 (17953103)
[ 6.013335] ---[ end trace dfabeaae1f6a5b02 ]---
디버깅을 해 보았더니
kmem_cache_alloc
의 첫번째 파라미터인 struct kmem_cache *s 에 size 항목에 0xCXXXXXXX 같이 이상한 값이 들어가 있네요.
[ 5.707189] Unable to handle kernel NULL pointer dereference at virtual address 00000040
여기서 0x40 은 size 로 들어가야 할 값인데 이 값을 pointer 로 접근해서 죽은것으로 보입니다.
저 feature 에 따라서 kmem_cache struct 의 구조가 변하는것 같고 modules 에서 build 시 그 부분에 대한 kernel feature 가 안먹는 것으로 보이는데,
정작 kernel source 를 추적해 보면 kmem_cache struct 에 해당 kerenl feature 관련된 define 은 없네요.
혹시 저 feature 를 사용해 보신분 계신지요?
아니면 저런 문제를 문의할 수 있는 mailing list 가 있을까요?
커널 컴파일 옵션
커널 컴파일 옵션 바꾼 후에 모듈도 새로 빌드하신 것 맞나요? 만약 아니라고 한다면, kmem_cache struct에 해당 feature 관련 코드가 없어도 문제가 발생할 소지는 충분합니다. 예를 들어 해당 feature에 따라 semaphore 같은 구조체 크기가 바뀐다고 하면, 어떤 semaphore 변수의 크기를 커널과 모듈이 서로 다르게 해석하면서 옆에 있던 엉뚱한 kmem_cache struct 변수를 깨버릴 수도 있겠죠.
외부업체에서 사온 so 파일까지 모조리 재 빌드 해야하는군요...
GPL 을 test 용으로 풀어서 적용까지는 성공했으나,
외부업체에서 빌드해서 사온 so 파일들은 도져히 답이 안나오는군요.
솔직히... 이런 생각이 듭니다.
"머 이런 feature 가 다 있어..;;"
그 기능만 그런게
그 기능만 그런게 아니라 데이터 스트럭쳐나 인터페이스가 바뀌는 컨픽 옵션은 다 그렇습니다. 외부업체에서 쉽게 뷜딩할 수 있는 방법을 제공하지 않으면 두고두고 골치 아플 수 있습니다.
예 그러네요.
PL 과 상의해 봤더니 문제가 한두가지가 아니군요.
앞으로 개발하거나 외부업체 계약할때 꼭 신경써야 할 내용이겠네요.
댓글 달기