http://lkml.org/lkml/2008/12/10/344
이 문제는 Lee Schermerhorn에 의해 보고된 문제이다.
shared 속성의 vma를 counting하는 i_mmap_writable가 fork시에 정상적으로 counting이 되지 않고 있는 문제였다. 심지어는 음수로 가기도 한다.
이것은 Hugh가 2.6.7에서 패치하였던 __vma_link_file의 문제였다.
__vma_link_file에서 counting을 해주지 않아 발생하였던 문제이다.
어떻게 이 문제가 이제야 발견되었을까? 문제는 assert와 같은 루틴이 없었다는 것이다.
count가 음수로 가도 시스템이 계속해서 수행되었다는 것이다.
아래는 Lee가 테스트했던 방법이다.
root@dropout(root):memtoy
memtoy pid: 3301
memtoy>file /tmp/zf1
memtoy>map zf1 shared
console:__vma_link_file: vma: ffff8803fdc090b8 - mapping->i_mmap_writable: 0 -> 1
memtoy>child c1
memtoy: child c1 - pid 3302
me: I would have expected to see i_mmap_writable incremented again here, but
me: saw no console output from my instrumentation.
memtoy>unmap zf1 # unmap in parent
console:__remove_shared_vm_struct: vma: ffff8803fdc090b8 - mapping->i_mmap_writable: 1 -> 0
console:__remove_shared_vm_struct: vma: ffff8803fdc090b8 - removed last shared mapping
memtoy>/c1 show
_____address______ ____length____ ____offset____ prot share name
f 0x00007f000ae68000 0x000001000000 0x000000000000 rw- shared /tmp/zf1
me: child still has zf1 mapped
memtoy>/c1 unmap zf1 # unmap in child
console:__remove_shared_vm_struct: vma: ffff8803fe5d3170 - mapping->i_mmap_writable: 0 -> -1
--------
So, the file's i_mmap_writable goes negative. Is this expected?
If I remap the file, whether or not I restart memtoy, I see that it's
i_mmap_writable has remained negative:
-------
memtoy>map zf1 # map private [!shared] - no change in i_mmap_writable
console:__vma_link_file: vma: ffff8805fd0590b8 - mapping->i_mmap_writable: -1 -> -1
memtoy>unmap zf1 # unmap: no change in i_mmap_writable
console:__remove_shared_vm_struct: vma: ffff8805fd0590b8 - mapping->i_mmap_writable: -1 -> -1
memtoy>map zf1 shared # mmap shared, again
console:__vma_link_file: vma: ffff8805fd0590b8 - mapping->i_mmap_writable: -1 -> 0
0 개의 덧글:
Post a Comment